Index: tools/bisect-perf-regression.py
|
diff --git a/tools/bisect-perf-regression.py b/tools/bisect-perf-regression.py
|
index 4afe1cf384780ac04528d4a9b81f51e32c0ca8fe..fe1f19a15a60c99199f236e2656ed11941499ace 100755
|
--- a/tools/bisect-perf-regression.py
|
+++ b/tools/bisect-perf-regression.py
|
@@ -35,14 +35,14 @@ An example usage (using git hashes):
|
|
"""
|
|
-
|
-import re
|
-import os
|
+import errno
|
import imp
|
-import sys
|
-import shlex
|
import optparse
|
+import os
|
+import re
|
+import shlex
|
import subprocess
|
+import sys
|
|
|
# The additional repositories that might need to be bisected.
|
@@ -89,6 +89,25 @@ DEPOT_NAMES = DEPOT_DEPS_NAME.keys()
|
|
FILE_DEPS_GIT = '.DEPS.git'
|
|
+GCLIENT_SPEC = """
|
+solutions = [
|
+ { "name" : "src",
|
+ "url" : "https://chromium.googlesource.com/chromium/src.git",
|
+ "deps_file" : ".DEPS.git",
|
+ "managed" : True,
|
+ "custom_deps" : {
|
+ },
|
+ "safesync_url": "",
|
+ },
|
+ { "name" : "src-internal",
|
+ "url" : "ssh://gerrit-int.chromium.org:29419/" +
|
+ "chrome/src-internal.git",
|
+ "deps_file" : ".DEPS.git",
|
+ },
|
+]
|
+"""
|
+GCLIENT_SPEC = ''.join([l for l in GCLIENT_SPEC.splitlines()])
|
+
|
|
|
def IsStringFloat(string_to_check):
|
@@ -1134,6 +1153,84 @@ def DetermineAndCreateSourceControl():
|
return None
|
|
|
+def CreateAndChangeToSourceDirectory(working_directory):
|
+ """Creates a directory 'bisect' as a subdirectory of 'working_directory'. If
|
+ the function is successful, the current working directory will change to that
|
+ of the new 'bisect' directory.
|
+
|
+ Returns:
|
+ True if the directory was successfully created (or already existed).
|
+ """
|
+ cwd = os.getcwd()
|
+ os.chdir(working_directory)
|
+ try:
|
+ os.mkdir('bisect')
|
+ except OSError, e:
|
+ if e.errno != errno.EEXIST:
|
+ return False
|
+ os.chdir('bisect')
|
+ return True
|
+
|
+
|
+def RunGClient(params):
|
+ """Runs gclient with the specified parameters.
|
+
|
+ Args:
|
+ params: A list of parameters to pass to gclient.
|
+
|
+ Returns:
|
+ The return code of the call.
|
+ """
|
+ cmd = ['gclient'] + params
|
+ return subprocess.call(cmd)
|
+
|
+
|
+def RunGClientAndCreateConfig():
|
+ """Runs gclient and creates a config containing both src and src-internal.
|
+
|
+ Returns:
|
+ The return code of the call.
|
+ """
|
+ return_code = RunGClient(
|
+ ['config', '--spec=%s' % GCLIENT_SPEC, '--git-deps'])
|
+ return return_code
|
+
|
+
|
+def RunGClientAndSync():
|
+ """Runs gclient and does a normal sync.
|
+
|
+ Returns:
|
+ The return code of the call.
|
+ """
|
+ return RunGClient(['sync'])
|
+
|
+
|
+def SetupGitDepot(output_buildbot_annotations):
|
+ """Sets up the depot for the bisection. The depot will be located in a
|
+ subdirectory called 'bisect'.
|
+
|
+ Returns:
|
+ True if gclient successfully created the config file and did a sync, False
|
+ otherwise.
|
+ """
|
+ name = 'Setting up Bisection Depot'
|
+
|
+ if output_buildbot_annotations:
|
+ OutputAnnotationStepStart(name)
|
+
|
+ passed = False
|
+
|
+ if not RunGClientAndCreateConfig():
|
+ if not RunGClientAndSync():
|
+ passed = True
|
+
|
+ if output_buildbot_annotations:
|
+ print
|
+ OutputAnnotationStepClosed()
|
+
|
+ return passed
|
+
|
+
|
def main():
|
|
usage = ('%prog [options] [-- chromium-options]\n'
|
@@ -1160,6 +1257,14 @@ def main():
|
type='str',
|
help='The desired metric to bisect on. For example ' +
|
'"vm_rss_final_b/vm_rss_f_b"')
|
+ parser.add_option('-w', '--working_directory',
|
+ type='str',
|
+ help='Path to the working directory where the script will '
|
+ 'do an initial checkout of the chromium depot. The '
|
+ 'files will be placed in a subdirectory "bisect" under '
|
+ 'working_directory and that will be used to perform the '
|
+ 'bisection. This parameter is optional, if it is not '
|
+ 'supplied, the script will work from the current depot.')
|
parser.add_option('--use_goma',
|
action="store_true",
|
help='Add a bunch of extra threads for goma.')
|
@@ -1207,6 +1312,24 @@ def main():
|
print
|
return 1
|
|
+ metric_values = opts.metric.split('/')
|
+ if len(metric_values) != 2:
|
+ print "Invalid metric specified: [%s]" % (opts.metric,)
|
+ print
|
+ return 1
|
+
|
+ if opts.working_directory:
|
+ if not CreateAndChangeToSourceDirectory(opts.working_directory):
|
+ print 'Error: Could not create bisect directory.'
|
+ print
|
+ return 1
|
+
|
+ if not SetupGitDepot(opts.output_buildbot_annotations):
|
+ print 'Error: Failed to grab source.'
|
+ print
|
+ return 1
|
+
|
+ os.chdir(os.path.join(os.getcwd(), 'src'))
|
|
# Check what source control method they're using. Only support git workflow
|
# at the moment.
|
@@ -1223,13 +1346,6 @@ def main():
|
print
|
return 1
|
|
- metric_values = opts.metric.split('/')
|
- if len(metric_values) < 2:
|
- print "Invalid metric specified: [%s]" % (opts.metric,)
|
- print
|
- return 1
|
-
|
-
|
bisect_test = BisectPerformanceMetrics(source_control, opts)
|
bisect_results = bisect_test.Run(opts.command,
|
opts.bad_revision,
|
|