1
0
Fork 0
mirror of https://we.phorge.it/source/arcanist.git synced 2024-11-26 00:32:41 +01:00

Change hg arc diff to detect up to the nearest parent with a diff

Summary:
Changes arc diff to choose the base commit as the first ancestor
that has a diff.  So if your tree looks like master->A->B->C->D, if you
have a diff on B (which will include A), when you run arc diff on D it will
only include C and D.

This makes the scenario for stacked diffs nicer.  A user can commit A, commit B,
arc diff, commit C, commit D, arc diff, arc land B, arc land D.

Test Plan:
Commit A on top of master
Commit B on top of A
arc diff
Commit C on top of B
Commit D on top of C
arc diff

Verify the second diff contains the changes in C and D, but not A and B.

hg up B
arc land --preview
Verify that arc land shows A and B

hg up D
arc land --preview
Verify that arc land shows A, B, C, and D
(arc land should be unaffected by this change.
It always tries to land the entire branch)

Reviewers: epriestley

Reviewed By: epriestley

CC: aran, Korvin

Differential Revision: https://secure.phabricator.com/D5639
This commit is contained in:
durham 2013-04-12 14:11:51 -07:00
parent b1fe436cfc
commit f5c8430188
2 changed files with 31 additions and 1 deletions

View file

@ -165,6 +165,8 @@ final class ArcanistBaseCommitParser {
} else { } else {
return null; return null;
} }
} else if (preg_match('/^nodiff\((.*)\)$/', $name, $matches)) {
return $this->api->resolveBaseCommitRule($rule, $source);
} }
throw new ArcanistUsageException( throw new ArcanistUsageException(

View file

@ -832,7 +832,35 @@ final class ArcanistMercurialAPI extends ArcanistRepositoryAPI {
"you specified '{$rule}' in your {$source} 'base' ". "you specified '{$rule}' in your {$source} 'base' ".
"configuration."); "configuration.");
return $this->getCanonicalRevisionName('.^'); return $this->getCanonicalRevisionName('.^');
} default:
if (preg_match('/^nodiff\((.+)\)$/', $name, $matches)) {
list($results) = $this->execxLocal(
'log --template %s --rev %s',
'{node}\1{desc}\2',
sprintf('ancestor(.,%s)::.^', $matches[1]));
$results = array_reverse(explode("\2", trim($results)));
foreach ($results as $result) {
if (empty($result)) {
continue;
}
list($node, $desc) = explode("\1", $result, 2);
$message = ArcanistDifferentialCommitMessage::newFromRawCorpus(
$desc);
if ($message->getRevisionID()) {
$this->setBaseCommitExplanation(
"it is the first ancestor of . that has a diff ".
"and is the gca or a descendant of the gca with ".
"'{$matches[1]}', specified by '{$rule}' in your ".
"{$source} 'base' configuration.");
return $node;
}
}
}
break;
}
break; break;
default: default:
return null; return null;