Update GN roller for new JSON endpoints.

Also, improve the error handling to exit cleanly and quickly with error messages
when necessary.

R=hinoka@chromium.org

Review-Url: https://codereview.chromium.org/2819853003
Cr-Original-Commit-Position: refs/heads/master@{#465414}
Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: 53ca11c0fe7bbceeb9af4550c325e22201cbfc06
diff --git a/tools/gn/bin/roll_gn.py b/tools/gn/bin/roll_gn.py
index 91dad7e..7436f4e 100755
--- a/tools/gn/bin/roll_gn.py
+++ b/tools/gn/bin/roll_gn.py
@@ -186,8 +186,7 @@
 
     print('Checking build')
     results = self.CheckBuild()
-    while (len(results) < 3 or
-           any(r['state'] in ('pending', 'started')
+    while (any(r['state'] in ('pending', 'started')
                for r in results.values())):
       print()
       print('Sleeping for 30 seconds')
@@ -228,16 +227,18 @@
     rpc_server = upload.GetRpcServer(CODE_REVIEW_SERVER, email)
     try:
       props = json.loads(rpc_server.Send('/api/%d' % issue))
-    except Exception as _e:
-      raise
+    except Exception as e:
+      print('Failed to load patch data: %s' % e)
+      return {}
 
     patchset = int(props['patchsets'][-1])
 
     try:
       try_job_results = json.loads(rpc_server.Send(
           '/api/%d/%d/try_job_results' % (issue, patchset)))
-    except Exception as _e:
-      raise
+    except Exception as e:
+      print('Failed to load try job results: %s' % e)
+      return {}
 
     if not try_job_results:
       print('No try jobs found on most recent patchset')
@@ -266,8 +267,15 @@
       results.setdefault(platform, {'build': -1, 'sha1': '', 'url': url_str})
 
       if state == 'success':
-        jsurl = url_str.replace('/builders/', '/json/builders/')
-        fp = urllib2.urlopen(jsurl)
+        jsurl = url_str.replace('http://build.chromium.org/',
+                                'http://chrome-build-extract.appspot.com/')
+        jsurl = jsurl + '?json=1'
+        try:
+          fp = urllib2.urlopen(jsurl)
+        except urllib2.HTTPError as e:
+          print('Failed to open %s: %s' % (jsurl, e))
+          return {}
+
         js = json.loads(fp.read())
         fp.close()
         sha1_step_name = 'gn sha1'
@@ -460,7 +468,7 @@
     proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True,
                             cwd=(cwd or self.chromium_src_dir))
     out, err = proc.communicate()
-    return proc.returncode, out, err
+    return proc.returncode, out or '', err or ''
 
 
 if __name__ == '__main__':