diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 2279b6cf..72890ccd 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -21,6 +21,7 @@ phutil_register_library_map(array( 'ArcanistChooseInvalidRevisionException' => 'exception', 'ArcanistChooseNoRevisionsException' => 'exception', 'ArcanistCommitWorkflow' => 'workflow/commit', + 'ArcanistConduitLinter' => 'lint/linter/conduit', 'ArcanistConfiguration' => 'configuration', 'ArcanistCoverWorkflow' => 'workflow/cover', 'ArcanistDiffChange' => 'parser/diff/change', @@ -119,6 +120,7 @@ phutil_register_library_map(array( 'ArcanistBundleTestCase' => 'ArcanistPhutilTestCase', 'ArcanistCallConduitWorkflow' => 'ArcanistBaseWorkflow', 'ArcanistCommitWorkflow' => 'ArcanistBaseWorkflow', + 'ArcanistConduitLinter' => 'ArcanistLinter', 'ArcanistCoverWorkflow' => 'ArcanistBaseWorkflow', 'ArcanistDiffParserTestCase' => 'ArcanistPhutilTestCase', 'ArcanistDiffUtilsTestCase' => 'ArcanistPhutilTestCase', diff --git a/src/lint/linter/conduit/ArcanistConduitLinter.php b/src/lint/linter/conduit/ArcanistConduitLinter.php new file mode 100644 index 00000000..97d1eaf2 --- /dev/null +++ b/src/lint/linter/conduit/ArcanistConduitLinter.php @@ -0,0 +1,110 @@ + must match passed in path. + * 'line' + * 'char' + * 'code' + * 'severity' => Must match a constant in ArcanistLintSeverity. + * 'name' + * 'description' + * 'original' & 'replacement' => optional patch information + * + * This class is intended for customization via instantiation, not via + * subclassing. + */ +class ArcanistConduitLinter extends ArcanistLinter { + const CONDUIT_METHOD = 'lint.getalllint'; + + private $conduitURI; + private $linterName; + private $lintByPath; // array(/pa/th/ => ), valid after willLintPaths(). + + public function __construct($conduit_uri, $linter_name) { + $this->conduitURI = $conduit_uri; + $this->linterName = $linter_name; + } + + public function willLintPaths(array $paths) { + // Load all file path data into $this->data. + array_map(array($this, 'getData'), $paths); + + $conduit = new ConduitClient($this->conduitURI); + + $this->lintByPath = $conduit->callMethodSynchronous( + self::CONDUIT_METHOD, + array( + 'file_contents' => $this->data, + ) + ); + } + + public function lintPath($path) { + $lint_for_path = idx($this->lintByPath, $path); + if (!$lint_for_path) { + return; + } + + foreach ($lint_for_path as $lint) { + $this->addLintMessage(ArcanistLintMessage::newFromDictionary($lint)); + } + } + + public function getLinterName() { + return $this->linterName; + } + + public function getLintSeverityMap() { + // The rationale here is that this class will only be used for custom + // linting in installations. No two server endpoints will be the same across + // different instantiations. Therefore, the server can handle all severity + // customization directly. + throw new ArcanistUsageException( + 'ArcanistConduitLinter does not support client-side severity '. + 'customization.' + ); + } + + public function getLintNameMap() { + // See getLintSeverityMap for rationale. + throw new ArcanistUsageException( + 'ArcanistConduitLinter does not support a name map.' + ); + } +} diff --git a/src/lint/linter/conduit/__init__.php b/src/lint/linter/conduit/__init__.php new file mode 100644 index 00000000..6c491881 --- /dev/null +++ b/src/lint/linter/conduit/__init__.php @@ -0,0 +1,17 @@ +