| Index: tools/findit/chromium_deps.py
|
| diff --git a/tools/findit/chromium_deps.py b/tools/findit/chromium_deps.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0de6721d125428b1c712053735d8aa6305907328
|
| --- /dev/null
|
| +++ b/tools/findit/chromium_deps.py
|
| @@ -0,0 +1,187 @@
|
| +# Copyright (c) 2014 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 https
|
| +import utils
|
| +
|
| +
|
| +DEPS_FILE_URL = 'https://src.chromium.org/chrome/trunk/src/DEPS?p=%s'
|
| +
|
| +
|
| +class _VarImpl(object):
|
| + def __init__(self, local_scope):
|
| + self._local_scope = local_scope
|
| +
|
| + def Lookup(self, var_name):
|
| + if var_name in self._local_scope.get('vars', {}):
|
| + return self._local_scope['vars'][var_name]
|
| + raise Exception('Var is not defined: %s' % var_name)
|
| +
|
| +
|
| +def _ParseDEPS(content):
|
| + """Parse the DEPS file of chromium."""
|
| + local_scope = {}
|
| + var = _VarImpl(local_scope)
|
| + global_scope = {
|
| + 'Var': var.Lookup,
|
| + 'deps': {},
|
| + 'deps_os': {},
|
| + 'include_rules': [],
|
| + 'skip_child_includes': [],
|
| + 'hooks': [],
|
| + }
|
| + exec(content, global_scope, local_scope)
|
| +
|
| + local_scope.setdefault('deps', {})
|
| + local_scope.setdefault('deps_os', {})
|
| +
|
| + return (local_scope['deps'], local_scope['deps_os'])
|
| +
|
| +
|
| +def _GetComponentName(path):
|
| + """Return the component name of a path."""
|
| + host_dirs = [
|
| + 'src/chrome/browser/resources/',
|
| + 'src/chrome/test/data/layout_tests/',
|
| + 'src/media/',
|
| + 'src/sdch/',
|
| + 'src/testing/',
|
| + 'src/third_party/WebKit/',
|
| + 'src/third_party/',
|
| + 'src/tools/',
|
| + 'src/',
|
| + ]
|
| + components_renamed = {
|
| + 'webkit': 'blink',
|
| + }
|
| +
|
| + for host_dir in host_dirs:
|
| + if path.startswith(host_dir):
|
| + path = path[len(host_dir):]
|
| + name = path.split('/')[0].lower()
|
| + if name in components_renamed:
|
| + return components_renamed[name].lower()
|
| + else:
|
| + return name.lower()
|
| +
|
| + # Unknown path, return the whole path as component name.
|
| + return '_'.join(path.split('/'))
|
| +
|
| +
|
| +def _GetContentOfDEPS(chromium_revision):
|
| + return https.SendRequest(DEPS_FILE_URL % chromium_revision)
|
| +
|
| +
|
| +def GetChromiumComponents(chromium_revision,
|
| + os_platform='unix',
|
| + deps_file_downloader=_GetContentOfDEPS):
|
| + """Return a list of components used by Chrome of the given revision.
|
| +
|
| + Args:
|
| + chromium_revision: The revision of the Chrome build.
|
| + os_platform: The target platform of the Chrome build, eg. win, mac, etc.
|
| + deps_file_downloader: A function that takes the chromium_revision as input,
|
| + and returns the content of the DEPS file. The returned
|
| + content is assumed to be trusted input and will be
|
| + evaluated as python code.
|
| + """
|
| + if os_platform.lower() == 'linux':
|
| + os_platform = 'unix'
|
| +
|
| + # Download the content of DEPS file in chromium.
|
| + deps_content = deps_file_downloader(chromium_revision)
|
| +
|
| + all_deps = {}
|
| +
|
| + # Parse the content of DEPS file.
|
| + deps, deps_os = _ParseDEPS(deps_content)
|
| + all_deps.update(deps)
|
| + if os_platform is not None:
|
| + all_deps.update(deps_os.get(os_platform, {}))
|
| +
|
| + # Figure out components based on the dependencies.
|
| + components = {}
|
| + for component_path in all_deps.keys():
|
| + name = _GetComponentName(component_path)
|
| + repository, revision = all_deps[component_path].split('@')
|
| + is_git_hash = utils.IsGitHash(revision)
|
| + if repository.startswith('/'):
|
| + # TODO(stgao): Use git repo after chromium moves to git.
|
| + repository = 'https://src.chromium.org/chrome%s' % repository
|
| + if is_git_hash:
|
| + repository_type = 'git'
|
| + else:
|
| + repository_type = 'svn'
|
| + if not component_path.endswith('/'):
|
| + component_path += '/'
|
| + components[component_path] = {
|
| + 'path': component_path,
|
| + 'name': name,
|
| + 'repository': repository,
|
| + 'repository_type': repository_type,
|
| + 'revision': revision
|
| + }
|
| +
|
| + # Add chromium as a component.
|
| + # TODO(stgao): Move to git.
|
| + components['src/'] = {
|
| + 'path': 'src/',
|
| + 'name': 'chromium',
|
| + 'repository': 'https://src.chromium.org/chrome/trunk',
|
| + 'repository_type': 'svn',
|
| + 'revision': chromium_revision
|
| + }
|
| +
|
| + return components
|
| +
|
| +
|
| +def GetChromiumComponentRange(chromium_revision1,
|
| + chromium_revision2,
|
| + os_platform='unix',
|
| + deps_file_downloader=_GetContentOfDEPS):
|
| + """Return a list of components with their revision ranges.
|
| +
|
| + Args:
|
| + chromium_revision1: The revision of a Chrome build.
|
| + chromium_revision2: The revision of another Chrome build.
|
| + os_platform: The target platform of the Chrome build, eg. win, mac, etc.
|
| + deps_file_downloader: A function that takes the chromium_revision as input,
|
| + and returns the content of the DEPS file. The returned
|
| + content is assumed to be trusted input and will be
|
| + evaluated as python code.
|
| + """
|
| + # TODO(stgao): support git.
|
| + chromium_revision1 = int(chromium_revision1)
|
| + chromium_revision2 = int(chromium_revision2)
|
| + old_revision = str(min(chromium_revision1, chromium_revision2))
|
| + new_revision = str(max(chromium_revision1, chromium_revision2))
|
| +
|
| + old_components = GetChromiumComponents(old_revision, os_platform,
|
| + deps_file_downloader)
|
| + new_components = GetChromiumComponents(new_revision, os_platform,
|
| + deps_file_downloader)
|
| +
|
| + components = {}
|
| + for path in new_components.keys():
|
| + new_component = new_components[path]
|
| + old_revision = None
|
| + if path in old_components:
|
| + old_component = old_components[path]
|
| + old_revision = old_component['revision']
|
| + components[path] = {
|
| + 'path': path,
|
| + 'rolled': new_component['revision'] != old_revision,
|
| + 'name': new_component['name'],
|
| + 'old_revision': old_revision,
|
| + 'new_revision': new_component['revision'],
|
| + 'repository': new_component['repository'],
|
| + 'repository_type': new_component['repository_type']
|
| + }
|
| +
|
| + return components
|
| +
|
| +
|
| +if __name__ == '__main__':
|
| + import json
|
| + print json.dumps(GetChromiumComponents(284750), sort_keys=True, indent=2)
|
|
|