Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(166)

Unified Diff: git_cl.py

Issue 1847693004: Fix hanging issue with git map-branches. (Closed) Base URL: https://chromium.googlesource.com/chromium/tools/depot_tools.git@master
Patch Set: address comment Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: git_cl.py
diff --git a/git_cl.py b/git_cl.py
index fd2dcea4189f99632da41dafc2874c857f599091..a6dab6ad45b80712d94f5bd7e86f29225cd34d22 100755
--- a/git_cl.py
+++ b/git_cl.py
@@ -15,6 +15,7 @@ import glob
import httplib
import json
import logging
+import multiprocessing
import optparse
import os
import Queue
@@ -2924,7 +2925,7 @@ def fetch_cl_status(branch, auth_config=None):
def get_cl_statuses(
branches, fine_grained, max_processes=None, auth_config=None):
- """Returns a blocking iterable of (branch, issue, color) for given branches.
+ """Returns a blocking iterable of (branch, issue, status) for given branches.
If fine_grained is true, this will fetch CL statuses from the server.
Otherwise, simply indicate if there's a matching url for the given branches.
@@ -2932,7 +2933,15 @@ def get_cl_statuses(
If max_processes is specified, it is used as the maximum number of processes
to spawn to fetch CL status from the server. Otherwise 1 process per branch is
spawned.
+
+ See GetStatus() for a list of possible statuses.
"""
+ def fetch(branch):
+ if not branch:
+ return None
+
+ return fetch_cl_status(branch, auth_config=auth_config)
+
# Silence upload.py otherwise it becomes unwieldly.
upload.verbosity = 0
@@ -2940,7 +2949,7 @@ def get_cl_statuses(
# Process one branch synchronously to work through authentication, then
# spawn processes to process all the other branches in parallel.
if branches:
- fetch = lambda branch: fetch_cl_status(branch, auth_config=auth_config)
+
yield fetch(branches[0])
branches_to_fetch = branches[1:]
@@ -2948,13 +2957,28 @@ def get_cl_statuses(
min(max_processes, len(branches_to_fetch))
if max_processes is not None
else len(branches_to_fetch))
- for x in pool.imap_unordered(fetch, branches_to_fetch):
- yield x
+
+ fetched_branches = set()
+ it = pool.imap_unordered(fetch, branches_to_fetch).__iter__()
+ while True:
+ try:
+ row = it.next(timeout=5)
+ except multiprocessing.TimeoutError:
+ break
+
+ fetched_branches.add(row[0])
+ yield row
+
+ # Add any branches that failed to fetch.
+ for b in set(branches_to_fetch) - fetched_branches:
+ cl = Changelist(branchref=b, auth_config=auth_config)
+ yield (b, cl.GetIssueURL() if b else None, 'error')
+
else:
# Do not use GetApprovingReviewers(), since it requires an HTTP request.
for b in branches:
cl = Changelist(branchref=b, auth_config=auth_config)
- url = cl.GetIssueURL()
+ url = cl.GetIssueURL() if b else None
yield (b, url, 'waiting' if url else 'error')
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698