| Index: gclient.py
|
| ===================================================================
|
| --- gclient.py (revision 45659)
|
| +++ gclient.py (working copy)
|
| @@ -58,7 +58,6 @@
|
| __author__ = "darinf@gmail.com (Darin Fisher)"
|
| __version__ = "0.3.4"
|
|
|
| -import copy
|
| import errno
|
| import logging
|
| import optparse
|
| @@ -699,17 +698,6 @@
|
| if matching_file_list:
|
| self._RunHookAction(hook_dict, matching_file_list)
|
|
|
| - def GetSCMCommandClosure(self, path, url, revision, command, args, file_list):
|
| - """Gets a closure that runs a SCM command on a particular dependency."""
|
| - def _Closure():
|
| - logging.debug("Running %s in %s to %s %s" % (command, path, url,
|
| - revision))
|
| - options = copy.copy(self._options)
|
| - options.revision = revision
|
| - scm = gclient_scm.CreateSCM(url, self._root_dir, path)
|
| - scm.RunCommand(command, options, args, file_list)
|
| - return _Closure
|
| -
|
| def RunOnDeps(self, command, args):
|
| """Runs a command on each dependency in a client and its dependencies.
|
|
|
| @@ -750,126 +738,85 @@
|
|
|
| entries = {}
|
| entries_deps_content = {}
|
| + file_list = []
|
| + # Run on the base solutions first.
|
| + for solution in solutions:
|
| + name = solution["name"]
|
| + deps_file = solution.get("deps_file", self._options.deps_file)
|
| + if '/' in deps_file or '\\' in deps_file:
|
| + raise gclient_utils.Error('deps_file name must not be a path, just a '
|
| + 'filename.')
|
| + if name in entries:
|
| + raise gclient_utils.Error("solution %s specified more than once" % name)
|
| + url = solution["url"]
|
| + entries[name] = url
|
| + if run_scm and url:
|
| + self._options.revision = revision_overrides.get(name)
|
| + scm = gclient_scm.CreateSCM(url, self._root_dir, name)
|
| + scm.RunCommand(command, self._options, args, file_list)
|
| + file_list = [os.path.join(name, f.strip()) for f in file_list]
|
| + self._options.revision = None
|
| + try:
|
| + deps_content = gclient_utils.FileRead(
|
| + os.path.join(self._root_dir, name, deps_file))
|
| + except IOError, e:
|
| + if e.errno != errno.ENOENT:
|
| + raise
|
| + deps_content = ""
|
| + entries_deps_content[name] = deps_content
|
|
|
| - # To avoid threading issues, all file lists get constructed separately then
|
| - # gathered in a flattened list at the end.
|
| - file_list_list = []
|
| - file_list_dict = {}
|
| + # Process the dependencies next (sort alphanumerically to ensure that
|
| + # containing directories get populated first and for readability)
|
| + deps = self._ParseAllDeps(entries, entries_deps_content)
|
| + deps_to_process = deps.keys()
|
| + deps_to_process.sort()
|
|
|
| - thread_pool = gclient_utils.ThreadPool(self._options.jobs)
|
| - thread_pool.Start()
|
| -
|
| - try:
|
| - # Run on the base solutions first.
|
| - for solution in solutions:
|
| - name = solution["name"]
|
| - deps_file = solution.get("deps_file", self._options.deps_file)
|
| - if '/' in deps_file or '\\' in deps_file:
|
| - raise gclient_utils.Error('deps_file name must not be a path, just a '
|
| - 'filename.')
|
| - if name in entries:
|
| - raise gclient_utils.Error(
|
| - "solution %s specified more than once" % name)
|
| - url = solution["url"]
|
| - entries[name] = url
|
| - if run_scm and url:
|
| - revision = revision_overrides.get(name)
|
| - file_list = []
|
| - file_list_dict[name] = file_list
|
| - thread_pool.AddJob(self.GetSCMCommandClosure(
|
| - name, url, revision, command, args, file_list))
|
| -
|
| - thread_pool.WaitJobs()
|
| -
|
| - for solution in solutions:
|
| - name = solution["name"]
|
| - deps_file = solution.get("deps_file", self._options.deps_file)
|
| - try:
|
| - deps_content = gclient_utils.FileRead(
|
| - os.path.join(self._root_dir, name, deps_file))
|
| - except IOError, e:
|
| - if e.errno != errno.ENOENT:
|
| - raise
|
| - deps_content = ""
|
| - entries_deps_content[name] = deps_content
|
| - try:
|
| - file_list_list.append([os.path.join(name, f.strip())
|
| - for f in file_list_dict[name]])
|
| - except KeyError:
|
| - # We may not have added the file list to the dict, see tests above.
|
| - # Instead of duplicating the tests, it's less fragile to just ignore
|
| - # the exception.
|
| - pass
|
| -
|
| - # Process the dependencies next (sort alphanumerically to ensure that
|
| - # containing directories get populated first and for readability)
|
| - # TODO(piman): when using multiple threads, the ordering is not ensured.
|
| - # In many cases (e.g. updates to an existing checkout where DEPS don't
|
| - # move between directories), it'll still be correct but for completeness
|
| - # this should be fixed.
|
| - deps = self._ParseAllDeps(entries, entries_deps_content)
|
| - deps_to_process = deps.keys()
|
| - deps_to_process.sort()
|
| -
|
| - # First pass for direct dependencies.
|
| + # First pass for direct dependencies.
|
| + if command == 'update' and not self._options.verbose:
|
| + pm = Progress('Syncing projects', len(deps_to_process))
|
| + for d in deps_to_process:
|
| if command == 'update' and not self._options.verbose:
|
| - pm = Progress('Syncing projects', len(deps_to_process))
|
| -
|
| - for d in deps_to_process:
|
| - if command == 'update' and not self._options.verbose:
|
| - pm.update()
|
| - file_list = []
|
| - file_list_list.append(file_list)
|
| - if type(deps[d]) == str:
|
| - url = deps[d]
|
| - entries[d] = url
|
| - if run_scm:
|
| - revision = revision_overrides.get(d)
|
| - thread_pool.AddJob(self.GetSCMCommandClosure(d, url, revision,
|
| - command, args,
|
| - file_list))
|
| - elif isinstance(deps[d], self.FileImpl):
|
| - file = deps[d]
|
| - if run_scm:
|
| - revision = file.GetRevision()
|
| - thread_pool.AddJob(self.GetSCMCommandClosure(
|
| - d, url, revision, "updatesingle", args + [file.GetFilename()],
|
| - file_list))
|
| -
|
| - thread_pool.WaitJobs()
|
| + pm.update()
|
| + if type(deps[d]) == str:
|
| + url = deps[d]
|
| + entries[d] = url
|
| + if run_scm:
|
| + self._options.revision = revision_overrides.get(d)
|
| + scm = gclient_scm.CreateSCM(url, self._root_dir, d)
|
| + scm.RunCommand(command, self._options, args, file_list)
|
| + self._options.revision = None
|
| + elif isinstance(deps[d], self.FileImpl):
|
| + file = deps[d]
|
| + self._options.revision = file.GetRevision()
|
| + if run_scm:
|
| + scm = gclient_scm.CreateSCM(file.GetPath(), self._root_dir, d)
|
| + scm.RunCommand("updatesingle", self._options,
|
| + args + [file.GetFilename()], file_list)
|
|
|
| - if command == 'update' and not self._options.verbose:
|
| - pm.end()
|
| + if command == 'update' and not self._options.verbose:
|
| + pm.end()
|
|
|
| - # Second pass for inherited deps (via the From keyword)
|
| - for d in deps_to_process:
|
| - if isinstance(deps[d], self.FromImpl):
|
| - filename = os.path.join(self._root_dir,
|
| - deps[d].module_name,
|
| - self._options.deps_file)
|
| - content = gclient_utils.FileRead(filename)
|
| - sub_deps = self._ParseSolutionDeps(deps[d].module_name, content, {},
|
| - False)
|
| - # Getting the URL from the sub_deps file can involve having to resolve
|
| - # a File() or having to resolve a relative URL. To resolve relative
|
| - # URLs, we need to pass in the orignal sub deps URL.
|
| - sub_deps_base_url = deps[deps[d].module_name]
|
| - url = deps[d].GetUrl(d, sub_deps_base_url, self._root_dir, sub_deps)
|
| - entries[d] = url
|
| - if run_scm:
|
| - revision = revision_overrides.get(d)
|
| - file_list = []
|
| - file_list_list.append(file_list)
|
| - thread_pool.AddJob(self.GetSCMCommandClosure(d, url, revision,
|
| - command, args,
|
| - file_list))
|
| + # Second pass for inherited deps (via the From keyword)
|
| + for d in deps_to_process:
|
| + if isinstance(deps[d], self.FromImpl):
|
| + filename = os.path.join(self._root_dir,
|
| + deps[d].module_name,
|
| + self._options.deps_file)
|
| + content = gclient_utils.FileRead(filename)
|
| + sub_deps = self._ParseSolutionDeps(deps[d].module_name, content, {},
|
| + False)
|
| + # Getting the URL from the sub_deps file can involve having to resolve
|
| + # a File() or having to resolve a relative URL. To resolve relative
|
| + # URLs, we need to pass in the orignal sub deps URL.
|
| + sub_deps_base_url = deps[deps[d].module_name]
|
| + url = deps[d].GetUrl(d, sub_deps_base_url, self._root_dir, sub_deps)
|
| + entries[d] = url
|
| + if run_scm:
|
| + self._options.revision = revision_overrides.get(d)
|
| + scm = gclient_scm.CreateSCM(url, self._root_dir, d)
|
| + scm.RunCommand(command, self._options, args, file_list)
|
| + self._options.revision = None
|
|
|
| - thread_pool.WaitJobs()
|
| - finally:
|
| - thread_pool.Stop()
|
| -
|
| - file_list = sum(file_list_list, [])
|
| -
|
| # Convert all absolute paths to relative.
|
| for i in range(len(file_list)):
|
| # TODO(phajdan.jr): We should know exactly when the paths are absolute.
|
| @@ -1337,9 +1284,6 @@
|
| option_parser.add_option("", "--gclientfile", default=None,
|
| metavar="FILENAME",
|
| help=("specify an alternate .gclient file"))
|
| - option_parser.add_option("-j", "--jobs", default=1, type="int",
|
| - help=("specify how many SCM commands can run in "
|
| - "parallel"))
|
|
|
| if len(argv) < 2:
|
| # Users don't need to be told to use the 'help' command.
|
|
|