| Index: tools/bisect-perf-regression.py
|
| diff --git a/tools/bisect-perf-regression.py b/tools/bisect-perf-regression.py
|
| index 6b98b4b40dcb34b7b2a7ce3f2b3f10b58fad4743..7daf0e0c3ba028bf008812ff76a4a1454e6d7062 100755
|
| --- a/tools/bisect-perf-regression.py
|
| +++ b/tools/bisect-perf-regression.py
|
| @@ -76,7 +76,7 @@ DEPOT_DEPS_NAME = {
|
| "depends" : None,
|
| "from" : ['cros', 'android-chrome'],
|
| 'viewvc': 'http://src.chromium.org/viewvc/chrome?view=revision&revision=',
|
| - 'deps_var': None
|
| + 'deps_var': 'chromium_rev'
|
| },
|
| 'webkit' : {
|
| "src" : "src/third_party/WebKit",
|
| @@ -688,13 +688,19 @@ def BuildWithVisualStudio(targets):
|
|
|
|
|
| def WriteStringToFile(text, file_name):
|
| - with open(file_name, "w") as f:
|
| - f.write(text)
|
| + try:
|
| + with open(file_name, "w") as f:
|
| + f.write(text)
|
| + except IOError as e:
|
| + raise RuntimeError('Error writing to file [%s]' % file_name )
|
|
|
|
|
| def ReadStringFromFile(file_name):
|
| - with open(file_name) as f:
|
| - return f.read()
|
| + try:
|
| + with open(file_name) as f:
|
| + return f.read()
|
| + except IOError as e:
|
| + raise RuntimeError('Error reading file [%s]' % file_name )
|
|
|
|
|
| def ChangeBackslashToSlashInPatch(diff_text):
|
| @@ -740,8 +746,6 @@ class Builder(object):
|
| if not bisect_utils.SetupPlatformBuildEnvironment(opts):
|
| raise RuntimeError('Failed to set platform environment.')
|
|
|
| - bisect_utils.RunGClient(['runhooks'])
|
| -
|
| @staticmethod
|
| def FromOpts(opts):
|
| builder = None
|
| @@ -1367,23 +1371,47 @@ class BisectPerformanceMetrics(object):
|
|
|
| return bleeding_edge_revision
|
|
|
| - def Get3rdPartyRevisionsFromCurrentRevision(self, depot, revision):
|
| - """Parses the DEPS file to determine WebKit/v8/etc... versions.
|
| + def _ParseRevisionsFromDEPSFileManually(self, deps_file_contents):
|
| + """Manually parses the vars section of the DEPS file to determine
|
| + chromium/blink/etc... revisions.
|
|
|
| Returns:
|
| A dict in the format {depot:revision} if successful, otherwise None.
|
| """
|
| - cwd = os.getcwd()
|
| - self.ChangeToDepotWorkingDirectory(depot)
|
| + # We'll parse the "vars" section of the DEPS file.
|
| + rxp = re.compile('vars = {(?P<vars_body>[^}]+)', re.MULTILINE)
|
| + re_results = rxp.search(deps_file_contents)
|
| + locals = {}
|
|
|
| - results = {}
|
| + if not re_results:
|
| + return None
|
|
|
| - if depot == 'chromium' or depot == 'android-chrome':
|
| + # We should be left with a series of entries in the vars component of
|
| + # the DEPS file with the following format:
|
| + # 'depot_name': 'revision',
|
| + vars_body = re_results.group('vars_body')
|
| + rxp = re.compile("'(?P<depot_body>[\w_-]+)':[\s]+'(?P<rev_body>[\w@]+)'",
|
| + re.MULTILINE)
|
| + re_results = rxp.findall(vars_body)
|
| +
|
| + return dict(re_results)
|
| +
|
| + def _ParseRevisionsFromDEPSFile(self, depot):
|
| + """Parses the local DEPS file to determine blink/skia/v8 revisions which may
|
| + be needed if the bisect recurses into those depots later.
|
| +
|
| + Args:
|
| + depot: Depot being bisected.
|
| +
|
| + Returns:
|
| + A dict in the format {depot:revision} if successful, otherwise None.
|
| + """
|
| + try:
|
| locals = {'Var': lambda _: locals["vars"][_],
|
| 'From': lambda *args: None}
|
| execfile(bisect_utils.FILE_DEPS_GIT, {}, locals)
|
| -
|
| - os.chdir(cwd)
|
| + locals = locals['deps']
|
| + results = {}
|
|
|
| rxp = re.compile(".git@(?P<revision>[a-fA-F0-9]+)")
|
|
|
| @@ -1394,28 +1422,61 @@ class BisectPerformanceMetrics(object):
|
|
|
| if (DEPOT_DEPS_NAME[d]['recurse'] and
|
| depot in DEPOT_DEPS_NAME[d]['from']):
|
| - if (locals['deps'].has_key(DEPOT_DEPS_NAME[d]['src']) or
|
| - locals['deps'].has_key(DEPOT_DEPS_NAME[d]['src_old'])):
|
| - if locals['deps'].has_key(DEPOT_DEPS_NAME[d]['src']):
|
| - re_results = rxp.search(locals['deps'][DEPOT_DEPS_NAME[d]['src']])
|
| + if (locals.has_key(DEPOT_DEPS_NAME[d]['src']) or
|
| + locals.has_key(DEPOT_DEPS_NAME[d]['src_old'])):
|
| + if locals.has_key(DEPOT_DEPS_NAME[d]['src']):
|
| + re_results = rxp.search(locals[DEPOT_DEPS_NAME[d]['src']])
|
| self.depot_cwd[d] = \
|
| os.path.join(self.src_cwd, DEPOT_DEPS_NAME[d]['src'][4:])
|
| - elif locals['deps'].has_key(DEPOT_DEPS_NAME[d]['src_old']):
|
| + elif (DEPOT_DEPS_NAME[d].has_key('src_old') and
|
| + locals.has_key(DEPOT_DEPS_NAME[d]['src_old'])):
|
| re_results = \
|
| - rxp.search(locals['deps'][DEPOT_DEPS_NAME[d]['src_old']])
|
| + rxp.search(locals[DEPOT_DEPS_NAME[d]['src_old']])
|
| self.depot_cwd[d] = \
|
| os.path.join(self.src_cwd, DEPOT_DEPS_NAME[d]['src_old'][4:])
|
|
|
| if re_results:
|
| results[d] = re_results.group('revision')
|
| else:
|
| - print 'Couldn\'t parse revision for %s.' % d
|
| - print
|
| - return None
|
| + warning_text = ('Couldn\'t parse revision for %s while bisecting '
|
| + '%s' % (d, depot))
|
| + if not warningText in self.warnings:
|
| + self.warnings.append(warningText)
|
| else:
|
| print 'Couldn\'t find %s while parsing .DEPS.git.' % d
|
| print
|
| return None
|
| + return results
|
| + except ImportError:
|
| + deps_file_contents = ReadStringFromFile(bisect_utils.FILE_DEPS_GIT)
|
| + parse_results = self._ParseRevisionsFromDEPSFileManually(
|
| + deps_file_contents)
|
| + results = {}
|
| + for depot_name, depot_revision in parse_results.iteritems():
|
| + depot_revision = depot_revision.strip('@')
|
| + print depot_name, depot_revision
|
| + for current_name, current_data in DEPOT_DEPS_NAME.iteritems():
|
| + if (current_data.has_key('deps_var') and
|
| + current_data['deps_var'] == depot_name):
|
| + src_name = current_name
|
| + results[src_name] = depot_revision
|
| + break
|
| + return results
|
| +
|
| + def Get3rdPartyRevisionsFromCurrentRevision(self, depot, revision):
|
| + """Parses the DEPS file to determine WebKit/v8/etc... versions.
|
| +
|
| + Returns:
|
| + A dict in the format {depot:revision} if successful, otherwise None.
|
| + """
|
| + cwd = os.getcwd()
|
| + self.ChangeToDepotWorkingDirectory(depot)
|
| +
|
| + results = {}
|
| +
|
| + if depot == 'chromium' or depot == 'android-chrome':
|
| + results = self._ParseRevisionsFromDEPSFile(depot)
|
| + os.chdir(cwd)
|
| elif depot == 'cros':
|
| cmd = [CROS_SDK_PATH, '--', 'portageq-%s' % self.opts.cros_board,
|
| 'best_visible', '/build/%s' % self.opts.cros_board, 'ebuild',
|
|
|