Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Mach bisect command #19943

Closed
wants to merge 3 commits into from
Closed
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

@@ -24,6 +24,7 @@
os.path.join('python', 'servo', 'post_build_commands.py'),
os.path.join('python', 'servo', 'package_commands.py'),
os.path.join('python', 'servo', 'devenv_commands.py'),
os.path.join('python', 'servo', 'bisect_commands.py'),
]

CATEGORIES = {
@@ -67,6 +68,11 @@
'long': 'Potent potables and assorted snacks.',
'priority': 10,
},
'bisect': {
'short': 'Bisect Commands',
'long': 'Bisect with the nightly versions',
'priority': 5,
},
'disabled': {
'short': 'Disabled',
'long': 'The disabled commands are hidden by default. Use -v to display them. These commands are unavailable '
@@ -0,0 +1,104 @@
# Copyright 2013 The Servo Project Developers. See the COPYRIGHT
# file at the top-level directory of this distribution.
#
# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
# option. This file may not be copied, modified, or distributed
# except according to those terms.

from __future__ import print_function, unicode_literals

import os
import os.path as path
import subprocess
import time
import tarfile

from shutil import copytree, rmtree, copy2
from servo.util import extract, download_file

from mach.decorators import (
CommandArgument,
CommandProvider,
Command,
)

from servo.command_base import CommandBase


def read_file(filename, if_exists=False):
if if_exists and not path.exists(filename):
return None
with open(filename) as f:
return f.read()


@CommandProvider
class BisectCommands(CommandBase):
@Command('bisect',
description='Run Servo using downloaded nightlies',
category='bisect')
@CommandArgument(
'params', nargs='...',
help="Command-line arguments to be passed through to Servo")
def bisect(self, params):
# Run the command
SCRIPT_PATH = os.path.split(__file__)[0]
command_to_run = [os.path.abspath(
os.path.join(SCRIPT_PATH, "..", "..", "mach"))]
command_to_run.extend(params)

print("Wrapping bisect around command {}".format(
" ".join(command_to_run)))
bisect_start = time.time()
self.run_once_with_version(command_to_run, "2017-01-01T01-21-52Z")
bisect_end = time.time()
print("Bisect completed in {} seconds.".format(
round(bisect_end - bisect_start, 2)))

def run_once_with_version(self, command, version):
fetch_version(version)
print("Running command {} with version {} ".format(command, version))
start = time.time()
proc = subprocess.Popen(command)
output = proc.communicate()
if proc.returncode:
print(
"Bisection on nightly {} was bad, trying older version".format(version))
else:
print("Bisection on nightly {} was good, trying newer version".format(
"FOOBAR11234"))
end = time.time()
print("Command {} with servo version {} completed in {} seconds.".format(
command, version, round(end - start, 2)))


def get_all_versions(os):
url = "https://servo-builds.s3.amazonaws.com/?list-type=2&prefix=nightly/linux"


def fetch_version(version):
# Download from
cache_folder = "./nightlies/"
build_name = "-servo-tech-demo"
extension = ".tar.gz"
file_name = version + build_name
destination = cache_folder + file_name + extension
version_folder = cache_folder + file_name
source = "https://servo-builds.s3.amazonaws.com/nightly/linux/" + file_name + extension

if not os.path.exists(cache_folder):
os.mkdir(cache_folder)

if os.path.isfile(destination):
print("The nightly version {} has already been downloaded.".format(version))
else:
download_file(file_name,source, destination)

if os.path.isdir(version_folder):
print("The version {} has already been extracted.".format(version))
else:
print("Extracting to {}...".format(version_folder), end='')
with tarfile.open(destination, "r") as tar:
tar.extractall(version_folder)
@@ -9,6 +9,7 @@

from errno import ENOENT as NO_SUCH_FILE_OR_DIRECTORY
from glob import glob
import shutil
import gzip
import itertools
import locale
@@ -403,6 +404,55 @@ def get_binary_path(self, release, dev, android=False, magicleap=False):
" --release" if release else ""))
sys.exit()

def detach_volume(self, mounted_volume):
print("Detaching volume {}".format(mounted_volume))
try:
subprocess.check_call(['hdiutil', 'detach', mounted_volume])
except subprocess.CalledProcessError as e:
print("Could not detach volume {} : {}".format(mounted_volume, e.returncode))
sys.exit(1)

def detach_volume_if_attached(self, mounted_volume):
if os.path.exists(mounted_volume):
self.detach_volume(mounted_volume)

def mount_dmg(self, dmg_path):
print("Mounting dmg {}".format(dmg_path))
try:
subprocess.check_call(['hdiutil', 'attach', dmg_path])
except subprocess.CalledProcessError as e:
print("Could not mount Servo dmg : {}".format(e.returncode))
sys.exit(1)

def extract_nightly(self, nightlies_folder, destination_folder, destination_file):
print("Extracting to {} ...".format(destination_folder))
if is_macosx():
mounted_volume = path.join(path.sep, "Volumes", "Servo")
self.detach_volume_if_attached(mounted_volume)
self.mount_dmg(destination_file)
# Servo folder is always this one
servo_directory = path.join(path.sep, "Volumes", "Servo", "Servo.app", "Contents", "MacOS")
print("Copying files from {} to {}".format(servo_directory, destination_folder))
shutil.copytree(servo_directory, destination_folder)
self.detach_volume(mounted_volume)
else:
if is_windows():
command = 'msiexec /a {} /qn TARGETDIR={}'.format(
os.path.join(nightlies_folder, destination_file), destination_folder)
if subprocess.call(command, stdout=PIPE, stderr=PIPE) != 0:
print("Could not extract the nightly executable from the msi package.")
sys.exit(1)
else:
with tarfile.open(os.path.join(nightlies_folder, destination_file), "r") as tar:
tar.extractall(destination_folder)

def get_executable(self, destination_folder):
if is_windows():
return path.join(destination_folder, "PFiles", "Mozilla research", "Servo Tech Demo")
if is_linux:
return path.join(destination_folder, "servo", "servo")
return path.join(destination_folder, "servo")

def get_nightly_binary_path(self, nightly_date):
if nightly_date is None:
return
@@ -415,8 +465,7 @@ def get_nightly_binary_path(self, nightly_date):
if is_windows():
os_prefix = "windows-msvc"
if is_macosx():
print("The nightly flag is not supported on mac yet.")
sys.exit(1)
os_prefix = "mac"
nightly_date = nightly_date.strip()
# Fetch the filename to download from the build list
repository_index = NIGHTLY_REPOSITORY_URL + "?list-type=2&prefix=nightly"
@@ -467,23 +516,12 @@ def get_nightly_binary_path(self, nightly_date):

# Extract the downloaded nightly version
if os.path.isdir(destination_folder):
print("The nightly file {} has already been extracted.".format(
print("The nightly folder {} has already been extracted.".format(
destination_folder))
else:
print("Extracting to {} ...".format(destination_folder))
if is_windows():
command = 'msiexec /a {} /qn TARGETDIR={}'.format(
os.path.join(nightlies_folder, destination_file), destination_folder)
if subprocess.call(command, stdout=PIPE, stderr=PIPE) != 0:
print("Could not extract the nightly executable from the msi package.")
sys.exit(1)
else:
with tarfile.open(os.path.join(nightlies_folder, destination_file), "r") as tar:
tar.extractall(destination_folder)
bin_folder = path.join(destination_folder, "servo")
if is_windows():
bin_folder = path.join(destination_folder, "PFiles", "Mozilla research", "Servo Tech Demo")
return path.join(bin_folder, "servo{}".format(BIN_SUFFIX))
self.extract_nightly(nightlies_folder, destination_folder, destination_file)

return self.get_executable(destination_folder)

def needs_gstreamer_env(self, target):
try:
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.