OLD | NEW |
---|---|
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 # Copyright (C) 2008 Evan Martin <martine@danga.com> | 6 # Copyright (C) 2008 Evan Martin <martine@danga.com> |
7 | 7 |
8 """A git-command for integrating reviews on Rietveld.""" | 8 """A git-command for integrating reviews on Rietveld.""" |
9 | 9 |
10 from distutils.version import LooseVersion | 10 from distutils.version import LooseVersion |
(...skipping 821 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
832 return presubmit_support.GitChange( | 832 return presubmit_support.GitChange( |
833 name, | 833 name, |
834 description, | 834 description, |
835 absroot, | 835 absroot, |
836 files, | 836 files, |
837 issue, | 837 issue, |
838 patchset, | 838 patchset, |
839 author, | 839 author, |
840 upstream=upstream_branch) | 840 upstream=upstream_branch) |
841 | 841 |
842 def GetStatus(self): | |
843 """Returns None or a string describing the issue's review or CQ status: | |
844 * None - no issue | |
845 * 'error' - error from review tool (including deleted issues) | |
846 * 'unsent' - not sent for review | |
847 * 'waiting' - waiting for review | |
848 * 'reply' - waiting for owner to reply to review | |
849 * 'lgtm' - LGTM'ed | |
850 * 'commit' - in the commit queue | |
851 * 'closed' - closed | |
852 """ | |
853 if not self.GetIssue(): | |
854 return None | |
855 | |
856 try: | |
857 props = self.GetIssueProperties() | |
858 reviewers = self.GetApprovingReviewers() | |
iannucci
2014/09/10 19:10:57
since this makes a second HTTP request (I think),
jsbell
2014/09/10 22:00:27
Done.
| |
859 except urllib2.HTTPError: | |
860 return 'error' | |
861 | |
862 if props.get('closed'): | |
863 # Issue is closed. | |
864 return 'closed' | |
865 if props.get('commit'): | |
866 # Issue is in the commit queue. | |
867 return 'commit' | |
868 if reviewers: | |
869 # Was LGTM'ed. | |
870 return 'lgtm' | |
871 | |
872 messages = props.get('messages') or [] | |
873 | |
874 if not messages: | |
875 # No message was sent. | |
876 return 'unsent' | |
877 if messages[-1]['sender'] != props.get('owner_email'): | |
878 # Non-LGTM reply from non-owner | |
879 return 'reply' | |
880 return 'waiting' | |
881 | |
842 def RunHook(self, committing, may_prompt, verbose, change): | 882 def RunHook(self, committing, may_prompt, verbose, change): |
843 """Calls sys.exit() if the hook fails; returns a HookResults otherwise.""" | 883 """Calls sys.exit() if the hook fails; returns a HookResults otherwise.""" |
844 | 884 |
845 try: | 885 try: |
846 return presubmit_support.DoPresubmitChecks(change, committing, | 886 return presubmit_support.DoPresubmitChecks(change, committing, |
847 verbose=verbose, output_stream=sys.stdout, input_stream=sys.stdin, | 887 verbose=verbose, output_stream=sys.stdout, input_stream=sys.stdin, |
848 default_presubmit=None, may_prompt=may_prompt, | 888 default_presubmit=None, may_prompt=may_prompt, |
849 rietveld_obj=self.RpcServer()) | 889 rietveld_obj=self.RpcServer()) |
850 except presubmit_support.PresubmitFailure, e: | 890 except presubmit_support.PresubmitFailure, e: |
851 DieWithError( | 891 DieWithError( |
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1269 # Adhoc thread pool to request data concurrently. | 1309 # Adhoc thread pool to request data concurrently. |
1270 output = Queue.Queue() | 1310 output = Queue.Queue() |
1271 | 1311 |
1272 # Silence upload.py otherwise it becomes unweldly. | 1312 # Silence upload.py otherwise it becomes unweldly. |
1273 upload.verbosity = 0 | 1313 upload.verbosity = 0 |
1274 | 1314 |
1275 if not options.fast: | 1315 if not options.fast: |
1276 def fetch(b): | 1316 def fetch(b): |
1277 """Fetches information for an issue and returns (branch, issue, color).""" | 1317 """Fetches information for an issue and returns (branch, issue, color).""" |
1278 c = Changelist(branchref=b) | 1318 c = Changelist(branchref=b) |
1319 status = c.GetStatus() | |
1279 i = c.GetIssueURL() | 1320 i = c.GetIssueURL() |
1280 props = {} | |
1281 r = None | |
1282 if i: | |
1283 try: | |
1284 props = c.GetIssueProperties() | |
1285 r = c.GetApprovingReviewers() if i else None | |
1286 except urllib2.HTTPError: | |
1287 # The issue probably doesn't exist anymore. | |
1288 i += ' (broken)' | |
1289 | 1321 |
1290 msgs = props.get('messages') or [] | 1322 if not status or status == 'error': |
1291 | 1323 # The issue probably doesn't exist anymore. |
1292 if not i: | 1324 i += ' (broken)' |
1293 color = Fore.WHITE | 1325 color = Fore.WHITE |
1294 elif props.get('closed'): | |
1295 # Issue is closed. | |
1296 color = Fore.CYAN | |
1297 elif props.get('commit'): | |
1298 # Issue is in the commit queue. | |
1299 color = Fore.MAGENTA | |
1300 elif r: | |
1301 # Was LGTM'ed. | |
1302 color = Fore.GREEN | |
1303 elif not msgs: | |
1304 # No message was sent. | |
1305 color = Fore.RED | |
1306 elif msgs[-1]['sender'] != props.get('owner_email'): | |
1307 color = Fore.YELLOW | |
1308 else: | 1326 else: |
1309 color = Fore.BLUE | 1327 color = { |
1328 'unsent': Fore.RED, | |
1329 'waiting': Fore.BLUE, | |
1330 'reply': Fore.YELLOW, | |
1331 'lgtm': Fore.GREEN, | |
1332 'commit': Fore.MAGENTA, | |
1333 'closed': Fore.CYAN, | |
1334 }[status] | |
iannucci
2014/09/10 19:10:57
let's factor this list out too so that git-map-bra
jsbell
2014/09/10 22:00:27
Done.
| |
1310 output.put((b, i, color)) | 1335 output.put((b, i, color)) |
1311 | 1336 |
1312 # Process one branch synchronously to work through authentication, then | 1337 # Process one branch synchronously to work through authentication, then |
1313 # spawn threads to process all the other branches in parallel. | 1338 # spawn threads to process all the other branches in parallel. |
1314 if branches: | 1339 if branches: |
1315 fetch(branches[0]) | 1340 fetch(branches[0]) |
1316 threads = [ | 1341 threads = [ |
1317 threading.Thread(target=fetch, args=(b,)) for b in branches[1:]] | 1342 threading.Thread(target=fetch, args=(b,)) for b in branches[1:]] |
1318 for t in threads: | 1343 for t in threads: |
1319 t.daemon = True | 1344 t.daemon = True |
(...skipping 1517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2837 ('AppEngine is misbehaving and returned HTTP %d, again. Keep faith ' | 2862 ('AppEngine is misbehaving and returned HTTP %d, again. Keep faith ' |
2838 'and retry or visit go/isgaeup.\n%s') % (e.code, str(e))) | 2863 'and retry or visit go/isgaeup.\n%s') % (e.code, str(e))) |
2839 | 2864 |
2840 | 2865 |
2841 if __name__ == '__main__': | 2866 if __name__ == '__main__': |
2842 # These affect sys.stdout so do it outside of main() to simplify mocks in | 2867 # These affect sys.stdout so do it outside of main() to simplify mocks in |
2843 # unit testing. | 2868 # unit testing. |
2844 fix_encoding.fix_encoding() | 2869 fix_encoding.fix_encoding() |
2845 colorama.init() | 2870 colorama.init() |
2846 sys.exit(main(sys.argv[1:])) | 2871 sys.exit(main(sys.argv[1:])) |
OLD | NEW |