Reland: Add ability to override DEPS file in recursedeps

This will allow ANGLE to have a recursible deps-file in their repo instead of
relying on chromium's DEPS file to specify an accurate dependency for itself.

Previously: https://chromiumcodereview.appspot.com/1919103003/

R=agable@chromium.org, dpranke@chromium.org, jmadill@chromium.org
BUG=

Review-Url: https://codereview.chromium.org/1948853002

git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@300446 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/gclient.py b/gclient.py
index 15a7530..f1428c5 100755
--- a/gclient.py
+++ b/gclient.py
@@ -371,6 +371,9 @@
     # 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 @@
       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 @@
       # 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 @@
     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