| Index: tests/gclient_scm_test.py | 
| diff --git a/tests/gclient_scm_test.py b/tests/gclient_scm_test.py | 
| index 5607f85dda123b20633d3daaf9003d91e43fda66..99007b09b3b7ea01f61adb7f9dacef0994fc91ed 100755 | 
| --- a/tests/gclient_scm_test.py | 
| +++ b/tests/gclient_scm_test.py | 
| @@ -102,6 +102,7 @@ class SVNWrapperTestCase(BaseTestCase): | 
| 'BinaryExists', | 
| 'FullUrlForRelativeUrl', | 
| 'GetCheckoutRoot', | 
| +        'GetRemoteURL', | 
| 'GetRevisionDate', | 
| 'GetUsableRev', | 
| 'Svnversion', | 
| @@ -162,8 +163,6 @@ class SVNWrapperTestCase(BaseTestCase): | 
|  | 
| def testRunCommandException(self): | 
| options = self.Options(verbose=False) | 
| -    gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False) | 
| -    gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False) | 
|  | 
| self.mox.ReplayAll() | 
| scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir, | 
| @@ -183,8 +182,6 @@ class SVNWrapperTestCase(BaseTestCase): | 
| gclient_scm.scm.SVN.Capture(['--version', '--quiet'], None | 
| ).AndReturn('1.5.1') | 
| # It'll to a checkout instead. | 
| -    gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False) | 
| -    gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False) | 
| # Checkout. | 
| gclient_scm.os.path.exists(self.base_path).AndReturn(False) | 
| parent = gclient_scm.os.path.dirname(self.base_path) | 
| @@ -212,11 +209,7 @@ class SVNWrapperTestCase(BaseTestCase): | 
| options = self.Options(verbose=True, force=True) | 
| gclient_scm.os.path.isdir(self.base_path).AndReturn(True) | 
| gclient_scm.os.path.isdir(join(self.base_path, '.svn')).AndReturn(False) | 
| -    gclient_scm.os.path.isdir(join(self.base_path, '.git')).AndReturn(False) | 
| -    gclient_scm.os.path.isdir(join(self.base_path, '.hg')).AndReturn(False) | 
| # Checkout. | 
| -    gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False) | 
| -    gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False) | 
| gclient_scm.os.path.exists(self.base_path).AndReturn(False) | 
| parent = gclient_scm.os.path.dirname(self.base_path) | 
| gclient_scm.os.path.exists(parent).AndReturn(False) | 
| @@ -341,8 +334,6 @@ class SVNWrapperTestCase(BaseTestCase): | 
| file_info.url = self.url | 
| file_info.uuid = 'ABC' | 
| file_info.revision = 42 | 
| -    gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False) | 
| -    gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False) | 
| # Checkout. | 
| gclient_scm.os.path.exists(self.base_path).AndReturn(False) | 
| parent = gclient_scm.os.path.dirname(self.base_path) | 
| @@ -374,8 +365,6 @@ class SVNWrapperTestCase(BaseTestCase): | 
| 'UUID': 'ABC', | 
| 'Revision': 42, | 
| } | 
| -    gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False) | 
| -    gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False) | 
| gclient_scm.os.path.exists(self.base_path).AndReturn(True) | 
|  | 
| # Checkout or update. | 
| @@ -420,8 +409,6 @@ class SVNWrapperTestCase(BaseTestCase): | 
| 'UUID': 'ABC', | 
| 'Revision': 42, | 
| } | 
| -    gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False) | 
| -    gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False) | 
| gclient_scm.os.path.exists(self.base_path).AndReturn(True) | 
|  | 
| # Checkout or update. | 
| @@ -456,8 +443,6 @@ class SVNWrapperTestCase(BaseTestCase): | 
| 'UUID': 'ABC', | 
| 'Revision': 42, | 
| } | 
| -    gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False) | 
| -    gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False) | 
| gclient_scm.os.path.exists(self.base_path).AndReturn(True) | 
|  | 
| # Checkout or update. | 
| @@ -522,8 +507,6 @@ class SVNWrapperTestCase(BaseTestCase): | 
| file_list=files_list) | 
|  | 
| # Now we fall back on scm.update(). | 
| -    gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False) | 
| -    gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False) | 
| gclient_scm.os.path.exists(self.base_path).AndReturn(True) | 
| gclient_scm.scm.SVN._CaptureInfo([], dotted_path).AndReturn(file_info) | 
| gclient_scm.scm.SVN._CaptureInfo([file_info['URL']], None | 
| @@ -592,8 +575,6 @@ class SVNWrapperTestCase(BaseTestCase): | 
| file_list=files_list) | 
|  | 
| # Now we fall back on scm.update(). | 
| -    gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False) | 
| -    gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False) | 
| gclient_scm.os.path.exists(self.base_path).AndReturn(True) | 
| gclient_scm.scm.SVN._CaptureInfo( | 
| [], join(self.base_path, ".")).AndReturn(file_info) | 
| @@ -628,8 +609,6 @@ class SVNWrapperTestCase(BaseTestCase): | 
|  | 
| # Now we fall back on scm.update(). | 
| files_list = self.mox.CreateMockAnything() | 
| -    gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False) | 
| -    gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(False) | 
| gclient_scm.os.path.exists(self.base_path).AndReturn(True) | 
| gclient_scm.scm.SVN._CaptureInfo( | 
| [], join(self.base_path, '.')).AndReturn(file_info) | 
| @@ -645,32 +624,6 @@ class SVNWrapperTestCase(BaseTestCase): | 
| scm.updatesingle(options, ['DEPS'], files_list) | 
| self.checkstdout('\n_____ %s at 42\n' % self.relpath) | 
|  | 
| -  def testUpdateGit(self): | 
| -    options = self.Options(verbose=True) | 
| -    file_path = gclient_scm.os.path.join(self.root_dir, self.relpath, '.git') | 
| -    gclient_scm.os.path.exists(file_path).AndReturn(True) | 
| - | 
| -    self.mox.ReplayAll() | 
| -    scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir, | 
| -                            relpath=self.relpath) | 
| -    file_list = [] | 
| -    scm.update(options, self.args, file_list) | 
| -    self.checkstdout( | 
| -        ('________ found .git directory; skipping %s\n' % self.relpath)) | 
| - | 
| -  def testUpdateHg(self): | 
| -    options = self.Options(verbose=True) | 
| -    gclient_scm.os.path.exists(join(self.base_path, '.git')).AndReturn(False) | 
| -    gclient_scm.os.path.exists(join(self.base_path, '.hg')).AndReturn(True) | 
| - | 
| -    self.mox.ReplayAll() | 
| -    scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir, | 
| -                            relpath=self.relpath) | 
| -    file_list = [] | 
| -    scm.update(options, self.args, file_list) | 
| -    self.checkstdout( | 
| -        ('________ found .hg directory; skipping %s\n' % self.relpath)) | 
| - | 
| def testGetUsableRevSVN(self): | 
| # pylint: disable=E1101 | 
| options = self.Options(verbose=True) | 
| @@ -692,6 +645,48 @@ class SVNWrapperTestCase(BaseTestCase): | 
| self.assertRaises(gclient_scm.gclient_utils.Error, | 
| svn_scm.GetUsableRev, 'fake', options) | 
|  | 
| +  def testGetRemoteURL(self): | 
| +    self.mox.UnsetStubs() | 
| +    options = self.Options(verbose=True) | 
| +    self.mox.StubOutWithMock(gclient_scm.scm.SVN, 'Capture', True) | 
| +    svn_scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir, | 
| +                                relpath=self.relpath) | 
| + | 
| +    if svn_scm.relpath: | 
| +      cwd = os.path.join(svn_scm._root_dir, svn_scm.relpath) | 
| +    else: | 
| +      cwd = svn_scm._root_dir | 
| + | 
| +    gclient_scm.scm.SVN.Capture(['info', '--xml', os.curdir], cwd).AndReturn( | 
| +"""<?xml version="1.0"?> | 
| +<info> | 
| +<entry | 
| +   path="." | 
| +   revision="1234" | 
| +   kind="dir"> | 
| +<url>%s</url> | 
| +<repository> | 
| +<root>https://dummy.repo.com/svn</root> | 
| +<uuid>FAKE</uuid> | 
| +</repository> | 
| +<wc-info> | 
| +<schedule>normal</schedule> | 
| +<depth>infinity</depth> | 
| +</wc-info> | 
| +<commit | 
| +   revision="1234"> | 
| +<author>fakedev@chromium.org</author> | 
| +<date>2013-11-14T15:08:21.757885Z</date> | 
| +</commit> | 
| +</entry> | 
| +</info> | 
| +""" % svn_scm.url) | 
| + | 
| +    self.mox.ReplayAll() | 
| + | 
| +    self.assertEquals(svn_scm.GetRemoteURL(options), self.url) | 
| + | 
| + | 
| class BaseGitWrapperTestCase(GCBaseTestCase, StdoutCheck, TestCaseUtils, | 
| unittest.TestCase): | 
| """This class doesn't use pymox.""" | 
| @@ -817,6 +812,7 @@ class ManagedGitWrapperTestCase(BaseGitWrapperTestCase): | 
| 'BinaryExists', | 
| 'FullUrlForRelativeUrl', | 
| 'GetCheckoutRoot', | 
| +        'GetRemoteURL', | 
| 'GetRevisionDate', | 
| 'GetUsableRev', | 
| 'RunCommand', | 
| @@ -1185,6 +1181,18 @@ class ManagedGitWrapperTestCaseMox(BaseTestCase): | 
| self.assertRaises(gclient_scm.gclient_utils.Error, | 
| git_svn_scm.GetUsableRev, too_big, options) | 
|  | 
| +  def testGetRemoteURL(self): | 
| +    options = self.Options(verbose=True) | 
| +    self.mox.StubOutWithMock(gclient_scm.GitWrapper, '_Capture', True) | 
| +    git_scm = self._scm_wrapper(url=self.url, root_dir=self.root_dir, | 
| +                                relpath=self.relpath) | 
| +    git_scm._Capture(['config', 'remote.origin.url'], cwd='/tmp/fake' | 
| +                     ).AndReturn('%s\n' % git_scm.url) | 
| + | 
| +    self.mox.ReplayAll() | 
| + | 
| +    self.assertEquals(git_scm.GetRemoteURL(options), self.url) | 
| + | 
|  | 
| class UnmanagedGitWrapperTestCase(BaseGitWrapperTestCase): | 
| def testUpdateUpdate(self): | 
|  |