Skip to content

Commit

Permalink
[Findit] Initiate Findit with a unittest skeleton.
Browse files Browse the repository at this point in the history
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
Show file tree
Hide file tree
Showing 7 changed files with 3,864 additions and 0 deletions.
1 change: 1 addition & 0 deletions tools/findit/OWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
stgao@chromium.org
3,290 changes: 3,290 additions & 0 deletions tools/findit/cacert.pem

Large diffs are not rendered by default.

187 changes: 187 additions & 0 deletions tools/findit/chromium_deps.py
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)
150 changes: 150 additions & 0 deletions tools/findit/chromium_deps_unittest.py
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)
Loading

0 comments on commit c916782

Please sign in to comment.