aboutsummaryrefslogtreecommitdiffstats
path: root/python/servo/command_base.py
diff options
context:
space:
mode:
authoro0Ignition0o <jeremy.lempereur@gmail.com>2018-02-04 17:17:09 +0100
committero0Ignition0o <jeremy.lempereur@gmail.com>2018-03-06 23:09:50 +0100
commit10822ce7307bec2c5f1533173ae6880e64ccc122 (patch)
tree0af83176048a2ccb152f07da526840447e5cf671 /python/servo/command_base.py
parent785b7c7775ae13c02556c84a16469efc6c4d71e8 (diff)
downloadservo-10822ce7307bec2c5f1533173ae6880e64ccc122.tar.gz
servo-10822ce7307bec2c5f1533173ae6880e64ccc122.zip
Add a --nightly | -n flag to download and extract a specific nightly version to run mach commands against. This currently only work on linux, but windows and mac os support will follow in subsequent PRs.
Diffstat (limited to 'python/servo/command_base.py')
-rw-r--r--python/servo/command_base.py75
1 files changed, 75 insertions, 0 deletions
diff --git a/python/servo/command_base.py b/python/servo/command_base.py
index ef0e7dacc3f..c6111d72bba 100644
--- a/python/servo/command_base.py
+++ b/python/servo/command_base.py
@@ -21,6 +21,9 @@ import subprocess
from subprocess import PIPE
import sys
import tarfile
+from xml.etree.ElementTree import XML
+from servo.util import download_file
+import urllib2
from mach.registrar import Registrar
import toml
@@ -29,6 +32,7 @@ from servo.packages import WINDOWS_MSVC as msvc_deps
from servo.util import host_triple
BIN_SUFFIX = ".exe" if sys.platform == "win32" else ""
+NIGHTLY_REPOSITORY_URL = "https://servo-builds.s3.amazonaws.com/"
@contextlib.contextmanager
@@ -388,6 +392,77 @@ class CommandBase(object):
" --release" if release else ""))
sys.exit()
+ def get_nightly_binary_path(self, nightly_date):
+ if nightly_date is None:
+ return
+ if not nightly_date:
+ print(
+ "No nightly date has been provided although the --nightly or -n flag has been passed.")
+ sys.exit(1)
+ # Will alow us to fetch the relevant builds from the nightly repository
+ os_prefix = "linux"
+ if is_windows():
+ print("The nightly flag is not supported on windows yet.")
+ sys.exit(1)
+ if is_macosx():
+ print("The nightly flag is not supported on mac yet.")
+ sys.exit(1)
+ nightly_date = nightly_date.strip()
+ # Fetch the filename to download from the build list
+ repository_index = NIGHTLY_REPOSITORY_URL + "?list-type=2&prefix=nightly"
+ req = urllib2.Request(
+ "{}/{}/{}".format(repository_index, os_prefix, nightly_date))
+ try:
+ response = urllib2.urlopen(req).read()
+ tree = XML(response)
+ namespaces = {'ns': tree.tag[1:tree.tag.index('}')]}
+ file_to_download = tree.find('ns:Contents', namespaces).find(
+ 'ns:Key', namespaces).text
+ except urllib2.URLError as e:
+ print("Could not fetch the available nightly versions from the repository : {}".format(
+ e.reason))
+ sys.exit(1)
+ except AttributeError as e:
+ print("Could not fetch a nightly version for date {} and platform {}".format(
+ nightly_date, os_prefix))
+ sys.exit(1)
+
+ nightly_target_directory = path.join(self.context.topdir, "target")
+ # Once extracted, the nightly folder name is the tar name without the extension
+ # (eg /foo/bar/baz.tar.gz extracts to /foo/bar/baz)
+ destination_file = path.join(
+ nightly_target_directory, file_to_download)
+ destination_folder = os.path.splitext(destination_file)[0]
+ nightlies_folder = path.join(
+ nightly_target_directory, 'nightly', os_prefix)
+
+ # Make sure the target directory exists
+ if not os.path.isdir(nightlies_folder):
+ print("The nightly folder for the target does not exist yet. Creating {}".format(
+ nightlies_folder))
+ os.makedirs(nightlies_folder)
+
+ # Download the nightly version
+ if os.path.isfile(path.join(nightlies_folder, destination_file)):
+ print("The nightly file {} has already been downloaded.".format(
+ destination_file))
+ else:
+ print("The nightly {} does not exist yet, downloading it.".format(
+ destination_file))
+ download_file(destination_file, NIGHTLY_REPOSITORY_URL +
+ file_to_download, destination_file)
+
+ # Extract the downloaded nightly version
+ if os.path.isdir(destination_folder):
+ print("The nightly file {} has already been extracted.".format(
+ destination_folder))
+ else:
+ print("Extracting to {}...".format(destination_folder))
+ with tarfile.open(os.path.join(nightlies_folder, destination_file), "r") as tar:
+ tar.extractall(destination_folder)
+
+ return path.join(destination_folder, "servo", "servo")
+
def build_env(self, hosts_file_path=None, target=None, is_build=False, geckolib=False, test_unit=False):
"""Return an extended environment dictionary."""
env = os.environ.copy()