Chromium Code Reviews| Index: git_cl.py |
| diff --git a/git_cl.py b/git_cl.py |
| index 18dc963407d46321b7f77937af2f9ed1de3fcfeb..53cf39fb6dbbee5988bbf06217b5231a9fc04fab 100755 |
| --- a/git_cl.py |
| +++ b/git_cl.py |
| @@ -154,6 +154,12 @@ def time_sleep(seconds): |
| return time.sleep(seconds) |
| +def time_time(): |
| + # Use this so that it can be mocked in tests without interfering with python |
| + # system machinery. |
| + import time # Local import to discourage others from importing time globally. |
| + return time.time() |
| + |
| def ask_for_data(prompt): |
| try: |
| return raw_input(prompt) |
| @@ -458,6 +464,11 @@ def fetch_try_jobs(auth_config, changelist, buildbucket_host, |
| return builds |
| +def _count_unfinished_tryjobs(jobs): |
| + """Returns number of unfinished jobs from fetch_try_jobs result.""" |
| + return sum(b['status'] != 'COMPLETED' for b in jobs.itervalues()) |
|
Sergiy Byelozyorov
2016/10/19 15:41:13
perhaps
len(b for b in jobs.itervalues() if b['s
|
| + |
| + |
| def print_try_jobs(options, builds): |
| """Prints nicely result of fetch_try_jobs.""" |
| if not builds: |
| @@ -4902,6 +4913,11 @@ def CMDtry_results(parser, args): |
| help='Host of buildbucket. The default host is %default.') |
| group.add_option( |
| '--json', help='Path of JSON output file to write try job results to.') |
| + group.add_option( |
| + '-w', '--wait-till-finished', action='store_true', default=False, |
| + help='Keep checking buildbucket until either all jobs finish. ' |
|
Michael Achenbach
2016/10/20 09:40:35
nit: remove "either"?
|
| + 'If after 1 hour jobs are still running, aborts and returns error ' |
| + 'code 3.') |
| parser.add_option_group(group) |
| auth.add_auth_options(parser) |
| options, args = parser.parse_args(args) |
| @@ -4929,15 +4945,32 @@ def CMDtry_results(parser, args): |
| 'By default, git cl try-results uses the latest patchset from ' |
| 'codereview, continuing to use patchset %s.\n' % |
| (patchset, cl.GetPatchset(), patchset)) |
| - try: |
| - jobs = fetch_try_jobs(auth_config, cl, options.buildbucket_host, patchset) |
| - except BuildbucketResponseException as ex: |
| - print('Buildbucket error: %s' % ex) |
| - return 1 |
| - if options.json: |
| - write_try_results_json(options.json, jobs) |
| - else: |
| - print_try_jobs(options, jobs) |
| + |
| + start_time = time_time() |
| + while True: |
| + try: |
| + jobs = fetch_try_jobs(auth_config, cl, options.buildbucket_host, patchset) |
| + except BuildbucketResponseException as ex: |
| + print('Buildbucket error: %s' % ex) |
| + return 1 |
| + if options.json: |
| + write_try_results_json(options.json, jobs) |
|
Michael Achenbach
2016/10/20 09:40:35
Does this need to write the json in the loop? How
|
| + else: |
| + print_try_jobs(options, jobs) |
| + if not options.wait_till_finished: |
| + return 0 |
|
Sergiy Byelozyorov
2016/10/19 15:41:13
Please "break", so that if someone chooses to add
|
| + |
| + # Only if --wait-till-finished is specified. |
| + unfinished = _count_unfinished_tryjobs(jobs) |
| + if not unfinished: |
| + return 0 |
|
Sergiy Byelozyorov
2016/10/19 15:41:13
ditto
|
| + passed = time_time() - start_time |
| + print('After %.0f seconds waiting, %d jobs still running\n\n' % |
|
Sergiy Byelozyorov
2016/10/19 15:41:13
Juse use %d instead of %.0f. It will round it to t
|
| + (passed, unfinished)) |
| + if passed > 3600: |
|
Michael Achenbach
2016/10/20 09:40:35
Do you need a limit at all? Is this tool supposed
Sergiy Byelozyorov
2016/10/20 11:44:43
IMHO, this is useful to prevent users forgetting t
|
| + print('Ran for too long, aborting now.') |
| + return 3 |
| + time_sleep(10) # Limit unnecessary load on buildbucket. |
|
Sergiy Byelozyorov
2016/10/19 15:41:13
If the option becomes widely popular, we may have
|
| return 0 |