forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Findit] Initiate Findit with a unittest skeleton.
This is to create a sub-directory for Findit and add a unittest skeleton with a script to parse DEPS file in chromium. R=mbarbella@chromium.org Review URL: https://codereview.chromium.org/391173002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@284775 0039d316-1c4b-4281-b951-d872f2087c98
- Loading branch information
stgao@chromium.org
committed
Jul 22, 2014
1 parent
443898f
commit c916782
Showing
7 changed files
with
3,864 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
stgao@chromium.org |
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,150 @@ | ||
# 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 unittest | ||
|
||
import chromium_deps | ||
|
||
|
||
class ChromiumDEPSTest(unittest.TestCase): | ||
DEPS_TEMPLATE = """ | ||
vars = { | ||
"googlecode_url": "http://%%s.googlecode.com/svn", | ||
"webkit_trunk": "http://src.chromium.org/blink/trunk", | ||
"webkit_revision": "%s", | ||
"chromium_git": "https://chromium.googlesource.com", | ||
} | ||
deps = { | ||
"src/breakpad/src": | ||
(Var("googlecode_url") %% "google-breakpad") + "/trunk/src@%s", | ||
"src/third_party/WebKit": | ||
Var("webkit_trunk") + "@" + Var("webkit_revision"), | ||
} | ||
deps_os = { | ||
"unix": { | ||
"src/third_party/liblouis/src": | ||
Var("chromium_git") + | ||
"/external/liblouis.git@%s", | ||
} | ||
} | ||
""" | ||
|
||
def __init__(self, *args, **kwargs): | ||
super(ChromiumDEPSTest, self).__init__(*args, **kwargs) | ||
|
||
def testGetChromiumComponents(self): | ||
chromium_revision = '283296' | ||
webkit_revision = '178200' | ||
breakpad_revision = '1345' | ||
liblouis_commit_hashcode = '3c2daee56250162e5a75830871601d74328d39f5' | ||
|
||
def _GetContentOfDEPS(chromium_revision_tmp): | ||
self.assertEqual(chromium_revision_tmp, chromium_revision) | ||
return self.DEPS_TEMPLATE % (webkit_revision, breakpad_revision, | ||
liblouis_commit_hashcode) | ||
|
||
expected_results = { | ||
'src/breakpad/src/': { | ||
'path': 'src/breakpad/src/', | ||
'repository_type': 'svn', | ||
'name': 'breakpad', | ||
'repository': 'http://google-breakpad.googlecode.com/svn/trunk/src', | ||
'revision': breakpad_revision | ||
}, | ||
'src/third_party/liblouis/src/': { | ||
'path': 'src/third_party/liblouis/src/', | ||
'repository_type': 'git', | ||
'name': 'liblouis', | ||
'repository': | ||
'https://chromium.googlesource.com/external/liblouis.git', | ||
'revision': liblouis_commit_hashcode | ||
}, | ||
'src/': { | ||
'path': 'src/', | ||
'repository_type': 'svn', | ||
'name': 'chromium', | ||
'repository': 'https://src.chromium.org/chrome/trunk', | ||
'revision': chromium_revision | ||
}, | ||
'src/third_party/WebKit/': { | ||
'path': 'src/third_party/WebKit/', | ||
'repository_type': 'svn', | ||
'name': 'blink', | ||
'repository': 'http://src.chromium.org/blink/trunk', | ||
'revision': webkit_revision | ||
} | ||
} | ||
|
||
components = chromium_deps.GetChromiumComponents( | ||
chromium_revision, deps_file_downloader=_GetContentOfDEPS) | ||
self.assertEqual(expected_results, components) | ||
|
||
def testGetChromiumComponentRange(self): | ||
chromium_revision1 = '283296' | ||
webkit_revision1 = '178200' | ||
breakpad_revision1 = '1345' | ||
liblouis_commit_hashcode1 = '3c2daee56250162e5a75830871601d74328d39f5' | ||
|
||
chromium_revision2 = '283200' | ||
webkit_revision2 = '178084' | ||
breakpad_revision2 = '1345' | ||
liblouis_commit_hashcode2 = '3c2daee56250162e5a75830871601d74328d39f5' | ||
|
||
def _GetContentOfDEPS(chromium_revision): | ||
chromium_revision = str(chromium_revision) | ||
if chromium_revision == chromium_revision1: | ||
return self.DEPS_TEMPLATE % (webkit_revision1, breakpad_revision1, | ||
liblouis_commit_hashcode1) | ||
else: | ||
self.assertEqual(chromium_revision2, chromium_revision) | ||
return self.DEPS_TEMPLATE % (webkit_revision2, breakpad_revision2, | ||
liblouis_commit_hashcode2) | ||
|
||
expected_results = { | ||
'src/breakpad/src/': { | ||
'old_revision': breakpad_revision2, | ||
'name': 'breakpad', | ||
'repository': 'http://google-breakpad.googlecode.com/svn/trunk/src', | ||
'rolled': False, | ||
'new_revision': breakpad_revision1, | ||
'path': 'src/breakpad/src/', | ||
'repository_type': 'svn' | ||
}, | ||
'src/third_party/liblouis/src/': { | ||
'old_revision': liblouis_commit_hashcode2, | ||
'name': 'liblouis', | ||
'repository': | ||
'https://chromium.googlesource.com/external/liblouis.git', | ||
'rolled': False, | ||
'new_revision': liblouis_commit_hashcode1, | ||
'path': 'src/third_party/liblouis/src/', | ||
'repository_type': 'git' | ||
}, | ||
'src/': { | ||
'old_revision': chromium_revision2, | ||
'name': 'chromium', | ||
'repository': 'https://src.chromium.org/chrome/trunk', | ||
'rolled': True, | ||
'new_revision': chromium_revision1, | ||
'path': 'src/', | ||
'repository_type': 'svn' | ||
}, | ||
'src/third_party/WebKit/': { | ||
'old_revision': webkit_revision2, | ||
'name': 'blink', | ||
'repository': 'http://src.chromium.org/blink/trunk', | ||
'rolled': True, | ||
'new_revision': webkit_revision1, | ||
'path': 'src/third_party/WebKit/', | ||
'repository_type': 'svn' | ||
} | ||
} | ||
|
||
components = chromium_deps.GetChromiumComponentRange( | ||
chromium_revision1, chromium_revision2, | ||
deps_file_downloader=_GetContentOfDEPS) | ||
self.assertEqual(expected_results, components) |
Oops, something went wrong.