Allow overriding base-url in git-cl.

This is useful if git-cl has no way to find out the original svn repo's url
and the user does not wish to configure git-svn and fetch the repository.

Review URL: http://codereview.chromium.org/9969099

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@130372 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/git_cl.py b/git_cl.py
index c332423..cf113b8 100755
--- a/git_cl.py
+++ b/git_cl.py
@@ -411,6 +411,13 @@
                        GIT_INSTRUCTIONS_URL)
     return self._remote
 
+  def GetGitBaseUrlFromConfig(self):
+    """Return the configured base URL from branch.<branchname>.baseurl.
+
+    Returns None if it is not set.
+    """
+    return RunGit(['config', 'branch.%s.base-url' % self.GetBranch()],
+                  error_ok=True).strip()
 
   def GetRemoteUrl(self):
     """Return the configured remote URL, e.g. 'git://example.org/foo.git/'.
@@ -787,6 +794,21 @@
   return 0
 
 
+def CMDbaseurl(parser, args):
+  """get or set base-url for this branch"""
+  branchref = RunGit(['symbolic-ref', 'HEAD']).strip()
+  branch = ShortBranchName(branchref)
+  _, args = parser.parse_args(args)
+  if not args:
+    print("Current base-url:")
+    return RunGit(['config', 'branch.%s.base-url' % branch],
+                  error_ok=False).strip()
+  else:
+    print("Setting base-url to %s" % args[0])
+    return RunGit(['config', 'branch.%s.base-url' % branch, args[0]],
+                  error_ok=False).strip()
+
+
 def CMDstatus(parser, args):
   """show status of changelists"""
   parser.add_option('--field',
@@ -982,18 +1004,19 @@
 
   # Include the upstream repo's URL in the change -- this is useful for
   # projects that have their source spread across multiple repos.
-  remote_url = None
-  if settings.GetIsGitSvn():
-    # URL is dependent on the current directory.
-    data = RunGit(['svn', 'info'], cwd=settings.GetRoot())
-    if data:
-      keys = dict(line.split(': ', 1) for line in data.splitlines()
-                  if ': ' in line)
-      remote_url = keys.get('URL', None)
-  else:
-    if cl.GetRemoteUrl() and '/' in cl.GetUpstreamBranch():
-      remote_url = (cl.GetRemoteUrl() + '@'
-                    + cl.GetUpstreamBranch().split('/')[-1])
+  remote_url = cl.GetGitBaseUrlFromConfig()
+  if not remote_url:
+    if settings.GetIsGitSvn():
+      # URL is dependent on the current directory.
+      data = RunGit(['svn', 'info'], cwd=settings.GetRoot())
+      if data:
+        keys = dict(line.split(': ', 1) for line in data.splitlines()
+                    if ': ' in line)
+        remote_url = keys.get('URL', None)
+    else:
+      if cl.GetRemoteUrl() and '/' in cl.GetUpstreamBranch():
+        remote_url = (cl.GetRemoteUrl() + '@'
+                      + cl.GetUpstreamBranch().split('/')[-1])
   if remote_url:
     upload_args.extend(['--base_url', remote_url])