Add a --json option to git cl try-results.

For use in scripts that check try job results, this is
currently practically the same as making requests to
https://codereview.chromium.org/api/<cl-number>/<patchset-number>.

However, I think that this might be more future-proof, since
it fetches try job information from Buildbucket, and I expect
to still work after migration from Rietveld to Gerrit.

BUG=640354

Review-Url: https://codereview.chromium.org/2274743003
diff --git a/git_cl.py b/git_cl.py
index a1f58c8..dc6f4cd 100755
--- a/git_cl.py
+++ b/git_cl.py
@@ -398,7 +398,7 @@
 def fetch_try_jobs(auth_config, changelist, options):
   """Fetches try jobs from buildbucket.
 
-  Returns a map from build id to build info as json dictionary.
+  Returns a map from build id to build info as a dictionary.
   """
   rietveld_url = settings.GetDefaultServerUrl()
   rietveld_host = urlparse.urlparse(rietveld_url).hostname
@@ -533,6 +533,31 @@
   print('Total: %d try jobs' % total)
 
 
+def write_try_results_json(output_file, builds):
+  """Writes a subset of the data from fetch_try_jobs to a file as JSON.
+
+  The input |builds| dict is assumed to be generated by Buildbucket.
+  Buildbucket documentation: http://goo.gl/G0s101
+  """
+
+  def convert_build_dict(build):
+    return {
+        'buildbucket_id': build.get('id'),
+        'status': build.get('status'),
+        'result': build.get('result'),
+        'bucket': build.get('bucket'),
+        'builder_name': json.loads(
+            build.get('parameters_json', '{}')).get('builder_name'),
+        'failure_reason': build.get('failure_reason'),
+        'url': build.get('url'),
+    }
+
+  converted = []
+  for _, build in sorted(builds.items()):
+      converted.append(convert_build_dict(build))
+  write_json(output_file, converted)
+
+
 def MatchSvnGlob(url, base_url, glob_spec, allow_wildcards):
   """Return the corresponding git ref if |base_url| together with |glob_spec|
   matches the full |url|.
@@ -4755,6 +4780,8 @@
   group.add_option(
       "--buildbucket-host", default='cr-buildbucket.appspot.com',
       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.')
   parser.add_option_group(group)
   auth.add_auth_options(parser)
   options, args = parser.parse_args(args)
@@ -4783,7 +4810,10 @@
     print('ERROR: Exception when trying to fetch try jobs: %s\n%s' %
           (e, stacktrace))
     return 1
-  print_try_jobs(options, jobs)
+  if options.json:
+    write_try_results_json(options.json, jobs)
+  else:
+    print_try_jobs(options, jobs)
   return 0