Use CLs more consistently instead of branch names

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

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@300132 0039d316-1c4b-4281-b951-d872f2087c98
parent 95a5ad89
...@@ -17,11 +17,9 @@ import json ...@@ -17,11 +17,9 @@ import json
import logging import logging
import optparse import optparse
import os import os
import Queue
import re import re
import stat import stat
import sys import sys
import tempfile
import textwrap import textwrap
import time import time
import traceback import traceback
...@@ -2899,20 +2897,8 @@ def color_for_status(status): ...@@ -2899,20 +2897,8 @@ def color_for_status(status):
'error': Fore.WHITE, 'error': Fore.WHITE,
}.get(status, Fore.WHITE) }.get(status, Fore.WHITE)
def fetch_cl_status(branch, auth_config=None):
"""Fetches information for an issue and returns (branch, issue, status)."""
cl = Changelist(branchref=branch, auth_config=auth_config)
url = cl.GetIssueURL()
status = cl.GetStatus()
if url and (not status or status == 'error'):
# The issue probably doesn't exist anymore.
url += ' (broken)'
return (branch, url, status)
def get_cl_statuses( def get_cl_statuses(
branches, fine_grained, max_processes=None, auth_config=None): changes, fine_grained, max_processes=None):
"""Returns a blocking iterable of (branch, issue, color) for given branches. """Returns a blocking iterable of (branch, issue, color) for given branches.
If fine_grained is true, this will fetch CL statuses from the server. If fine_grained is true, this will fetch CL statuses from the server.
...@@ -2928,23 +2914,21 @@ def get_cl_statuses( ...@@ -2928,23 +2914,21 @@ def get_cl_statuses(
if fine_grained: if fine_grained:
# Process one branch synchronously to work through authentication, then # Process one branch synchronously to work through authentication, then
# spawn processes to process all the other branches in parallel. # spawn processes to process all the other branches in parallel.
if branches: if changes:
fetch = lambda branch: fetch_cl_status(branch, auth_config=auth_config) fetch = lambda cl: (cl, cl.GetStatus())
yield fetch(branches[0]) yield fetch(changes[0])
branches_to_fetch = branches[1:] changes_to_fetch = changes[1:]
pool = ThreadPool( pool = ThreadPool(
min(max_processes, len(branches_to_fetch)) min(max_processes, len(changes_to_fetch))
if max_processes is not None if max_processes is not None
else len(branches_to_fetch)) else len(changes_to_fetch))
for x in pool.imap_unordered(fetch, branches_to_fetch): for x in pool.imap_unordered(fetch, changes_to_fetch):
yield x yield x
else: else:
# Do not use GetApprovingReviewers(), since it requires an HTTP request. # Do not use GetApprovingReviewers(), since it requires an HTTP request.
for b in branches: for cl in changes:
cl = Changelist(branchref=b, auth_config=auth_config) yield (cl, 'waiting' if cl.GetIssueURL() else 'error')
url = cl.GetIssueURL()
yield (b, url, 'waiting' if url else 'error')
def upload_branch_deps(cl, args): def upload_branch_deps(cl, args):
...@@ -3097,25 +3081,27 @@ def CMDstatus(parser, args): ...@@ -3097,25 +3081,27 @@ def CMDstatus(parser, args):
print('No local branch found.') print('No local branch found.')
return 0 return 0
changes = ( changes = [
Changelist(branchref=b, auth_config=auth_config) Changelist(branchref=b, auth_config=auth_config)
for b in branches.splitlines()) for b in branches.splitlines()]
# TODO(tandrii): refactor to use CLs list instead of branches list.
branches = [c.GetBranch() for c in changes]
alignment = max(5, max(len(b) for b in branches))
print 'Branches associated with reviews:' print 'Branches associated with reviews:'
output = get_cl_statuses(branches, output = get_cl_statuses(changes,
fine_grained=not options.fast, fine_grained=not options.fast,
max_processes=options.maxjobs, max_processes=options.maxjobs)
auth_config=auth_config)
branch_statuses = {} branch_statuses = {}
alignment = max(5, max(len(ShortBranchName(b)) for b in branches)) alignment = max(5, max(len(ShortBranchName(c.GetBranch())) for c in changes))
for branch in sorted(branches): for cl in sorted(changes, key=lambda c: c.GetBranch()):
branch = cl.GetBranch()
while branch not in branch_statuses: while branch not in branch_statuses:
b, i, status = output.next() c, status = output.next()
branch_statuses[b] = (i, status) branch_statuses[c.GetBranch()] = status
issue_url, status = branch_statuses.pop(branch) status = branch_statuses.pop(branch)
url = cl.GetIssueURL()
if url and (not status or status == 'error'):
# The issue probably doesn't exist anymore.
url += ' (broken)'
color = color_for_status(status) color = color_for_status(status)
reset = Fore.RESET reset = Fore.RESET
if not setup_color.IS_TTY: if not setup_color.IS_TTY:
...@@ -3123,8 +3109,8 @@ def CMDstatus(parser, args): ...@@ -3123,8 +3109,8 @@ def CMDstatus(parser, args):
reset = '' reset = ''
status_str = '(%s)' % status if status else '' status_str = '(%s)' % status if status else ''
print ' %*s : %s%s %s%s' % ( print ' %*s : %s%s %s%s' % (
alignment, ShortBranchName(branch), color, issue_url, status_str, alignment, ShortBranchName(branch), color, url,
reset) status_str, reset)
cl = Changelist(auth_config=auth_config) cl = Changelist(auth_config=auth_config)
print print
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment