Index: git_cl.py |
diff --git a/git_cl.py b/git_cl.py |
index 69af5455bc09891be134452a2206c0a87b66fde6..eeb7acfddf6cd64940fdd3ce6b38468036fd00c1 100755 |
--- a/git_cl.py |
+++ b/git_cl.py |
@@ -839,6 +839,53 @@ or verify this branch is set up to track another (via the --track argument to |
author, |
upstream=upstream_branch) |
+ def GetStatus(self): |
+ """Apply a rough heuristic to give a simple summary of an issue's review |
+ or CQ status, assuming adherence to a common workflow. |
+ |
+ Returns None if no issue for this branch, or one of the following keywords: |
+ * 'error' - error from review tool (including deleted issues) |
+ * 'unsent' - not sent for review |
+ * 'waiting' - waiting for review |
+ * 'reply' - waiting for owner to reply to review |
+ * 'lgtm' - LGTM from at least one approved reviewer |
+ * 'commit' - in the commit queue |
+ * 'closed' - closed |
+ """ |
+ if not self.GetIssue(): |
+ return None |
+ |
+ try: |
+ props = self.GetIssueProperties() |
+ except urllib2.HTTPError: |
+ return 'error' |
+ |
+ if props.get('closed'): |
+ # Issue is closed. |
+ return 'closed' |
+ if props.get('commit'): |
+ # Issue is in the commit queue. |
+ return 'commit' |
+ |
+ try: |
+ reviewers = self.GetApprovingReviewers() |
+ except urllib2.HTTPError: |
+ return 'error' |
+ |
+ if reviewers: |
+ # Was LGTM'ed. |
+ return 'lgtm' |
+ |
+ messages = props.get('messages') or [] |
+ |
+ if not messages: |
+ # No message was sent. |
+ return 'unsent' |
+ if messages[-1]['sender'] != props.get('owner_email'): |
+ # Non-LGTM reply from non-owner |
+ return 'reply' |
+ return 'waiting' |
+ |
def RunHook(self, committing, may_prompt, verbose, change): |
"""Calls sys.exit() if the hook fails; returns a HookResults otherwise.""" |
@@ -1218,6 +1265,19 @@ def CMDbaseurl(parser, args): |
error_ok=False).strip() |
+def color_for_status(status): |
+ """Maps a Changelist status to color, for CMDstatus and other tools.""" |
+ return { |
+ 'unsent': Fore.RED, |
+ 'waiting': Fore.BLUE, |
+ 'reply': Fore.YELLOW, |
+ 'lgtm': Fore.GREEN, |
+ 'commit': Fore.MAGENTA, |
+ 'closed': Fore.CYAN, |
+ 'error': Fore.WHITE, |
+ }.get(status, Fore.WHITE) |
+ |
+ |
def CMDstatus(parser, args): |
"""Show status of changelists. |
@@ -1277,36 +1337,13 @@ def CMDstatus(parser, args): |
"""Fetches information for an issue and returns (branch, issue, color).""" |
c = Changelist(branchref=b) |
i = c.GetIssueURL() |
- props = {} |
- r = None |
- if i: |
- try: |
- props = c.GetIssueProperties() |
- r = c.GetApprovingReviewers() if i else None |
- except urllib2.HTTPError: |
- # The issue probably doesn't exist anymore. |
- i += ' (broken)' |
- |
- msgs = props.get('messages') or [] |
- |
- if not i: |
- color = Fore.WHITE |
- elif props.get('closed'): |
- # Issue is closed. |
- color = Fore.CYAN |
- elif props.get('commit'): |
- # Issue is in the commit queue. |
- color = Fore.MAGENTA |
- elif r: |
- # Was LGTM'ed. |
- color = Fore.GREEN |
- elif not msgs: |
- # No message was sent. |
- color = Fore.RED |
- elif msgs[-1]['sender'] != props.get('owner_email'): |
- color = Fore.YELLOW |
- else: |
- color = Fore.BLUE |
+ status = c.GetStatus() |
+ color = color_for_status(status) |
+ |
+ if i and (not status or status == 'error'): |
+ # The issue probably doesn't exist anymore. |
+ i += ' (broken)' |
+ |
output.put((b, i, color)) |
# Process one branch synchronously to work through authentication, then |