git cl: use explicit Gerrit mirrors on 404s during upload.

This will cycle through known gerrit mirrors for chromium-review host
if Gerrit HTTP RPC results in 404 after successful initial
git push refs/for/refs/...

Tested locally by intentionally using wrong change number (2000000):

    $ PATH=`pwd`:$PATH git cl upload --bypass-hooks
        ...
        remote: Processing changes: refs: 1, new: 1, done
        remote: SUCCESS
        remote: New Changes:
        remote:   https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/1227440

                * [new branch]        ea9aea5faa85b4b289b7add4bc6f4d5dd6a01caf -> refs/for/refs/heads/master%wip,m=Initial_upload,hashtag=git-cl

        WARNING:root:404 NotFound error occurred while querying POST https://chromium-review.googlesource.com/a/changes/chromium%2Ftools%2Fdepot_tools~2000000/revisions/current/review: Not Found
        WARNING:root:404 NotFound error occurred while querying POST https://ap1-mirror-chromium-review.googlesource.com/a/changes/chromium%2Ftools%2Fdepot_tools~2000000/revisions/current/review: Not Found
        WARNING:root:404 NotFound error occurred while querying POST https://us1-mirror-chromium-review.googlesource.com/a/changes/chromium%2Ftools%2Fdepot_tools~2000000/revisions/current/review: Not Found

        ^C

Bug: 881860
Change-Id: Iac7dbe4e35052007650a7a2646a394caed6bd400
Reviewed-on: https://chromium-review.googlesource.com/1227441
Commit-Queue: Andrii Shyshkalov <tandrii@chromium.org>
Reviewed-by: Edward Lesmes <ehmaldonado@chromium.org>
diff --git a/tests/git_cl_test.py b/tests/git_cl_test.py
index 1e4b03c..25beba3 100755
--- a/tests/git_cl_test.py
+++ b/tests/git_cl_test.py
@@ -439,6 +439,24 @@
         'Cr-Commit-Position: refs/heads/branch@{#2}\n'
         'Cr-Branched-From: somehash-refs/heads/master@{#12}')
 
+  def test_gerrit_mirror_hack(self):
+    cr = 'chromium-review.googlesource.com'
+    url0 = 'https://%s/a/changes/x?a=b' % cr
+    origMirrors = git_cl.gerrit_util._GERRIT_MIRROR_PREFIXES
+    try:
+      git_cl.gerrit_util._GERRIT_MIRROR_PREFIXES = ['us1', 'us2']
+      url1 = git_cl.gerrit_util._UseGerritMirror(url0, cr)
+      url2 = git_cl.gerrit_util._UseGerritMirror(url1, cr)
+      url3 = git_cl.gerrit_util._UseGerritMirror(url2, cr)
+
+      self.assertNotEqual(url1, url2)
+      self.assertEqual(sorted((url1, url2)), [
+        'https://us1-mirror-chromium-review.googlesource.com/a/changes/x?a=b',
+        'https://us2-mirror-chromium-review.googlesource.com/a/changes/x?a=b'])
+      self.assertEqual(url1, url3)
+    finally:
+      git_cl.gerrit_util._GERRIT_MIRROR_PREFIXES = origMirrors
+
 
 class TestParseIssueURL(unittest.TestCase):
   def _validate(self, parsed, issue=None, patchset=None, hostname=None,