diff --git a/gclient_scm.py b/gclient_scm.py index 0dabd265e..f58343175 100644 --- a/gclient_scm.py +++ b/gclient_scm.py @@ -11,7 +11,6 @@ import logging import os import posixpath import re -import shlex import sys import tempfile import traceback @@ -159,13 +158,19 @@ class SCMWrapper(object): return getattr(self, command)(options, args, file_list) + @staticmethod + def _get_first_remote_url(checkout_path): + log = scm.GIT.Capture( + ['config', '--local', '--get-regexp', r'remote.*.url'], + cwd=checkout_path) + # Get the second token of the first line of the log. + return log.splitlines()[0].split(' ', 1)[1] + def GetActualRemoteURL(self, options): """Attempt to determine the remote URL for this SCMWrapper.""" # Git if os.path.exists(os.path.join(self.checkout_path, '.git')): - actual_remote_url = shlex.split(scm.GIT.Capture( - ['config', '--local', '--get-regexp', r'remote.*.url'], - cwd=self.checkout_path))[1] + actual_remote_url = self._get_first_remote_url(self.checkout_path) # If a cache_dir is used, obtain the actual remote URL from the cache. if getattr(self, 'cache_dir', None): @@ -173,9 +178,7 @@ class SCMWrapper(object): mirror = git_cache.Mirror(url) if (mirror.exists() and mirror.mirror_path.replace('\\', '/') == actual_remote_url.replace('\\', '/')): - actual_remote_url = shlex.split(scm.GIT.Capture( - ['config', '--local', '--get-regexp', r'remote.*.url'], - cwd=mirror.mirror_path))[1] + actual_remote_url = self._get_first_remote_url(mirror.mirror_path) return actual_remote_url # Svn diff --git a/tests/gclient_scm_test.py b/tests/gclient_scm_test.py index 3dd175c69..163cc0745 100755 --- a/tests/gclient_scm_test.py +++ b/tests/gclient_scm_test.py @@ -88,6 +88,33 @@ class BaseTestCase(GCBaseTestCase, SuperMoxTestBase): gclient_scm.GitWrapper.BinaryExists = self._original_GitBinaryExists +class BasicTests(SuperMoxTestBase): + def setUp(self): + SuperMoxTestBase.setUp(self) + + def testGetFirstRemoteUrl(self): + REMOTE_STRINGS = [('remote.origin.url E:\\foo\\bar', 'E:\\foo\\bar'), + ('remote.origin.url /b/foo/bar', '/b/foo/bar'), + ('remote.origin.url https://foo/bar', 'https://foo/bar'), + ('remote.origin.url E:\\Fo Bar\\bax', 'E:\\Fo Bar\\bax'), + ('remote.origin.url git://what/"do', 'git://what/"do')] + FAKE_PATH = '/fake/path' + self.mox.StubOutWithMock(gclient_scm.scm.GIT, 'Capture') + for question, _ in REMOTE_STRINGS: + gclient_scm.scm.GIT.Capture( + ['config', '--local', '--get-regexp', r'remote.*.url'], + cwd=FAKE_PATH).AndReturn(question) + + self.mox.ReplayAll() + + for _, answer in REMOTE_STRINGS: + self.assertEquals(gclient_scm.SCMWrapper._get_first_remote_url(FAKE_PATH), + answer) + + def tearDown(self): + SuperMoxTestBase.tearDown(self) + + class SVNWrapperTestCase(BaseTestCase): class OptionsObject(object): def __init__(self, verbose=False, revision=None, force=False):