diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -86,6 +86,8 @@ 'ArcanistGoLintLinterTestCase' => 'lint/linter/__tests__/ArcanistGoLintLinterTestCase.php', 'ArcanistGoTestResultParser' => 'unit/parser/ArcanistGoTestResultParser.php', 'ArcanistGoTestResultParserTestCase' => 'unit/parser/__tests__/ArcanistGoTestResultParserTestCase.php', + 'ArcanistGoVetLinter' => 'lint/linter/ArcanistGoVetLinter.php', + 'ArcanistGoVetLinterTestCase' => 'lint/linter/__tests__/ArcanistGoVetLinterTestCase.php', 'ArcanistHLintLinter' => 'lint/linter/ArcanistHLintLinter.php', 'ArcanistHLintLinterTestCase' => 'lint/linter/__tests__/ArcanistHLintLinterTestCase.php', 'ArcanistHelpWorkflow' => 'workflow/ArcanistHelpWorkflow.php', @@ -279,6 +281,8 @@ 'ArcanistGoLintLinterTestCase' => 'ArcanistExternalLinterTestCase', 'ArcanistGoTestResultParser' => 'ArcanistTestResultParser', 'ArcanistGoTestResultParserTestCase' => 'ArcanistTestCase', + 'ArcanistGoVetLinter' => 'ArcanistExternalLinter', + 'ArcanistGoVetLinterTestCase' => 'ArcanistExternalLinterTestCase', 'ArcanistHLintLinter' => 'ArcanistExternalLinter', 'ArcanistHLintLinterTestCase' => 'ArcanistExternalLinterTestCase', 'ArcanistHelpWorkflow' => 'ArcanistWorkflow', diff --git a/src/lint/linter/ArcanistGoVetLinter.php b/src/lint/linter/ArcanistGoVetLinter.php new file mode 100644 --- /dev/null +++ b/src/lint/linter/ArcanistGoVetLinter.php @@ -0,0 +1,93 @@ +getInstallInstructions()))); + } + } + + return $binary; + } + + public function getInstallInstructions() { + return pht( + 'Install Go vet using `%s`.', + 'go get golang.org/x/tools/cmd/vet'); + } + + protected function getMandatoryFlags() { + return array('tool', 'vet'); + } + + public function getVersion() { + list($stdout) = execx('%C version', $this->getExecutableCommand()); + + $pattern = '/^go version go(?P\d+\.\d+\.\d+).*$/'; + $matches = array(); + if (preg_match($pattern, $stdout, $matches)) { + return $matches['version']; + } else { + return false; + } + } + + protected function parseLinterOutput($path, $err, $stdout, $stderr) { + $lines = phutil_split_lines($stderr, false); + + $messages = array(); + foreach ($lines as $line) { + $matches = explode(':', $line, 3); + + if (count($matches) === 3) { + $message = new ArcanistLintMessage(); + $message->setPath($path); + $message->setLine($matches[1]); + $message->setCode($this->getLinterName()); + $message->setDescription(ucfirst(trim($matches[2]))); + $message->setSeverity(ArcanistLintSeverity::SEVERITY_WARNING); + + $messages[] = $message; + } + } + + return $messages; + } + +} diff --git a/src/lint/linter/__tests__/ArcanistGoVetLinterTestCase.php b/src/lint/linter/__tests__/ArcanistGoVetLinterTestCase.php new file mode 100644 --- /dev/null +++ b/src/lint/linter/__tests__/ArcanistGoVetLinterTestCase.php @@ -0,0 +1,9 @@ +executeTestsInDirectory(dirname(__FILE__).'/govet/'); + } + +} diff --git a/src/lint/linter/__tests__/ArcanistLinterTestCase.php b/src/lint/linter/__tests__/ArcanistLinterTestCase.php --- a/src/lint/linter/__tests__/ArcanistLinterTestCase.php +++ b/src/lint/linter/__tests__/ArcanistLinterTestCase.php @@ -80,6 +80,7 @@ 'path' => 'optional string', 'mode' => 'optional string', 'stopped' => 'optional bool', + 'file_extension' => 'optional string', )); $exception = null; @@ -89,7 +90,11 @@ $caught_exception = false; try { + $file_extension = idx($config, 'file_extension', ''); $tmp = new TempFile($basename); + if (!empty($file_extension)) { + $tmp .= '.'.$file_extension; + } Filesystem::writeFile($tmp, $data); $full_path = (string)$tmp; diff --git a/src/lint/linter/__tests__/govet/fmt.lint-test b/src/lint/linter/__tests__/govet/fmt.lint-test new file mode 100644 --- /dev/null +++ b/src/lint/linter/__tests__/govet/fmt.lint-test @@ -0,0 +1,12 @@ +package main + +import "fmt" + +func main() { + fmt.Println("%d", 1) +} +~~~~~~~~~~ +warning:6: +~~~~~~~~~~ +~~~~~~~~~~ +{"file_extension": "go"}