From 454a7de87ecdc529afb2062adf381043acd0b7a6 Mon Sep 17 00:00:00 2001 From: Edward Speyer Date: Fri, 9 Mar 2012 14:40:47 -0800 Subject: [PATCH] ArcanistRepositoryAPI: add getCanonicalRevisionName Summary: Resolves crazy stuff like 'HEAD' or '{2001-01-01T01:01:01}' into an actual revision, with a provided implementation for git. Test Plan: Tested in a hacky script. Reviewers: epriestley Reviewed By: epriestley CC: aran, epriestley Differential Revision: https://secure.phabricator.com/D1849 --- .../api/base/ArcanistRepositoryAPI.php | 1 + src/repository/api/git/ArcanistGitAPI.php | 28 +++++++------------ .../api/mercurial/ArcanistMercurialAPI.php | 4 +++ src/repository/api/mercurial/__init__.php | 1 + .../api/subversion/ArcanistSubversionAPI.php | 4 +++ src/repository/api/subversion/__init__.php | 1 + 6 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/repository/api/base/ArcanistRepositoryAPI.php b/src/repository/api/base/ArcanistRepositoryAPI.php index 0dd4316c..534b2408 100644 --- a/src/repository/api/base/ArcanistRepositoryAPI.php +++ b/src/repository/api/base/ArcanistRepositoryAPI.php @@ -157,6 +157,7 @@ abstract class ArcanistRepositoryAPI { abstract public function getCurrentFileData($path); abstract public function getLocalCommitInformation(); abstract public function getSourceControlBaseRevision(); + abstract public function getCanonicalRevisionName($string); abstract public function supportsRelativeLocalCommits(); abstract public function getWorkingCopyRevision(); abstract public function loadWorkingCopyDifferentialRevisions( diff --git a/src/repository/api/git/ArcanistGitAPI.php b/src/repository/api/git/ArcanistGitAPI.php index 1adcfef3..0b8fb562 100644 --- a/src/repository/api/git/ArcanistGitAPI.php +++ b/src/repository/api/git/ArcanistGitAPI.php @@ -223,20 +223,10 @@ final class ArcanistGitAPI extends ArcanistRepositoryAPI { return rtrim($stdout, "\n"); } - /** - * Returns the sha1 of the HEAD revision - * @param boolean $short whether return the abbreviated or full hash. - */ - public function getGitHeadRevision($short=false) { - if ($short) { - $flags = '--short'; - } else { - $flags = ''; - } - list($stdout) = $this->execxLocal( - 'rev-parse %s HEAD', - $flags); - return rtrim($stdout, "\n"); + public function getCanonicalRevisionName($string) { + list($stdout) = $this->execxLocal('show -s --format=%C %s', + '%H', $string); + return rtrim($stdout); } public function getWorkingCopyStatus() { @@ -552,10 +542,12 @@ final class ArcanistGitAPI extends ArcanistRepositoryAPI { } public function hasLocalCommit($commit) { - list($err) = $this->execManualLocal( - 'merge-base %s HEAD', - $commit); - return !$err; + try { + $this->getCanonicalRevisionName($commit); + } catch (CommandException $exception) { + return false; + } + return true; } public function parseRelativeLocalCommit(array $argv) { diff --git a/src/repository/api/mercurial/ArcanistMercurialAPI.php b/src/repository/api/mercurial/ArcanistMercurialAPI.php index 04daa133..9804dde5 100644 --- a/src/repository/api/mercurial/ArcanistMercurialAPI.php +++ b/src/repository/api/mercurial/ArcanistMercurialAPI.php @@ -60,6 +60,10 @@ final class ArcanistMercurialAPI extends ArcanistRepositoryAPI { return rtrim($stdout, "\n"); } + public function getCanonicalRevisionName($string) { + throw new ArcanistCapabilityNotSupportedException($this); + } + public function getSourceControlPath() { return '/'; } diff --git a/src/repository/api/mercurial/__init__.php b/src/repository/api/mercurial/__init__.php index d4aa19c1..5b0e0ef3 100644 --- a/src/repository/api/mercurial/__init__.php +++ b/src/repository/api/mercurial/__init__.php @@ -11,6 +11,7 @@ phutil_require_module('arcanist', 'parser/diff'); phutil_require_module('arcanist', 'parser/diff/changetype'); phutil_require_module('arcanist', 'repository/api/base'); phutil_require_module('arcanist', 'repository/parser/mercurial'); +phutil_require_module('arcanist', 'workflow/exception/notsupported'); phutil_require_module('phutil', 'future/exec'); phutil_require_module('phutil', 'utils'); diff --git a/src/repository/api/subversion/ArcanistSubversionAPI.php b/src/repository/api/subversion/ArcanistSubversionAPI.php index f476b6f1..b84cf44a 100644 --- a/src/repository/api/subversion/ArcanistSubversionAPI.php +++ b/src/repository/api/subversion/ArcanistSubversionAPI.php @@ -191,6 +191,10 @@ final class ArcanistSubversionAPI extends ArcanistRepositoryAPI { return $info['URL'].'@'.$this->getSVNBaseRevisionNumber(); } + public function getCanonicalRevisionName($string) { + throw new ArcanistCapabilityNotSupportedException($this); + } + public function getSVNBaseRevisionNumber() { if ($this->svnBaseRevisionNumber) { return $this->svnBaseRevisionNumber; diff --git a/src/repository/api/subversion/__init__.php b/src/repository/api/subversion/__init__.php index d65736bf..dd2e0a92 100644 --- a/src/repository/api/subversion/__init__.php +++ b/src/repository/api/subversion/__init__.php @@ -7,6 +7,7 @@ phutil_require_module('arcanist', 'repository/api/base'); +phutil_require_module('arcanist', 'workflow/exception/notsupported'); phutil_require_module('phutil', 'filesystem'); phutil_require_module('phutil', 'filesystem/tempfile');