diff --git a/gclient.py b/gclient.py index 15a75301a..f1428c52b 100755 --- a/gclient.py +++ b/gclient.py @@ -371,6 +371,9 @@ class Dependency(gclient_utils.WorkItem, DependencySettings): # recursedeps is a mutable value that selectively overrides the default # 'no recursion' setting on a dep-by-dep basis. It will replace # recursion_override. + # + # It will be a dictionary of {deps_name: {"deps_file": depfile_name}} or + # None. self.recursedeps = None if not self.name and self.parent: @@ -650,9 +653,14 @@ class Dependency(gclient_utils.WorkItem, DependencySettings): self.recursion_override = local_scope.get('recursion') logging.warning( 'Setting %s recursion to %d.', self.name, self.recursion_limit) - self.recursedeps = local_scope.get('recursedeps', None) + self.recursedeps = None if 'recursedeps' in local_scope: - self.recursedeps = set(self.recursedeps) + self.recursedeps = {} + for ent in local_scope['recursedeps']: + if isinstance(ent, basestring): + self.recursedeps[ent] = {"deps_file": self.deps_file} + else: # (depname, depsfilename) + self.recursedeps[ent[0]] = {"deps_file": ent[1]} logging.warning('Found recursedeps %r.', repr(self.recursedeps)) # If present, save 'target_os' in the local_target_os property. if 'target_os' in local_scope: @@ -687,9 +695,9 @@ class Dependency(gclient_utils.WorkItem, DependencySettings): # Update recursedeps if it's set. if self.recursedeps is not None: logging.warning('Updating recursedeps by prepending %s.', self.name) - rel_deps = set() - for d in self.recursedeps: - rel_deps.add(os.path.normpath(os.path.join(self.name, d))) + rel_deps = {} + for depname, options in self.recursedeps.iteritems(): + rel_deps[os.path.normpath(os.path.join(self.name, depname))] = options self.recursedeps = rel_deps if 'allowed_hosts' in local_scope: @@ -708,9 +716,14 @@ class Dependency(gclient_utils.WorkItem, DependencySettings): deps_to_add = [] for name, url in deps.iteritems(): should_process = self.recursion_limit and self.should_process + deps_file = self.deps_file + if self.recursedeps is not None: + ent = self.recursedeps.get(name) + if ent is not None: + deps_file = ent['deps_file'] deps_to_add.append(Dependency( self, name, url, None, None, None, self.custom_vars, None, - self.deps_file, should_process)) + deps_file, should_process)) deps_to_add.sort(key=lambda x: x.name) # override named sets of hooks by the custom hooks diff --git a/tests/gclient_test.py b/tests/gclient_test.py index 0374ed091..a7c31e268 100755 --- a/tests/gclient_test.py +++ b/tests/gclient_test.py @@ -847,6 +847,42 @@ class GclientTest(trial_dir.TestCase): ], self._get_processed()) + def testRecursedepsAltfile(self): + """Verifies gclient respects the |recursedeps| var syntax with overridden + target DEPS file. + + This is what we mean to check here: + - Naming an alternate DEPS file in recursedeps pulls from that one. + """ + write( + '.gclient', + 'solutions = [\n' + ' { "name": "foo", "url": "svn://example.com/foo" },\n' + ']') + write( + os.path.join('foo', 'DEPS'), + 'deps = {\n' + ' "bar": "/bar",\n' + '}\n' + 'recursedeps = [("bar", "DEPS.alt")]') + write(os.path.join('bar', 'DEPS'), 'ERROR ERROR ERROR') + write( + os.path.join('bar', 'DEPS.alt'), + 'deps = {\n' + ' "baz": "/baz",\n' + '}') + + options, _ = gclient.OptionParser().parse_args([]) + obj = gclient.GClient.LoadCurrentConfig(options) + obj.RunOnDeps('None', []) + self.assertEquals( + [ + 'svn://example.com/foo', + 'svn://example.com/foo/bar', + 'svn://example.com/foo/bar/baz', + ], + self._get_processed()) + def testGitDeps(self): """Verifies gclient respects a .DEPS.git deps file.