git cl: add --gerrit and --rietveld options to force codereview.

This makes it possible to override the codereview set in:
 * repository codereview.settings
 * cached/set in local .git/config, either repo-wide or
   current branch only.

Examples:

    cd $SOME_RIETVELD_USING_REPO
    # Enable Gerrit codereview on it. Contact Infra-Git admin:
    # https://bugs.chromium.org/p/chromium/issues/entry?template=Infra-Git

    # Uploading
    git cl upload --gerrit --squash
    # Hack, hack, re-upload uses Gerrit automatically.
    git cl upload --squash

    # Patching
    git new-branch patched-in-issue
    git cl patch --gerrit XXXXXX

    # (Re-)setting issue
    git cl issue --gerrit 0
    git cl issue --gerrit XXXXXX

R=andybons@chromium.org,sergiyb@chromium.org
BUG=598681

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

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@299901 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/git_cl.py b/git_cl.py
index 34c96c0..9bc7d52 100755
--- a/git_cl.py
+++ b/git_cl.py
@@ -2507,6 +2507,29 @@
 }
 
 
+def _add_codereview_select_options(parser):
+  """Appends --gerrit and --rietveld options to force specific codereview."""
+  parser.codereview_group = optparse.OptionGroup(
+      parser, 'EXPERIMENTAL! Codereview override options')
+  parser.add_option_group(parser.codereview_group)
+  parser.codereview_group.add_option(
+      '--gerrit', action='store_true',
+      help='Force the use of Gerrit for codereview')
+  parser.codereview_group.add_option(
+      '--rietveld', action='store_true',
+      help='Force the use of Rietveld for codereview')
+
+
+def _process_codereview_select_options(parser, options):
+  if options.gerrit and options.rietveld:
+    parser.error('Options --gerrit and --rietveld are mutually exclusive')
+  options.forced_codereview = None
+  if options.gerrit:
+    options.forced_codereview = 'gerrit'
+  elif options.rietveld:
+    options.forced_codereview = 'rietveld'
+
+
 class ChangeDescription(object):
   """Contains a parsed form of the change description."""
   R_LINE = r'^[ \t]*(TBR|R)[ \t]*=[ \t]*(.*?)[ \t]*$'
@@ -3122,7 +3145,9 @@
                     help='Lookup the branch(es) for the specified issues. If '
                          'no issues are specified, all branches with mapped '
                          'issues will be listed.')
+  _add_codereview_select_options(parser)
   options, args = parser.parse_args(args)
+  _process_codereview_select_options(parser, options)
 
   if options.reverse:
     branches = RunGit(['for-each-ref', 'refs/heads',
@@ -3141,7 +3166,7 @@
       print 'Branch for issue number %s: %s' % (
           issue, ', '.join(issue_branch_map.get(int(issue)) or ('None',)))
   else:
-    cl = Changelist()
+    cl = Changelist(codereview=options.forced_codereview)
     if len(args) > 0:
       try:
         issue = int(args[0])
@@ -3485,7 +3510,9 @@
   orig_args = args
   add_git_similarity(parser)
   auth.add_auth_options(parser)
+  _add_codereview_select_options(parser)
   (options, args) = parser.parse_args(args)
+  _process_codereview_select_options(parser, options)
   auth_config = auth.extract_auth_config_from_options(options)
 
   if git_common.is_dirty_git_tree('upload'):
@@ -3497,7 +3524,7 @@
   # For sanity of test expectations, do this otherwise lazy-loading *now*.
   settings.GetIsGerrit()
 
-  cl = Changelist(auth_config=auth_config)
+  cl = Changelist(auth_config=auth_config, codereview=options.forced_codereview)
   return cl.CMDUpload(options, args, orig_args)
 
 
@@ -3981,10 +4008,12 @@
   parser.add_option_group(group)
 
   auth.add_auth_options(parser)
+  _add_codereview_select_options(parser)
   (options, args) = parser.parse_args(args)
+  _process_codereview_select_options(parser, options)
   auth_config = auth.extract_auth_config_from_options(options)
 
-  cl = Changelist(auth_config=auth_config)
+  cl = Changelist(auth_config=auth_config, codereview=options.forced_codereview)
 
   issue_arg = None
   if options.reapply :