Index: testing_support/local_rietveld.py |
diff --git a/testing_support/local_rietveld.py b/testing_support/local_rietveld.py |
index 41b0166bf3c22a98774d24b0c27a70a36be3a229..77fc4db3f1249a7264f2780a2d23676d675dd5a5 100755 |
--- a/testing_support/local_rietveld.py |
+++ b/testing_support/local_rietveld.py |
@@ -10,6 +10,7 @@ It makes sure Google AppEngine SDK is found, download Rietveld and Django code |
if necessary and starts the server on a free inbound TCP port. |
""" |
+import base64 |
import logging |
import optparse |
import os |
@@ -18,6 +19,13 @@ import socket |
import sys |
import tempfile |
import time |
+import urllib2 |
+ |
+ |
+INSTALL_GOOGLE_APPENGINE_HASH = 'f849aad85ac3589c931197bff861faf0e2ef0ece' |
+INSTALL_GOOGLE_APPENGINE_URL = ( |
+ 'https://chromium.googlesource.com/infra/infra/+/%s' |
+ '/bootstrap/get_appengine.py?format=TEXT' % INSTALL_GOOGLE_APPENGINE_HASH) |
pgervais
2015/05/28 20:51:46
Downloading code before executing it is dangerous.
|
try: |
import subprocess2 |
@@ -63,23 +71,38 @@ class LocalRietveld(object): |
self.test_server = None |
self.port = None |
self.tempdir = None |
+ self.dev_app = None |
- # Find the GAE SDK |
- previous_dir = '' |
- self.sdk_path = '' |
- base_dir = self.base_dir |
- while base_dir != previous_dir: |
- previous_dir = base_dir |
- self.sdk_path = os.path.join(base_dir, 'google_appengine') |
- if not os.path.isfile(os.path.join(self.sdk_path, 'VERSION')): |
- base_dir = os.path.dirname(base_dir) |
- self.dev_app = os.path.join(self.sdk_path, 'dev_appserver.py') |
+ def urlfetch(self, url): |
+ req = urllib2.Request(url) |
+ req.add_header('User-Agent', 'depot_tools local_rietveld.py') |
+ for i in range(4): |
pgervais
2015/05/28 20:51:46
Please use an exponential backoff here.
|
+ try: |
+ return urllib2.urlopen(req).read() |
+ except urllib2.URLError: |
+ if i == 3: |
+ raise |
+ |
+ def download_base64_and_run(self, url, dest, args=None): |
+ with open(dest, 'wb') as f: |
+ f.write(base64.b64decode(self.urlfetch(url))) |
+ os.chmod(dest, 0755) |
+ cmd = [dest] |
+ if args: |
+ cmd.extend(args) |
+ try: |
+ subprocess2.check_call(cmd) |
+ except (OSError, subprocess2.CalledProcessError), e: |
+ raise Failure('Failed to run %s\n%s' % (cmd, e)) |
def install_prerequisites(self): |
- # First, verify the Google AppEngine SDK is available. |
- if not os.path.isfile(self.dev_app): |
- raise Failure( |
- 'Install google_appengine sdk in %s or higher up' % self.base_dir) |
+ # First, install the Google AppEngine SDK. |
+ self.download_base64_and_run( |
+ INSTALL_GOOGLE_APPENGINE_URL, |
+ '/tmp/get_appengine.py', |
+ ['--dest=%s' % self.base_dir]) |
+ sdk_path = os.path.join(self.base_dir, 'google_appengine') |
+ self.dev_app = os.path.join(sdk_path, 'dev_appserver.py') |
if os.path.isdir(os.path.join(self.rietveld, '.hg')): |
# Left over from mercurial. Delete it. |