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,