mirror of
https://we.phorge.it/source/arcanist.git
synced 2024-11-21 22:32:41 +01:00
Parallelize calls for ArcanistGitAPI::getWorkingCopyStatus
Summary: executes the calls to git in parallel to improve startup performance of arc lint and possibly other commands Gets about a 2~3x speedup when repo is in buffer cache, with 4 cores. Test Plan: arc linted a repo with unstaged, untracked, staged, and committed changes, see that the same files were linted. Reviewed By: jungejason Reviewers: jungejason, epriestley Commenters: epriestley CC: aran, jungejason, epriestley Differential Revision: 594
This commit is contained in:
parent
2aa853f85c
commit
88c4e69802
2 changed files with 36 additions and 14 deletions
|
@ -183,17 +183,47 @@ class ArcanistGitAPI extends ArcanistRepositoryAPI {
|
|||
|
||||
$options = $this->getDiffBaseOptions();
|
||||
|
||||
// -- parallelize these slow cpu bound git calls.
|
||||
|
||||
// Find committed changes.
|
||||
list($stdout) = execx(
|
||||
$committed_future = new ExecFuture(
|
||||
"(cd %s; git diff {$options} --raw %s --)",
|
||||
$this->getPath(),
|
||||
$this->getRelativeCommit());
|
||||
$files = $this->parseGitStatus($stdout);
|
||||
|
||||
// Find uncommitted changes.
|
||||
list($stdout) = execx(
|
||||
$uncommitted_future = new ExecFuture(
|
||||
"(cd %s; git diff {$options} --raw HEAD --)",
|
||||
$this->getPath());
|
||||
|
||||
// Untracked files
|
||||
$untracked_future = new ExecFuture(
|
||||
'(cd %s; git ls-files --others --exclude-standard)',
|
||||
$this->getPath());
|
||||
|
||||
// TODO: This doesn't list unstaged adds. It's not clear how to get that
|
||||
// list other than "git status --porcelain" and then parsing it. :/
|
||||
|
||||
// Unstaged changes
|
||||
$unstaged_future = new ExecFuture(
|
||||
'(cd %s; git ls-files -m)',
|
||||
$this->getPath());
|
||||
|
||||
$futures = array(
|
||||
$committed_future,
|
||||
$uncommitted_future,
|
||||
$untracked_future,
|
||||
$unstaged_future
|
||||
);
|
||||
Futures($futures)->resolveAll();
|
||||
|
||||
|
||||
// -- read back and process the results
|
||||
|
||||
list($stdout, $stderr) = $committed_future->resolvex();
|
||||
$files = $this->parseGitStatus($stdout);
|
||||
|
||||
list($stdout, $stderr) = $uncommitted_future->resolvex();
|
||||
$uncommitted_files = $this->parseGitStatus($stdout);
|
||||
foreach ($uncommitted_files as $path => $mask) {
|
||||
$mask |= self::FLAG_UNCOMMITTED;
|
||||
|
@ -203,10 +233,7 @@ class ArcanistGitAPI extends ArcanistRepositoryAPI {
|
|||
$files[$path] |= $mask;
|
||||
}
|
||||
|
||||
// Find untracked files.
|
||||
list($stdout) = execx(
|
||||
'(cd %s; git ls-files --others --exclude-standard)',
|
||||
$this->getPath());
|
||||
list($stdout, $stderr) = $untracked_future->resolvex();
|
||||
$stdout = rtrim($stdout, "\n");
|
||||
if (strlen($stdout)) {
|
||||
$stdout = explode("\n", $stdout);
|
||||
|
@ -215,13 +242,7 @@ class ArcanistGitAPI extends ArcanistRepositoryAPI {
|
|||
}
|
||||
}
|
||||
|
||||
// TODO: This doesn't list unstaged adds. It's not clear how to get that
|
||||
// list other than "git status --porcelain" and then parsing it. :/
|
||||
|
||||
// Find unstaged changes.
|
||||
list($stdout) = execx(
|
||||
'(cd %s; git ls-files -m)',
|
||||
$this->getPath());
|
||||
list($stdout, $stderr) = $unstaged_future->resolvex();
|
||||
$stdout = rtrim($stdout, "\n");
|
||||
if (strlen($stdout)) {
|
||||
$stdout = explode("\n", $stdout);
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
phutil_require_module('arcanist', 'repository/api/base');
|
||||
|
||||
phutil_require_module('phutil', 'future');
|
||||
phutil_require_module('phutil', 'future/exec');
|
||||
phutil_require_module('phutil', 'utils');
|
||||
|
||||
|
|
Loading…
Reference in a new issue