From f2def0abf8f2afbc2e0af62ebb49fb9547523094 Mon Sep 17 00:00:00 2001 From: "cmp@chromium.org" Date: Wed, 16 Jul 2014 19:48:54 +0000 Subject: [PATCH] Update recursedeps to support use_relative_path. Also cast recursedeps to a set. We'll continue to support using a list literal form in DEPS for now. R=iannucci@chromium.org,agable@chromium.org BUG=393000 Review URL: https://codereview.chromium.org/385123008 git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@283474 0039d316-1c4b-4281-b951-d872f2087c98 --- gclient.py | 14 +++++++++++++- tests/gclient_test.py | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/gclient.py b/gclient.py index a2d159a2c3..b60884a0c2 100755 --- a/gclient.py +++ b/gclient.py @@ -595,6 +595,7 @@ class Dependency(gclient_utils.WorkItem, DependencySettings): 'Setting %s recursion to %d.', self.name, self.recursion_limit) self.recursedeps = local_scope.get('recursedeps', None) if 'recursedeps' in local_scope: + self.recursedeps = set(self.recursedeps) 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: @@ -613,16 +614,27 @@ class Dependency(gclient_utils.WorkItem, DependencySettings): # If use_relative_paths is set in the DEPS file, regenerate # the dictionary using paths relative to the directory containing - # the DEPS file. + # the DEPS file. Also update recursedeps if use_relative_paths is + # enabled. use_relative_paths = local_scope.get('use_relative_paths', False) if use_relative_paths: + logging.warning('use_relative_paths enabled.') rel_deps = {} for d, url in deps.items(): # normpath is required to allow DEPS to use .. in their # dependency local path. rel_deps[os.path.normpath(os.path.join(self.name, d))] = url + logging.warning('Updating deps by prepending %s.', self.name) deps = rel_deps + # 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))) + self.recursedeps = rel_deps + # Convert the deps into real Dependency. deps_to_add = [] for name, url in deps.iteritems(): diff --git a/tests/gclient_test.py b/tests/gclient_test.py index aff9174e16..e6185956fe 100755 --- a/tests/gclient_test.py +++ b/tests/gclient_test.py @@ -720,6 +720,44 @@ class GclientTest(trial_dir.TestCase): ], self._get_processed()) + def testRecursedepsOverrideWithRelativePaths(self): + """Verifies gclient respects |recursedeps| with relative paths.""" + + write( + '.gclient', + 'solutions = [\n' + ' { "name": "foo", "url": "svn://example.com/foo" },\n' + ']') + write( + os.path.join('foo', 'DEPS'), + 'use_relative_paths = True\n' + 'deps = {\n' + ' "bar": "/bar",\n' + '}\n' + 'recursedeps = {"bar"}') + write( + os.path.join('bar', 'DEPS'), + 'deps = {\n' + ' "baz": "/baz",\n' + '}') + write( + os.path.join('baz', 'DEPS'), + 'deps = {\n' + ' "fizz": "/fizz",\n' + '}') + + options, _ = gclient.OptionParser().parse_args([]) + obj = gclient.GClient.LoadCurrentConfig(options) + obj.RunOnDeps('None', []) + self.assertEquals( + [ + 'svn://example.com/foo', + # use_relative_paths means the following dep evaluates with 'foo' + # prepended. + 'svn://example.com/foo/bar', + ], + self._get_processed()) + def testRecursionOverridesRecursedeps(self): """Verifies gclient respects |recursion| over |recursedeps|.