Index: tools/auto_bisect/bisect_perf_regression.py
|
diff --git a/tools/auto_bisect/bisect_perf_regression.py b/tools/auto_bisect/bisect_perf_regression.py
|
index f41b23d52a2d0f59b87c12eabbc9fe1b085404d4..fd63d88f46317127fc1f28c671d27aed94233b93 100755
|
--- a/tools/auto_bisect/bisect_perf_regression.py
|
+++ b/tools/auto_bisect/bisect_perf_regression.py
|
@@ -36,7 +36,7 @@ import copy
|
import errno
|
import hashlib
|
import logging
|
-import optparse
|
+import argparse
|
import os
|
import re
|
import shlex
|
@@ -62,8 +62,6 @@ from telemetry.util import cloud_storage
|
# The script is in chromium/src/tools/auto_bisect. Throughout this script,
|
# we use paths to other things in the chromium/src repository.
|
|
-CROS_CHROMEOS_PATTERN = 'chromeos-base/chromeos-chrome'
|
-
|
# Possible return values from BisectPerformanceMetrics.RunTest.
|
BUILD_RESULT_SUCCEED = 0
|
BUILD_RESULT_FAIL = 1
|
@@ -663,7 +661,6 @@ class DepotDirectoryRegistry(object):
|
self.SetDepotDir(depot, os.path.join(src_cwd, path_in_src))
|
|
self.SetDepotDir('chromium', src_cwd)
|
- self.SetDepotDir('cros', os.path.join(src_cwd, 'tools', 'cros'))
|
|
def SetDepotDir(self, depot_name, depot_dir):
|
self.depot_cwd[depot_name] = depot_dir
|
@@ -780,17 +777,19 @@ class BisectPerformanceMetrics(object):
|
The main entry-point is the Run method.
|
"""
|
|
- def __init__(self, opts):
|
+ def __init__(self, opts, src_cwd):
|
+ """Constructs a BisectPerformancesMetrics object.
|
+
|
+ Args:
|
+ opts: BisectOptions object containing parsed options.
|
+ src_cwd: Root src/ directory of the test repository (inside bisect/ dir).
|
+ """
|
super(BisectPerformanceMetrics, self).__init__()
|
|
self.opts = opts
|
-
|
- # The src directory here is NOT the src/ directory for the repository
|
- # where the bisect script is running from. Instead, it's the src/ directory
|
- # inside the bisect/ directory which is created before running.
|
- self.src_cwd = os.getcwd()
|
-
|
+ self.src_cwd = src_cwd
|
self.depot_registry = DepotDirectoryRegistry(self.src_cwd)
|
+ self.printer = BisectPrinter(self.opts, self.depot_registry)
|
self.cleanup_commands = []
|
self.warnings = []
|
self.builder = builder.Builder.FromOpts(opts)
|
@@ -808,38 +807,8 @@ class BisectPerformanceMetrics(object):
|
"""Retrieves a list of all the commits between the bad revision and
|
last known good revision."""
|
|
- revision_work_list = []
|
-
|
- if depot == 'cros':
|
- revision_range_start = good_revision
|
- revision_range_end = bad_revision
|
-
|
- cwd = os.getcwd()
|
- self.depot_registry.ChangeToDepotDir('cros')
|
-
|
- # Print the commit timestamps for every commit in the revision time
|
- # range. We'll sort them and bisect by that. There is a remote chance that
|
- # 2 (or more) commits will share the exact same timestamp, but it's
|
- # probably safe to ignore that case.
|
- cmd = ['repo', 'forall', '-c',
|
- 'git log --format=%%ct --before=%d --after=%d' % (
|
- revision_range_end, revision_range_start)]
|
- output, return_code = bisect_utils.RunProcessAndRetrieveOutput(cmd)
|
-
|
- assert not return_code, ('An error occurred while running '
|
- '"%s"' % ' '.join(cmd))
|
-
|
- os.chdir(cwd)
|
-
|
- revision_work_list = list(set(
|
- [int(o) for o in output.split('\n') if bisect_utils.IsStringInt(o)]))
|
- revision_work_list = sorted(revision_work_list, reverse=True)
|
- else:
|
- cwd = self.depot_registry.GetDepotDir(depot)
|
- revision_work_list = source_control.GetRevisionList(bad_revision,
|
- good_revision, cwd=cwd)
|
-
|
- return revision_work_list
|
+ cwd = self.depot_registry.GetDepotDir(depot)
|
+ return source_control.GetRevisionList(bad_revision, good_revision, cwd=cwd)
|
|
def _ParseRevisionsFromDEPSFile(self, depot):
|
"""Parses the local DEPS file to determine blink/skia/v8 revisions which may
|
@@ -920,48 +889,6 @@ class BisectPerformanceMetrics(object):
|
results = self._ParseRevisionsFromDEPSFile(depot)
|
os.chdir(cwd)
|
|
- if depot == 'cros':
|
- cmd = [
|
- bisect_utils.CROS_SDK_PATH,
|
- '--',
|
- 'portageq-%s' % self.opts.cros_board,
|
- 'best_visible',
|
- '/build/%s' % self.opts.cros_board,
|
- 'ebuild',
|
- CROS_CHROMEOS_PATTERN
|
- ]
|
- output, return_code = bisect_utils.RunProcessAndRetrieveOutput(cmd)
|
-
|
- assert not return_code, ('An error occurred while running '
|
- '"%s"' % ' '.join(cmd))
|
-
|
- if len(output) > CROS_CHROMEOS_PATTERN:
|
- output = output[len(CROS_CHROMEOS_PATTERN):]
|
-
|
- if len(output) > 1:
|
- output = output.split('_')[0]
|
-
|
- if len(output) > 3:
|
- contents = output.split('.')
|
-
|
- version = contents[2]
|
-
|
- if contents[3] != '0':
|
- warningText = ('Chrome version: %s.%s but using %s.0 to bisect.' %
|
- (version, contents[3], version))
|
- if not warningText in self.warnings:
|
- self.warnings.append(warningText)
|
-
|
- cwd = os.getcwd()
|
- self.depot_registry.ChangeToDepotDir('chromium')
|
- cmd = ['log', '-1', '--format=%H',
|
- '--author=chrome-release@google.com',
|
- '--grep=to %s' % version, 'origin/master']
|
- return_code = bisect_utils.CheckRunGit(cmd)
|
- os.chdir(cwd)
|
-
|
- results['chromium'] = output.strip()
|
-
|
if depot == 'v8':
|
# We can't try to map the trunk revision to bleeding edge yet, because
|
# we don't know which direction to try to search in. Have to wait until
|
@@ -1479,9 +1406,6 @@ class BisectPerformanceMetrics(object):
|
# If running a Telemetry test for Chrome OS, insert the remote IP and
|
# identity parameters.
|
is_telemetry = bisect_utils.IsTelemetryCommand(command_to_run)
|
- if self.opts.target_platform == 'cros' and is_telemetry:
|
- args.append('--remote=%s' % self.opts.cros_remote_ip)
|
- args.append('--identity=%s' % bisect_utils.CROS_TEST_KEY_PATH)
|
|
start_time = time.time()
|
|
@@ -1595,8 +1519,7 @@ class BisectPerformanceMetrics(object):
|
"""
|
revisions_to_sync = [[depot, revision]]
|
|
- is_base = ((depot == 'chromium') or (depot == 'cros') or
|
- (depot == 'android-chrome'))
|
+ is_base = ((depot == 'chromium') or (depot == 'android-chrome'))
|
|
# Some SVN depots were split into multiple git depots, so we need to
|
# figure out for each mirror which git revision to grab. There's no
|
@@ -1636,46 +1559,7 @@ class BisectPerformanceMetrics(object):
|
path_to_file = os.path.join(path, cur_file)
|
os.remove(path_to_file)
|
|
- def PerformCrosChrootCleanup(self):
|
- """Deletes the chroot.
|
-
|
- Returns:
|
- True if successful.
|
- """
|
- cwd = os.getcwd()
|
- self.depot_registry.ChangeToDepotDir('cros')
|
- cmd = [bisect_utils.CROS_SDK_PATH, '--delete']
|
- return_code = bisect_utils.RunProcess(cmd)
|
- os.chdir(cwd)
|
- return not return_code
|
-
|
- def CreateCrosChroot(self):
|
- """Creates a new chroot.
|
-
|
- Returns:
|
- True if successful.
|
- """
|
- cwd = os.getcwd()
|
- self.depot_registry.ChangeToDepotDir('cros')
|
- cmd = [bisect_utils.CROS_SDK_PATH, '--create']
|
- return_code = bisect_utils.RunProcess(cmd)
|
- os.chdir(cwd)
|
- return not return_code
|
-
|
- def _PerformPreSyncCleanup(self, depot):
|
- """Performs any necessary cleanup before syncing.
|
-
|
- Args:
|
- depot: Depot name.
|
-
|
- Returns:
|
- True if successful.
|
- """
|
- if depot == 'cros':
|
- return self.PerformCrosChrootCleanup()
|
- return True
|
-
|
- def _RunPostSync(self, depot):
|
+ def _RunPostSync(self, _depot):
|
"""Performs any work after syncing.
|
|
Args:
|
@@ -1689,11 +1573,7 @@ class BisectPerformanceMetrics(object):
|
path_to_src=self.src_cwd):
|
return False
|
|
- if depot == 'cros':
|
- return self.CreateCrosChroot()
|
- else:
|
- return self.RunGClientHooks()
|
- return True
|
+ return self.RunGClientHooks()
|
|
@staticmethod
|
def ShouldSkipRevision(depot, revision):
|
@@ -1737,17 +1617,12 @@ class BisectPerformanceMetrics(object):
|
sync_client = None
|
if depot == 'chromium' or depot == 'android-chrome':
|
sync_client = 'gclient'
|
- elif depot == 'cros':
|
- sync_client = 'repo'
|
|
# Decide what depots will need to be synced to what revisions.
|
revisions_to_sync = self._FindAllRevisionsToSync(revision, depot)
|
if not revisions_to_sync:
|
return ('Failed to resolve dependent depots.', BUILD_RESULT_FAIL)
|
|
- if not self._PerformPreSyncCleanup(depot):
|
- return ('Failed to perform pre-sync cleanup.', BUILD_RESULT_FAIL)
|
-
|
# Do the syncing for all depots.
|
if not self.opts.debug_ignore_sync:
|
if not self._SyncAllRevisions(revisions_to_sync, sync_client):
|
@@ -1802,7 +1677,7 @@ class BisectPerformanceMetrics(object):
|
|
Args:
|
revisions_to_sync: A list of (depot, revision) pairs to be synced.
|
- sync_client: Program used to sync, e.g. "gclient", "repo". Can be None.
|
+ sync_client: Program used to sync, e.g. "gclient". Can be None.
|
|
Returns:
|
True if successful, False otherwise.
|
@@ -2209,14 +2084,9 @@ class BisectPerformanceMetrics(object):
|
Returns:
|
True if the revisions are in the proper order (good earlier than bad).
|
"""
|
- if target_depot != 'cros':
|
- cwd = self.depot_registry.GetDepotDir(target_depot)
|
- good_position = source_control.GetCommitPosition(good_revision, cwd)
|
- bad_position = source_control.GetCommitPosition(bad_revision, cwd)
|
- else:
|
- # CrOS and SVN use integers.
|
- good_position = int(good_revision)
|
- bad_position = int(bad_revision)
|
+ cwd = self.depot_registry.GetDepotDir(target_depot)
|
+ good_position = source_control.GetCommitPosition(good_revision, cwd)
|
+ bad_position = source_control.GetCommitPosition(bad_revision, cwd)
|
|
return good_position <= bad_position
|
|
@@ -2276,9 +2146,7 @@ class BisectPerformanceMetrics(object):
|
"""
|
# Choose depot to bisect first
|
target_depot = 'chromium'
|
- if self.opts.target_platform == 'cros':
|
- target_depot = 'cros'
|
- elif self.opts.target_platform == 'android-chrome':
|
+ if self.opts.target_platform == 'android-chrome':
|
target_depot = 'android-chrome'
|
|
cwd = os.getcwd()
|
@@ -2405,8 +2273,6 @@ class BisectPerformanceMetrics(object):
|
good_revision_state.passed = True
|
good_revision_state.value = known_good_value
|
|
- bisect_printer = BisectPrinter(self.opts, self.depot_registry)
|
-
|
# Check how likely it is that the good and bad results are different
|
# beyond chance-induced variation.
|
confidence_error = False
|
@@ -2434,7 +2300,7 @@ class BisectPerformanceMetrics(object):
|
next_revision_index = min_revision
|
elif max_revision_state.passed == '?':
|
next_revision_index = max_revision
|
- elif current_depot in ['android-chrome', 'cros', 'chromium', 'v8']:
|
+ elif current_depot in ['android-chrome', 'chromium', 'v8']:
|
previous_revision = revision_states[min_revision].revision
|
# If there were changes to any of the external libraries we track,
|
# should bisect the changes there as well.
|
@@ -2531,7 +2397,7 @@ class BisectPerformanceMetrics(object):
|
max_revision -= 1
|
|
if self.opts.output_buildbot_annotations:
|
- bisect_printer.PrintPartialResults(bisect_state)
|
+ self.printer.PrintPartialResults(bisect_state)
|
bisect_utils.OutputAnnotationStepClosed()
|
|
return BisectResults(bisect_state, self.depot_registry, self.opts,
|
@@ -2597,8 +2463,6 @@ class BisectOptions(object):
|
self.use_goma = None
|
self.goma_dir = None
|
self.goma_threads = 64
|
- self.cros_board = None
|
- self.cros_remote_ip = None
|
self.repeat_test_count = 20
|
self.truncate_percent = 25
|
self.max_time_minutes = 20
|
@@ -2622,7 +2486,128 @@ class BisectOptions(object):
|
self.improvement_direction = 0
|
|
@staticmethod
|
- def _CreateCommandLineParser():
|
+ def _AddBisectOptionsGroup(parser):
|
+ group = parser.add_argument_group('Bisect options')
|
+ group.add_argument('-c', '--command', required=True,
|
+ help='A command to execute your performance test at '
|
+ 'each point in the bisection.')
|
+ group.add_argument('-b', '--bad_revision', required=True,
|
+ help='A bad revision to start bisection. Must be later '
|
+ 'than good revision. May be either a git or svn '
|
+ 'revision.')
|
+ group.add_argument('-g', '--good_revision', required=True,
|
+ help='A revision to start bisection where performance '
|
+ 'test is known to pass. Must be earlier than the '
|
+ 'bad revision. May be either a git or a svn '
|
+ 'revision.')
|
+ group.add_argument('-m', '--metric',
|
+ help='The desired metric to bisect on. For example '
|
+ '"vm_rss_final_b/vm_rss_f_b"')
|
+ group.add_argument('-d', '--improvement_direction', type=int, default=0,
|
+ help='An integer number representing the direction of '
|
+ 'improvement. 1 for higher is better, -1 for lower '
|
+ 'is better, 0 for ignore (default).')
|
+ group.add_argument('-r', '--repeat_test_count', type=int, default=20,
|
+ choices=range(1, 101),
|
+ help='The number of times to repeat the performance '
|
+ 'test. Values will be clamped to range [1, 100]. '
|
+ 'Default value is 20.')
|
+ group.add_argument('--max_time_minutes', type=int, default=20,
|
+ choices=range(1, 61),
|
+ help='The maximum time (in minutes) to take running the '
|
+ 'performance tests. The script will run the '
|
+ 'performance tests according to '
|
+ '--repeat_test_count, so long as it doesn\'t exceed'
|
+ ' --max_time_minutes. Values will be clamped to '
|
+ 'range [1, 60]. Default value is 20.')
|
+ group.add_argument('-t', '--truncate_percent', type=int, default=25,
|
+ help='The highest/lowest % are discarded to form a '
|
+ 'truncated mean. Values will be clamped to range '
|
+ '[0, 25]. Default value is 25 (highest/lowest 25% '
|
+ 'will be discarded).')
|
+ group.add_argument('--bisect_mode', default=bisect_utils.BISECT_MODE_MEAN,
|
+ choices=[bisect_utils.BISECT_MODE_MEAN,
|
+ bisect_utils.BISECT_MODE_STD_DEV,
|
+ bisect_utils.BISECT_MODE_RETURN_CODE],
|
+ help='The bisect mode. Choices are to bisect on the '
|
+ 'difference in mean, std_dev, or return_code.')
|
+
|
+ @staticmethod
|
+ def _AddBuildOptionsGroup(parser):
|
+ group = parser.add_argument_group('Build options')
|
+ group.add_argument('-w', '--working_directory',
|
+ 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.')
|
+ group.add_argument('--build_preference', type='choice',
|
+ choices=['msvs', 'ninja', 'make'],
|
+ help='The preferred build system to use. On linux/mac '
|
+ 'the options are make/ninja. On Windows, the '
|
+ 'options are msvs/ninja.')
|
+ group.add_argument('--target_platform', type='choice', default='chromium',
|
+ choices=['chromium', 'android', 'android-chrome'],
|
+ help='The target platform. Choices are "chromium" '
|
+ '(current platform), or "android". If you specify '
|
+ 'something other than "chromium", you must be '
|
+ 'properly set up to build that platform.')
|
+ group.add_argument('--no_custom_deps', dest='no_custom_deps',
|
+ action='store_true', default=False,
|
+ help='Run the script with custom_deps or not.')
|
+ group.add_argument('--extra_src',
|
+ help='Path to a script which can be used to modify the '
|
+ 'bisect script\'s behavior.')
|
+ group.add_argument('--use_goma', action='store_true',
|
+ help='Add a bunch of extra threads for goma, and enable '
|
+ 'goma')
|
+ group.add_argument('--goma_dir',
|
+ help='Path to goma tools (or system default if not '
|
+ 'specified).')
|
+ group.add_argument('--goma_threads', type=int, default='64',
|
+ help='Number of threads for goma, only if using goma.')
|
+ group.add_argument('--output_buildbot_annotations', action='store_true',
|
+ help='Add extra annotation output for buildbot.')
|
+ group.add_argument('--gs_bucket', default='', dest='gs_bucket',
|
+ help='Name of Google Storage bucket to upload or '
|
+ 'download build. e.g., chrome-perf')
|
+ group.add_argument('--target_arch', type='choice', default='ia32',
|
+ dest='target_arch', choices=['ia32', 'x64', 'arm'],
|
+ help='The target build architecture. Choices are "ia32" '
|
+ '(default), "x64" or "arm".')
|
+ group.add_argument('--target_build_type', type='choice', default='Release',
|
+ choices=['Release', 'Debug'],
|
+ help='The target build type. Choices are "Release" '
|
+ '(default), or "Debug".')
|
+ group.add_argument('--builder_host', dest='builder_host',
|
+ help='Host address of server to produce build by '
|
+ 'posting try job request.')
|
+ group.add_argument('--builder_port', dest='builder_port', type='int',
|
+ help='HTTP port of the server to produce build by '
|
+ 'posting try job request.')
|
+
|
+ @staticmethod
|
+ def _AddDebugOptionsGroup(parser):
|
+ group = parser.add_argument_group('Debug options')
|
+ group.add_argument('--debug_ignore_build', action='store_true',
|
+ help='DEBUG: Don\'t perform builds.')
|
+ group.add_argument('--debug_ignore_sync', action='store_true',
|
+ help='DEBUG: Don\'t perform syncs.')
|
+ group.add_argument('--debug_ignore_perf_test', action='store_true',
|
+ help='DEBUG: Don\'t perform performance tests.')
|
+ group.add_argument('--debug_ignore_regression_confidence',
|
+ action='store_true',
|
+ help='DEBUG: Don\'t score the confidence of the initial '
|
+ 'good and bad revisions\' test results.')
|
+ group.add_argument('--debug_fake_first_test_mean', type='int', default='0',
|
+ help='DEBUG: When faking performance tests, return this '
|
+ 'value as the mean of the first performance test, '
|
+ 'and return a mean of 0.0 for further tests.')
|
+ return group
|
+
|
+ @classmethod
|
+ def _CreateCommandLineParser(cls):
|
"""Creates a parser with bisect options.
|
|
Returns:
|
@@ -2632,169 +2617,10 @@ class BisectOptions(object):
|
'Perform binary search on revision history to find a minimal '
|
'range of revisions where a performance metric regressed.\n')
|
|
- parser = optparse.OptionParser(usage=usage)
|
-
|
- group = optparse.OptionGroup(parser, 'Bisect options')
|
- group.add_option('-c', '--command',
|
- type='str',
|
- help='A command to execute your performance test at' +
|
- ' each point in the bisection.')
|
- group.add_option('-b', '--bad_revision',
|
- type='str',
|
- help='A bad revision to start bisection. ' +
|
- 'Must be later than good revision. May be either a git' +
|
- ' or svn revision.')
|
- group.add_option('-g', '--good_revision',
|
- type='str',
|
- help='A revision to start bisection where performance' +
|
- ' test is known to pass. Must be earlier than the ' +
|
- 'bad revision. May be either a git or svn revision.')
|
- group.add_option('-m', '--metric',
|
- type='str',
|
- help='The desired metric to bisect on. For example ' +
|
- '"vm_rss_final_b/vm_rss_f_b"')
|
- group.add_option('-d', '--improvement_direction',
|
- type='int',
|
- default=0,
|
- help='An integer number representing the direction of ' +
|
- 'improvement. 1 for higher is better, -1 for lower is ' +
|
- 'better, 0 for ignore (default).')
|
- group.add_option('-r', '--repeat_test_count',
|
- type='int',
|
- default=20,
|
- help='The number of times to repeat the performance '
|
- 'test. Values will be clamped to range [1, 100]. '
|
- 'Default value is 20.')
|
- group.add_option('--max_time_minutes',
|
- type='int',
|
- default=20,
|
- help='The maximum time (in minutes) to take running the '
|
- 'performance tests. The script will run the performance '
|
- 'tests according to --repeat_test_count, so long as it '
|
- 'doesn\'t exceed --max_time_minutes. Values will be '
|
- 'clamped to range [1, 60].'
|
- 'Default value is 20.')
|
- group.add_option('-t', '--truncate_percent',
|
- type='int',
|
- default=25,
|
- help='The highest/lowest % are discarded to form a '
|
- 'truncated mean. Values will be clamped to range [0, '
|
- '25]. Default value is 25 (highest/lowest 25% will be '
|
- 'discarded).')
|
- group.add_option('--bisect_mode',
|
- type='choice',
|
- choices=[bisect_utils.BISECT_MODE_MEAN,
|
- bisect_utils.BISECT_MODE_STD_DEV,
|
- bisect_utils.BISECT_MODE_RETURN_CODE],
|
- default=bisect_utils.BISECT_MODE_MEAN,
|
- help='The bisect mode. Choices are to bisect on the '
|
- 'difference in mean, std_dev, or return_code.')
|
- parser.add_option_group(group)
|
-
|
- group = optparse.OptionGroup(parser, 'Build options')
|
- group.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.')
|
- group.add_option('--build_preference',
|
- type='choice',
|
- choices=['msvs', 'ninja', 'make'],
|
- help='The preferred build system to use. On linux/mac '
|
- 'the options are make/ninja. On Windows, the options '
|
- 'are msvs/ninja.')
|
- group.add_option('--target_platform',
|
- type='choice',
|
- choices=['chromium', 'cros', 'android', 'android-chrome'],
|
- default='chromium',
|
- help='The target platform. Choices are "chromium" '
|
- '(current platform), "cros", or "android". If you '
|
- 'specify something other than "chromium", you must be '
|
- 'properly set up to build that platform.')
|
- group.add_option('--no_custom_deps',
|
- dest='no_custom_deps',
|
- action='store_true',
|
- default=False,
|
- help='Run the script with custom_deps or not.')
|
- group.add_option('--extra_src',
|
- type='str',
|
- help='Path to a script which can be used to modify '
|
- 'the bisect script\'s behavior.')
|
- group.add_option('--cros_board',
|
- type='str',
|
- help='The cros board type to build.')
|
- group.add_option('--cros_remote_ip',
|
- type='str',
|
- help='The remote machine to image to.')
|
- group.add_option('--use_goma',
|
- action='store_true',
|
- help='Add a bunch of extra threads for goma, and enable '
|
- 'goma')
|
- group.add_option('--goma_dir',
|
- help='Path to goma tools (or system default if not '
|
- 'specified).')
|
- group.add_option('--goma_threads',
|
- type='int',
|
- default='64',
|
- help='Number of threads for goma, only if using goma.')
|
- group.add_option('--output_buildbot_annotations',
|
- action='store_true',
|
- help='Add extra annotation output for buildbot.')
|
- group.add_option('--gs_bucket',
|
- default='',
|
- dest='gs_bucket',
|
- type='str',
|
- help=('Name of Google Storage bucket to upload or '
|
- 'download build. e.g., chrome-perf'))
|
- group.add_option('--target_arch',
|
- type='choice',
|
- choices=['ia32', 'x64', 'arm'],
|
- default='ia32',
|
- dest='target_arch',
|
- help=('The target build architecture. Choices are "ia32" '
|
- '(default), "x64" or "arm".'))
|
- group.add_option('--target_build_type',
|
- type='choice',
|
- choices=['Release', 'Debug'],
|
- default='Release',
|
- help='The target build type. Choices are "Release" '
|
- '(default), or "Debug".')
|
- group.add_option('--builder_host',
|
- dest='builder_host',
|
- type='str',
|
- help=('Host address of server to produce build by posting'
|
- ' try job request.'))
|
- group.add_option('--builder_port',
|
- dest='builder_port',
|
- type='int',
|
- help=('HTTP port of the server to produce build by posting'
|
- ' try job request.'))
|
- parser.add_option_group(group)
|
-
|
- group = optparse.OptionGroup(parser, 'Debug options')
|
- group.add_option('--debug_ignore_build',
|
- action='store_true',
|
- help='DEBUG: Don\'t perform builds.')
|
- group.add_option('--debug_ignore_sync',
|
- action='store_true',
|
- help='DEBUG: Don\'t perform syncs.')
|
- group.add_option('--debug_ignore_perf_test',
|
- action='store_true',
|
- help='DEBUG: Don\'t perform performance tests.')
|
- group.add_option('--debug_ignore_regression_confidence',
|
- action='store_true',
|
- help='DEBUG: Don\'t score the confidence of the initial '
|
- 'good and bad revisions\' test results.')
|
- group.add_option('--debug_fake_first_test_mean',
|
- type='int',
|
- default='0',
|
- help=('DEBUG: When faking performance tests, return this '
|
- 'value as the mean of the first performance test, '
|
- 'and return a mean of 0.0 for further tests.'))
|
- parser.add_option_group(group)
|
+ parser = argparse.ArgumentParser(usage=usage)
|
+ cls._AddBisectOptionsGroup(parser)
|
+ cls._AddBuildOptionsGroup(parser)
|
+ cls._AddDebugOptionsGroup(parser)
|
return parser
|
|
def ParseCommandLine(self):
|
@@ -2803,15 +2629,6 @@ class BisectOptions(object):
|
opts, _ = parser.parse_args()
|
|
try:
|
- if not opts.command:
|
- raise RuntimeError('missing required parameter: --command')
|
-
|
- if not opts.good_revision:
|
- raise RuntimeError('missing required parameter: --good_revision')
|
-
|
- if not opts.bad_revision:
|
- raise RuntimeError('missing required parameter: --bad_revision')
|
-
|
if (not opts.metric and
|
opts.bisect_mode != bisect_utils.BISECT_MODE_RETURN_CODE):
|
raise RuntimeError('missing required parameter: --metric')
|
@@ -2825,20 +2642,6 @@ class BisectOptions(object):
|
if not opts.builder_port:
|
raise RuntimeError('Must specify try server port number using '
|
'--builder_port when gs_bucket is used.')
|
- if opts.target_platform == 'cros':
|
- # Run sudo up front to make sure credentials are cached for later.
|
- print 'Sudo is required to build cros:'
|
- print
|
- bisect_utils.RunProcess(['sudo', 'true'])
|
-
|
- if not opts.cros_board:
|
- raise RuntimeError('missing required parameter: --cros_board')
|
-
|
- if not opts.cros_remote_ip:
|
- raise RuntimeError('missing required parameter: --cros_remote_ip')
|
-
|
- if not opts.working_directory:
|
- raise RuntimeError('missing required parameter: --working_directory')
|
|
if opts.bisect_mode != bisect_utils.BISECT_MODE_RETURN_CODE:
|
metric_values = opts.metric.split('/')
|
@@ -2846,10 +2649,7 @@ class BisectOptions(object):
|
raise RuntimeError('Invalid metric specified: [%s]' % opts.metric)
|
opts.metric = metric_values
|
|
- opts.repeat_test_count = min(max(opts.repeat_test_count, 1), 100)
|
- opts.max_time_minutes = min(max(opts.max_time_minutes, 1), 60)
|
- opts.truncate_percent = min(max(opts.truncate_percent, 0), 25)
|
- opts.truncate_percent = opts.truncate_percent / 100.0
|
+ opts.truncate_percent = min(max(opts.truncate_percent, 0), 25) / 100.0
|
|
for k, v in opts.__dict__.iteritems():
|
assert hasattr(self, k), 'Invalid %s attribute in BisectOptions.' % k
|
@@ -2936,14 +2736,13 @@ def main():
|
not opts.debug_ignore_sync and
|
not opts.working_directory):
|
raise RuntimeError('You must switch to master branch to run bisection.')
|
- bisect_test = BisectPerformanceMetrics(opts)
|
- bisect_printer = BisectPrinter(opts, bisect_test.depot_registry)
|
+ bisect_test = BisectPerformanceMetrics(opts, os.getcwd())
|
try:
|
results = bisect_test.Run(opts.command, opts.bad_revision,
|
opts.good_revision, opts.metric)
|
if results.error:
|
raise RuntimeError(results.error)
|
- bisect_printer.FormatAndPrintResults(results)
|
+ bisect_test.printer.FormatAndPrintResults(results)
|
return 0
|
finally:
|
bisect_test.PerformCleanup()
|
|