Fix host and repo parsing for download-topics
Previous code was incorrectly assuming that the repo name always matched the host name.
Bug: chromium:1298922
Change-Id: Ic90ed585503d721f4d771b4f390a04c7f5b26622
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/3507359
Reviewed-by: Josip Sokcevic <sokcevic@google.com>
Commit-Queue: Ravi Mistry <rmistry@chromium.org>
diff --git a/gclient_scm.py b/gclient_scm.py
index 959d3dc..6a75af5 100644
--- a/gclient_scm.py
+++ b/gclient_scm.py
@@ -335,6 +335,58 @@
self.Print('FAILED to break lock: %s: %s' % (to_break, ex))
raise
+ def _download_topics(self, patch_rev, googlesource_url):
+ """This method returns new patch_revs to process that have the same topic.
+
+ It does the following:
+ 1. Finds the topic of the Gerrit change specified in the patch_rev.
+ 2. Find all changes with that topic.
+ 3. Append patch_rev of the changes with the same topic to the patch_revs
+ to process.
+ 4. Returns the new patch_revs to process.
+ """
+ patch_revs_to_process = []
+ # Parse the patch_rev to extract the CL and patchset.
+ patch_rev_tokens = patch_rev.split('/')
+ change = patch_rev_tokens[-2]
+ # Parse the googlesource_url.
+ tokens = re.search(
+ '//(.+).googlesource.com/(.+?)(?:\.git)?$', googlesource_url)
+ if not tokens or len(tokens.groups()) != 2:
+ # googlesource_url is not in the expected format.
+ return patch_revs_to_process
+
+ # parse the gerrit host and repo out of googlesource_url.
+ host, repo = tokens.groups()[:2]
+ gerrit_host_url = '%s-review.googlesource.com' % host
+
+ # 1. Find the topic of the Gerrit change specified in the patch_rev.
+ change_object = gerrit_util.GetChange(gerrit_host_url, change)
+ topic = change_object.get('topic')
+ if not topic:
+ # This change has no topic set.
+ return patch_revs_to_process
+
+ # 2. Find all changes with that topic.
+ changes_with_same_topic = gerrit_util.QueryChanges(
+ gerrit_host_url,
+ [('topic', topic), ('status', 'open'), ('repo', repo)],
+ o_params=['ALL_REVISIONS'])
+ for c in changes_with_same_topic:
+ if str(c['_number']) == change:
+ # This change is already in the patch_rev.
+ continue
+ self.Print('Found CL %d with the topic name %s' % (
+ c['_number'], topic))
+ # 3. Append patch_rev of the changes with the same topic to the
+ # patch_revs to process.
+ curr_rev = c['current_revision']
+ new_patch_rev = c['revisions'][curr_rev]['ref']
+ patch_revs_to_process.append(new_patch_rev)
+
+ # 4. Return the new patch_revs to process.
+ return patch_revs_to_process
+
def apply_patch_ref(self, patch_repo, patch_rev, target_rev, options,
file_list):
"""Apply a patch on top of the revision we're synced at.
@@ -408,39 +460,9 @@
patch_revs_to_process = [patch_rev]
if hasattr(options, 'download_topics') and options.download_topics:
- # We will now:
- # 1. Find the topic of the Gerrit change specified in the patch_rev.
- # 2. Find all changes with that topic.
- # 3. Append patch_rev of the changes with the same topic to the patch_revs
- # to process.
-
- # Parse the patch_Rev to extract the CL and patchset.
- patch_rev_tokens = patch_rev.split('/')
- change = patch_rev_tokens[-2]
- # Parse the gerrit host out of self.url.
- host = self.url.split(os.path.sep)[-1].rstrip('.git')
- gerrit_host_url = '%s-review.googlesource.com' % host
-
- # 1. Find the topic of the Gerrit change specified in the patch_rev.
- change_object = gerrit_util.GetChange(gerrit_host_url, change)
- topic = change_object.get('topic')
- if topic:
- # 2. Find all changes with that topic.
- changes_with_same_topic = gerrit_util.QueryChanges(
- gerrit_host_url,
- [('topic', topic), ('status', 'open'), ('repo', host)],
- o_params=['ALL_REVISIONS'])
- for c in changes_with_same_topic:
- if str(c['_number']) == change:
- # This change is already in the patch_rev.
- continue
- self.Print('Found CL %d with the topic name %s' % (
- c['_number'], topic))
- # 3. Append patch_rev of the changes with the same topic to the
- # patch_revs to process.
- curr_rev = c['current_revision']
- new_patch_rev = c['revisions'][curr_rev]['ref']
- patch_revs_to_process.append(new_patch_rev)
+ patch_revs_to_process_from_topics = self._download_topics(
+ patch_rev, self.url)
+ patch_revs_to_process.extend(patch_revs_to_process_from_topics)
self._Capture(['reset', '--hard'])
for pr in patch_revs_to_process: