Support --target-branch option to git-cl upload for Rietveld

This is similar to the Gerrit behavior in that we default to master,
unless the remote upstream is a branch head.

BUG=435702

Review URL: https://codereview.chromium.org/822503005

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@293807 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/tests/git_cl_test.py b/tests/git_cl_test.py
index 36730bc..42231e9 100755
--- a/tests/git_cl_test.py
+++ b/tests/git_cl_test.py
@@ -756,6 +756,57 @@
       actual.append(obj.description)
     self.assertEqual(expected, actual)
 
+  def test_get_target_ref(self):
+    # Check remote or remote branch not present.
+    self.assertEqual(None, git_cl.GetTargetRef('origin', None, 'master', None))
+    self.assertEqual(None, git_cl.GetTargetRef(None,
+                                               'refs/remotes/origin/master',
+                                               'master', None))
+    
+    # Check default target refs for branches.
+    self.assertEqual('refs/heads/master',
+                     git_cl.GetTargetRef('origin', 'refs/remotes/origin/master',
+                                         None, None))
+    self.assertEqual('refs/heads/master',
+                     git_cl.GetTargetRef('origin', 'refs/remotes/origin/lkgr',
+                                         None, None))
+    self.assertEqual('refs/heads/master',
+                     git_cl.GetTargetRef('origin', 'refs/remotes/origin/lkcr',
+                                         None, None))
+    self.assertEqual('refs/branch-heads/123',
+                     git_cl.GetTargetRef('origin',
+                                         'refs/remotes/branch-heads/123',
+                                         None, None))
+    self.assertEqual('refs/diff/test',
+                     git_cl.GetTargetRef('origin',
+                                         'refs/remotes/origin/refs/diff/test',
+                                         None, None))
+
+    # Check target refs for user-specified target branch.
+    for branch in ('branch-heads/123', 'remotes/branch-heads/123',
+                   'refs/remotes/branch-heads/123'):
+      self.assertEqual('refs/branch-heads/123',
+                       git_cl.GetTargetRef('origin',
+                                           'refs/remotes/origin/master',
+                                           branch, None))
+    for branch in ('origin/master', 'remotes/origin/master',
+                   'refs/remotes/origin/master'):
+      self.assertEqual('refs/heads/master',
+                       git_cl.GetTargetRef('origin',
+                                           'refs/remotes/branch-heads/123',
+                                           branch, None))
+    for branch in ('master', 'heads/master', 'refs/heads/master'):
+      self.assertEqual('refs/heads/master',
+                       git_cl.GetTargetRef('origin',
+                                           'refs/remotes/branch-heads/123',
+                                           branch, None))
+
+    # Check target refs for pending prefix.
+    self.assertEqual('prefix/heads/master',
+                     git_cl.GetTargetRef('origin', 'refs/remotes/origin/master',
+                                         None, 'prefix/'))
+
+
 if __name__ == '__main__':
   git_cl.logging.basicConfig(
       level=git_cl.logging.DEBUG if '-v' in sys.argv else git_cl.logging.ERROR)