diff --git a/gclient.py b/gclient.py index e1b1be2ff..8f1a48978 100755 --- a/gclient.py +++ b/gclient.py @@ -1825,9 +1825,7 @@ def _FlattenDep(dep, allowed_hosts, deps, deps_os, hooks, hooks_os, _AddDep(dep, allowed_hosts, deps, unpinned_deps) - for dep_os, os_deps in dep.os_dependencies.iteritems(): - for os_dep in os_deps: - deps_os.setdefault(dep_os, {})[os_dep.name] = os_dep + _FlattenDepsOs(dep, deps_os) deps_by_name = dict((d.name, d) for d in dep.dependencies) for recurse_dep_name in (dep.recursedeps or []): @@ -1860,11 +1858,29 @@ def _FlattenRecurse(dep, allowed_hosts, deps, deps_os, hooks, hooks_os, """ logging.debug('_FlattenRecurse(%r)', dep) + _FlattenDepsOs(dep, deps_os) + for sub_dep in dep.orig_dependencies: _FlattenDep(sub_dep, allowed_hosts, deps, deps_os, hooks, hooks_os, pre_deps_hooks, unpinned_deps) +def _FlattenDepsOs(dep, deps_os): + """Helper to add a dependency to flattened lists. + + Arguments: + dep (Dependency): dependency to process + + Out-parameters: + deps_os (dict): will be filled with flattened deps_os + """ + logging.debug('_FlattenDepsOs(%r)', dep) + + for dep_os, os_deps in dep.os_dependencies.iteritems(): + for os_dep in os_deps: + deps_os.setdefault(dep_os, {})[os_dep.name] = os_dep + + def _AddDep(dep, allowed_hosts, deps, unpinned_deps): """Helper to add a dependency to flattened lists. diff --git a/testing_support/fake_repos.py b/testing_support/fake_repos.py index 7c912299d..4bc4e15b5 100755 --- a/testing_support/fake_repos.py +++ b/testing_support/fake_repos.py @@ -298,7 +298,7 @@ class FakeReposBase(object): class FakeRepos(FakeReposBase): """Implements populateGit().""" - NB_GIT_REPOS = 7 + NB_GIT_REPOS = 8 def populateGit(self): # Testing: @@ -473,6 +473,7 @@ deps = { 'url': '/repo_4', 'condition': 'False', }, + 'src/repo8': '/repo_8', } deps_os ={ 'mac': { @@ -513,6 +514,7 @@ hooks_os = { } recursedeps = [ 'src/repo2', + 'src/repo8', ]""" % { 'git_base': self.git_base, 'hash': self.git_hashes['repo_2'][1][0][:7] @@ -541,6 +543,19 @@ hooks = [ 'origin': 'git/repo_7@1\n', }) + self._commit_git('repo_8', { + 'DEPS': """ +deps_os ={ + 'mac': { + 'src/recursed_os_repo': '/repo_5', + }, + 'unix': { + 'src/recursed_os_repo': '/repo_5', + }, +}""", + 'origin': 'git/repo_8@1\n', + }) + class FakeRepoSkiaDEPS(FakeReposBase): """Simulates the Skia DEPS transition in Chrome.""" diff --git a/tests/gclient_smoketest.py b/tests/gclient_smoketest.py index 6e1f020fe..a13dad22e 100755 --- a/tests/gclient_smoketest.py +++ b/tests/gclient_smoketest.py @@ -609,6 +609,11 @@ class GClientSmokeGIT(GClientSmokeBase): ' "condition": "False",', ' },', '', + ' # src -> src/repo8', + ' "src/repo8": {', + ' "url": "/repo_8",', + ' },', + '', '}', '', 'deps_os = {', @@ -618,9 +623,19 @@ class GClientSmokeGIT(GClientSmokeBase): ' "url": "/repo_5",', ' },', '', + ' # src -> src/repo8 -> src/recursed_os_repo', + ' "src/recursed_os_repo": {', + ' "url": "/repo_5",', + ' },', + '', ' },', '', ' "unix": {', + ' # src -> src/repo8 -> src/recursed_os_repo', + ' "src/recursed_os_repo": {', + ' "url": "/repo_5",', + ' },', + '', ' # src -> src/unix_repo', ' "src/unix_repo": {', ' "url": "/repo_5",',