1
0
Fork 0
mirror of https://we.phorge.it/source/arcanist.git synced 2024-11-22 14:52:40 +01:00

Set relative commit early in "arc diff"

Summary:
In Mercurial, we figure out if the working copy is dirty with "hg diff", and do a somewhat expensive merge-base / outgoing operation if the relative commit isn't set. We can set the relative commit earlier and avoid some extra work.

We also may incorrectly cache this state (diff from merge-base of outgoing to tip) and pass the wrong rev and file dirty list to the linters.

Test Plan: Made commits which changed (A, B) and then (A). Ran "arc diff tip^". Before this change, observed full outgoing + merge base resolve and both "A" and "B" passed to lint. Observed execution of fewer commands and lint executing against "A" only after this change.

Reviewers: Makinde, btrahan

Reviewed By: Makinde

CC: aran, epriestley

Differential Revision: https://secure.phabricator.com/D1998
This commit is contained in:
epriestley 2012-03-22 17:22:52 -07:00
parent 87308eb34e
commit 3bff9417e9
2 changed files with 20 additions and 5 deletions

View file

@ -84,6 +84,8 @@ final class ArcanistMercurialAPI extends ArcanistRepositoryAPI {
} }
$this->relativeCommit = $commit; $this->relativeCommit = $commit;
$this->dropCaches();
return $this; return $this;
} }
@ -463,9 +465,7 @@ final class ArcanistMercurialAPI extends ArcanistRepositoryAPI {
} }
private function getDiffToRevision() { private function getDiffToRevision() {
$this->dropCaches();
// Clear status cache since it's now bogus.
$this->status = null;
if ($this->includeDirectoryStateInDiffs) { if ($this->includeDirectoryStateInDiffs) {
// This is a magic Mercurial revision name which means "current // This is a magic Mercurial revision name which means "current
@ -476,4 +476,9 @@ final class ArcanistMercurialAPI extends ArcanistRepositoryAPI {
} }
} }
private function dropCaches() {
$this->status = null;
$this->localCommitInfo = null;
}
} }

View file

@ -497,6 +497,18 @@ EOTEXT
if ($this->getArgument('less-context')) { if ($this->getArgument('less-context')) {
$repository_api->setDiffLinesOfContext(3); $repository_api->setDiffLinesOfContext(3);
} }
if ($repository_api->supportsRelativeLocalCommits()) {
// Parse the relative commit as soon as we can, to avoid generating
// caches we need to drop later and expensive discovery operations
// (particularly in Mercurial).
$relative = $this->getArgument('paths');
if ($relative) {
$repository_api->parseRelativeLocalCommit($relative);
}
}
} }
$output_json = $this->getArgument('json'); $output_json = $this->getArgument('json');
@ -622,8 +634,6 @@ EOTEXT
} }
} else if ($repository_api->supportsRelativeLocalCommits()) { } else if ($repository_api->supportsRelativeLocalCommits()) {
$repository_api->parseRelativeLocalCommit(
$this->getArgument('paths', array()));
$paths = $repository_api->getWorkingCopyStatus(); $paths = $repository_api->getWorkingCopyStatus();
} else { } else {
throw new Exception("Unknown VCS!"); throw new Exception("Unknown VCS!");