From c22dfe61ed011892e1f7a304765ba79ca8639b50 Mon Sep 17 00:00:00 2001 From: Javier Arteaga Date: Wed, 26 Aug 2015 15:59:03 -0700 Subject: [PATCH] Use 'remote.origin.url' fallback for git < 1.7.5 Summary: 'git ls-remote --get-url' is more correct, but younger and less supported. This commit tempers previous optimism about its availability, improving support for users of older git packages. Test Plan: * Set `git config url.xttps.insteadOf https` rewrite rule. * Ran `arc which` with git 1.7.5 in `$PATH`, saw rewritten configured remote. * Ran `arc which` with git 1.7.4 in `$PATH`, saw configured remote. Reviewers: epriestley, #blessed_reviewers Reviewed By: epriestley, #blessed_reviewers Subscribers: Korvin Differential Revision: https://secure.phabricator.com/D13998 --- src/repository/api/ArcanistGitAPI.php | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/repository/api/ArcanistGitAPI.php b/src/repository/api/ArcanistGitAPI.php index bd2ec023..f5ceae9c 100644 --- a/src/repository/api/ArcanistGitAPI.php +++ b/src/repository/api/ArcanistGitAPI.php @@ -51,6 +51,11 @@ final class ArcanistGitAPI extends ArcanistRepositoryAPI { return 'git'; } + public function getGitVersion() { + list($stdout) = $this->execxLocal('--version'); + return rtrim(str_replace('git version ', '', $stdout)); + } + public function getMetadataPath() { static $path = null; if ($path === null) { @@ -516,10 +521,21 @@ final class ArcanistGitAPI extends ArcanistRepositoryAPI { } public function getRemoteURI() { - list($stdout) = $this->execxLocal('ls-remote --get-url origin'); + // "git ls-remote --get-url" is the appropriate plumbing to get the remote + // URI. "git config remote.origin.url", on the other hand, may not be as + // accurate (for example, it does not take into account possible URL + // rewriting rules set by the user through "url..insteadOf"). However, + // the --get-url flag requires git 1.7.5. + $version = $this->getGitVersion(); + if (version_compare($version, '1.7.5', '>=')) { + list($stdout) = $this->execxLocal('ls-remote --get-url origin'); + } else { + list($stdout) = $this->execxLocal('config remote.origin.url'); + } $uri = rtrim($stdout); - if ($uri === 'origin') { + // 'origin' is what ls-remote outputs if no origin remote URI exists + if (!$uri || $uri === 'origin') { return null; }