| Index: appengine/findit/waterfall/extract_deps_info_pipeline.py
|
| diff --git a/appengine/findit/waterfall/extract_deps_info_pipeline.py b/appengine/findit/waterfall/extract_deps_info_pipeline.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7104e6c93651fbb68372488250a6cf993b152a9a
|
| --- /dev/null
|
| +++ b/appengine/findit/waterfall/extract_deps_info_pipeline.py
|
| @@ -0,0 +1,134 @@
|
| +# Copyright 2015 The Chromium Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +import logging
|
| +
|
| +from common import chromium_deps
|
| +from waterfall.base_pipeline import BasePipeline
|
| +
|
| +
|
| +def _GetOSPlatformName(master_name, builder_name): # pragma: no cover
|
| + """Returns the OS platform name based on the master and builder."""
|
| + # TODO: make buildbot yield OS platform name as a build property and use it.
|
| + # The code below is just a workaround.
|
| + builder_name = builder_name.lower()
|
| + if master_name == 'chromium.win':
|
| + return 'win'
|
| + elif master_name == 'chromium.linux':
|
| + if 'android' in builder_name:
|
| + return 'android'
|
| + else:
|
| + return 'unix'
|
| + elif master_name == 'chromium.chromiumos':
|
| + return 'unix'
|
| + else:
|
| + os_map = {
|
| + 'win': 'win',
|
| + 'linux': 'unix',
|
| + 'chromiumos': 'unix',
|
| + 'chromeos': 'unix',
|
| + 'android': 'android',
|
| + 'mac': 'mac',
|
| + 'ios': 'ios',
|
| + }
|
| + for os_name in os_map.keys():
|
| + if os_name in builder_name:
|
| + return os_map[os_name]
|
| +
|
| + logging.warn('Failed to detect the OS platform of builder "%s".',
|
| + builder_name)
|
| + return 'all' # Default to all platform.
|
| +
|
| +
|
| +def _GetDependencies(chromium_revision, os_platform):
|
| + """Returns the dependencies used by the specified chromium revision."""
|
| + deps = {}
|
| + for path, dependency in chromium_deps.GetChromeDependency(
|
| + chromium_revision, os_platform).iteritems():
|
| + deps[path] = {
|
| + 'repo_url': dependency.repo_url,
|
| + 'revision': dependency.revision,
|
| + }
|
| +
|
| + return deps
|
| +
|
| +
|
| +def _DetectDEPSRolls(change_logs, os_platform):
|
| + """Detect DEPS rolls in the given CL change logs.
|
| +
|
| + Args:
|
| + change_logs (dict): Output of pipeline PullChangelogPipeline.run().
|
| +
|
| + Returns:
|
| + A dict in the following form:
|
| + {
|
| + 'git_revision': [
|
| + {
|
| + 'path': 'src/path/to/dependency/',
|
| + 'repo_url': 'https://url/to/dependency/repo.git',
|
| + 'new_revision': 'git_hash1',
|
| + 'old_revision': 'git_hash2',
|
| + },
|
| + ...
|
| + ],
|
| + ...
|
| + }
|
| + """
|
| + deps_rolls = {}
|
| + for revision, change_log in change_logs.iteritems():
|
| + # Check DEPS roll only if the chromium DEPS file is changed by the CL.
|
| + for touched_file in change_log['touched_files']:
|
| + if touched_file['new_path'] == 'DEPS':
|
| + # In git, r^ refers to the previous revision of r.
|
| + old_revision = '%s^' % revision
|
| + rolls = chromium_deps.GetChromiumDEPSRolls(
|
| + old_revision, revision, os_platform)
|
| + deps_rolls[revision] = [roll.ToDict() for roll in rolls]
|
| + break
|
| +
|
| + return deps_rolls
|
| +
|
| +
|
| +class ExtractDEPSInfoPipeline(BasePipeline):
|
| + """A pipeline to extract information of DEPS and dependency rolls."""
|
| +
|
| + # Arguments number differs from overridden method - pylint: disable=W0221
|
| + def run(self, failure_info, change_logs):
|
| + """
|
| + Args:
|
| + failure_info (dict): Output of pipeline DetectFirstFailurePipeline.run().
|
| + change_logs (dict): Output of pipeline PullChangelogPipeline.run().
|
| +
|
| + Returns:
|
| + A dict with the following form:
|
| + {
|
| + 'deps': {
|
| + 'path/to/dependency/': {
|
| + 'revision': 'git_hash',
|
| + 'repo_url': 'https://url/to/dependency/repo.git',
|
| + },
|
| + ...
|
| + },
|
| + 'deps_rolls': {
|
| + 'git_revision': [
|
| + {
|
| + 'path': 'src/path/to/dependency/',
|
| + 'repo_url': 'https://url/to/dependency/repo.git',
|
| + 'new_revision': 'git_hash1',
|
| + 'old_revision': 'git_hash2',
|
| + },
|
| + ...
|
| + ],
|
| + ...
|
| + }
|
| + }
|
| + """
|
| + chromium_revision = failure_info['chromium_revision']
|
| + os_platform = _GetOSPlatformName(
|
| + failure_info['master_name'], failure_info['builder_name'])
|
| +
|
| + return {
|
| + 'deps': _GetDependencies(chromium_revision, os_platform),
|
| + 'deps_rolls': _DetectDEPSRolls(change_logs, os_platform)
|
| + }
|
|
|