mirror of
https://we.phorge.it/source/arcanist.git
synced 2025-02-02 09:58:23 +01:00
Improve performance of mercurial arc diff
Summary: arc diff on large mercurial repos was taking 14 seconds just to get to the commit message prompt. With these optimizations it takes 4. - "ancestor(.) - ancestor(XYZ)" is expensive because it has to build the entire 400000+ revision history for both. "XYZ::. - XYZ" is much cheaper because it only looks at the revisions between XYZ and the working directory. - "hg outgoing" has to talk to the server, which is slow. "hg log -r draft()" gives us the same information and is much cheaper. We fall back to 'outgoing' on older versions of mercurial. Of the remaining 4 seconds, 2.5 are spent in 'hg status', which is a bit harder improve. Test Plan: Ran arc diff on our hg repo. Verified it ran faster and the diff was created. Reviewers: epriestley, sid0, bos, dschleimer Reviewed By: epriestley CC: aran, Korvin, tido Differential Revision: https://secure.phabricator.com/D4838
This commit is contained in:
parent
7f9c286338
commit
db053e1eb7
1 changed files with 17 additions and 6 deletions
|
@ -106,9 +106,20 @@ final class ArcanistMercurialAPI extends ArcanistRepositoryAPI {
|
||||||
return $base;
|
return $base;
|
||||||
}
|
}
|
||||||
|
|
||||||
list($err, $stdout) = $this->execManualLocal(
|
// Mercurial 2.1 and up have phases which indicate if something is
|
||||||
'outgoing --branch %s --style default',
|
// published or not. To find which revs are outgoing, it's much
|
||||||
|
// faster to check the phase instead of actually checking the server.
|
||||||
|
list($err) = $this->execManualLocal('help phase');
|
||||||
|
if (!$err) {
|
||||||
|
list($err, $stdout) = $this->execManualLocal(
|
||||||
|
'log --branch %s -r %s --style default',
|
||||||
|
$this->getBranchName(),
|
||||||
|
'draft()');
|
||||||
|
} else {
|
||||||
|
list($err, $stdout) = $this->execManualLocal(
|
||||||
|
'outgoing --branch %s --style default',
|
||||||
$this->getBranchName());
|
$this->getBranchName());
|
||||||
|
}
|
||||||
|
|
||||||
if (!$err) {
|
if (!$err) {
|
||||||
$logs = ArcanistMercurialParser::parseMercurialLog($stdout);
|
$logs = ArcanistMercurialParser::parseMercurialLog($stdout);
|
||||||
|
@ -175,13 +186,12 @@ final class ArcanistMercurialAPI extends ArcanistRepositoryAPI {
|
||||||
|
|
||||||
public function getLocalCommitInformation() {
|
public function getLocalCommitInformation() {
|
||||||
if ($this->localCommitInfo === null) {
|
if ($this->localCommitInfo === null) {
|
||||||
|
$base_commit = $this->getBaseCommit();
|
||||||
list($info) = $this->execxLocal(
|
list($info) = $this->execxLocal(
|
||||||
"log --template '%C' --rev %s --branch %s --",
|
"log --template '%C' --rev %s --branch %s --",
|
||||||
"{node}\1{rev}\1{author|emailuser}\1{author|email}\1".
|
"{node}\1{rev}\1{author|emailuser}\1{author|email}\1".
|
||||||
"{date|rfc822date}\1{branch}\1{tag}\1{parents}\1{desc}\2",
|
"{date|rfc822date}\1{branch}\1{tag}\1{parents}\1{desc}\2",
|
||||||
hgsprintf(
|
hgsprintf('(%s::. - %s)', $base_commit, $base_commit),
|
||||||
'(ancestors(.) - ancestors(%s))',
|
|
||||||
$this->getBaseCommit()),
|
|
||||||
$this->getBranchName());
|
$this->getBranchName());
|
||||||
$logs = array_filter(explode("\2", $info));
|
$logs = array_filter(explode("\2", $info));
|
||||||
|
|
||||||
|
@ -493,9 +503,10 @@ final class ArcanistMercurialAPI extends ArcanistRepositoryAPI {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getCommitMessageLog() {
|
public function getCommitMessageLog() {
|
||||||
|
$base_commit = $this->getBaseCommit();
|
||||||
list($stdout) = $this->execxLocal(
|
list($stdout) = $this->execxLocal(
|
||||||
"log --template '{node}\\2{desc}\\1' --rev %s --branch %s --",
|
"log --template '{node}\\2{desc}\\1' --rev %s --branch %s --",
|
||||||
'ancestors(.) - ancestors('.$this->getBaseCommit().')',
|
hgsprintf('(%s::. - %s)', $base_commit, $base_commit),
|
||||||
$this->getBranchName());
|
$this->getBranchName());
|
||||||
|
|
||||||
$map = array();
|
$map = array();
|
||||||
|
|
Loading…
Add table
Reference in a new issue