mirror of
https://we.phorge.it/source/arcanist.git
synced 2024-12-23 14:00:55 +01:00
Run all willLintPaths() before any lintPath()
Summary: FB runs some linters on background and it's a magnificent hack using `ParallelLinter` (two instances), `BackgroundLinter` and `FutureLinter`. I want to simplify this by resolving the futures in engine instead of in some virtual linter. It also seems like a better place to do it. It should also fix caching problems I have with them (because the virtual linters don't know about the cache at all). Test Plan: None yet. Reviewers: epriestley, nh Reviewed By: epriestley CC: aran, Korvin Differential Revision: https://secure.phabricator.com/D4380
This commit is contained in:
parent
38e2e1336f
commit
35de4a5d1f
1 changed files with 35 additions and 30 deletions
|
@ -164,7 +164,6 @@ abstract class ArcanistLintEngine {
|
|||
}
|
||||
|
||||
public function run() {
|
||||
$stopped = array();
|
||||
$linters = $this->buildLinters();
|
||||
|
||||
if (!$linters) {
|
||||
|
@ -189,40 +188,46 @@ abstract class ArcanistLintEngine {
|
|||
}
|
||||
$this->cacheVersion = crc32(implode("\n", $versions));
|
||||
|
||||
$linters_paths = array();
|
||||
foreach ($linters as $linter_name => $linter) {
|
||||
$linter->setEngine($this);
|
||||
if (!$linter->canRun()) {
|
||||
continue;
|
||||
}
|
||||
$paths = $linter->getPaths();
|
||||
|
||||
$cache_granularity = $linter->getCacheGranularity();
|
||||
|
||||
foreach ($paths as $key => $path) {
|
||||
// Make sure each path has a result generated, even if it is empty
|
||||
// (i.e., the file has no lint messages).
|
||||
$result = $this->getResultForPath($path);
|
||||
if (isset($this->cachedResults[$path][$this->cacheVersion])) {
|
||||
if ($cache_granularity == ArcanistLinter::GRANULARITY_FILE) {
|
||||
unset($paths[$key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
$paths = array_values($paths);
|
||||
$linters_paths[$linter_name] = $paths;
|
||||
|
||||
if ($paths) {
|
||||
$linter->willLintPaths($paths);
|
||||
}
|
||||
}
|
||||
|
||||
$stopped = array();
|
||||
$exceptions = array();
|
||||
foreach ($linters as $linter_name => $linter) {
|
||||
try {
|
||||
$linter->setEngine($this);
|
||||
if (!$linter->canRun()) {
|
||||
continue;
|
||||
}
|
||||
$paths = $linter->getPaths();
|
||||
|
||||
$cache_granularity = $linter->getCacheGranularity();
|
||||
|
||||
foreach ($paths as $key => $path) {
|
||||
// Make sure each path has a result generated, even if it is empty
|
||||
// (i.e., the file has no lint messages).
|
||||
$result = $this->getResultForPath($path);
|
||||
foreach ($linters_paths[$linter_name] as $path) {
|
||||
if (isset($stopped[$path])) {
|
||||
unset($paths[$key]);
|
||||
continue;
|
||||
}
|
||||
if (isset($this->cachedResults[$path][$this->cacheVersion])) {
|
||||
if ($cache_granularity == ArcanistLinter::GRANULARITY_FILE) {
|
||||
unset($paths[$key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
$paths = array_values($paths);
|
||||
|
||||
if ($paths) {
|
||||
$linter->willLintPaths($paths);
|
||||
foreach ($paths as $path) {
|
||||
$linter->willLintPath($path);
|
||||
$linter->lintPath($path);
|
||||
if ($linter->didStopAllLinters()) {
|
||||
$stopped[$path] = true;
|
||||
}
|
||||
$linter->willLintPath($path);
|
||||
$linter->lintPath($path);
|
||||
if ($linter->didStopAllLinters()) {
|
||||
$stopped[$path] = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue