Permalink
Browse files

Allow 'arc diff .^' for hg repos

Summary:
Previously arc diff for hg only allowed bookmark names, rev numbers,
and commit hashes as the input base commit. This was because it escaped all
inputs and treated them as raw identifiers.

This change makes it treat the input as a revset if the escaped version fails.
This allows users to do things like "arc diff .^" when they only want to diff
the top commit.

Test Plan:
Created a stack of commits, master->A->B.
hg up B
arc diff .^
Verified the diff message only showed B as part of the diff.

arc diff .^~
Verified an error occurred ("Commit '.^~' is not a valid Mercurial commit id.")

Reviewers: epriestley

Reviewed By: epriestley

CC: aran, Korvin

Maniphest Tasks: T2888

Differential Revision: https://secure.phabricator.com/D5638
  • Loading branch information...
1 parent cf76d2f commit 7c220175623b76175e214c8a17dbbe0387f78c77 @DurhamG DurhamG committed Apr 10, 2013
Showing with 20 additions and 7 deletions.
  1. +20 −7 src/repository/api/ArcanistMercurialAPI.php
@@ -96,9 +96,15 @@ protected function buildBaseCommit($symbolic_commit) {
$commit = $this->getCanonicalRevisionName(
hgsprintf('ancestor(%s,.)', $symbolic_commit));
} catch (Exception $ex) {
- throw new ArcanistUsageException(
- "Commit '{$symbolic_commit}' is not a valid Mercurial commit ".
- "identifier.");
+ // Try it as a revset instead of a commit id
+ try {
+ $commit = $this->getCanonicalRevisionName(
+ hgsprintf('ancestor(%R,.)', $symbolic_commit));
+ } catch (Exception $ex) {
+ throw new ArcanistUsageException(
+ "Commit '{$symbolic_commit}' is not a valid Mercurial commit ".
+ "identifier.");
+ }
}
$this->setBaseCommitExplanation("it is the greatest common ancestor of ".
@@ -752,14 +758,21 @@ public function resolveBaseCommitRule($rule, $source) {
return trim($merge_base);
}
} else {
- list($err) = $this->execManualLocal(
- 'id -r %s',
- $name);
+ list($err, $commit) = $this->execManualLocal(
+ 'log --template {node} --rev %s',
+ hgsprintf('%s', $name));
+
+ if ($err) {
+ list($err, $commit) = $this->execManualLocal(
+ 'log --template {node} --rev %s',
+ $name);
+ }
+
if (!$err) {
$this->setBaseCommitExplanation(
"it is specified by '{$rule}' in your {$source} 'base' ".
"configuration.");
- return $name;
+ return trim($commit);
}
}
break;

0 comments on commit 7c22017

Please sign in to comment.