1
0
Fork 0
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:
vrana 2013-01-09 13:00:45 -08:00
parent 38e2e1336f
commit 35de4a5d1f

View file

@ -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;
}
}