diff --git a/gclient.py b/gclient.py index 957a90f54..3b7dc4b6c 100755 --- a/gclient.py +++ b/gclient.py @@ -1832,6 +1832,8 @@ it or fix the checkout. Notify the user if there is an orphaned entry in their working copy. Only delete the directory if there are no changes in it, and delete_unversioned_trees is set to true. + + Returns CIPD packages that are no longer versioned. """ entry_names_and_sync = [(i.name, i._should_sync) @@ -1845,6 +1847,7 @@ it or fix the checkout. name for name, should_sync in entry_names_and_sync if not should_sync ] + removed_cipd_entries = [] for entry, prev_url in self._ReadEntries().items(): if not prev_url: # entry must have been overridden via .gclient custom_deps @@ -1853,6 +1856,11 @@ it or fix the checkout. # Dependencies of solutions that skipped syncing would not # show up in `entries`. continue + if (':' in entry): + # This is a cipd package. Don't clean it up, but prepare for return + if entry not in entries: + removed_cipd_entries.append(entry) + continue # Fix path separator on Windows. entry_fixed = entry.replace('/', os.path.sep) e_dir = os.path.join(self.root_dir, entry_fixed) @@ -1955,6 +1963,7 @@ it or fix the checkout. gclient_utils.rmtree(e_dir) # record the current list of entries for next time self._SaveEntries() + return removed_cipd_entries def RunOnDeps(self, command, args, ignore_requirements=False, progress=True): """Runs a command on each dependency in a client and its dependencies. @@ -2029,6 +2038,7 @@ it or fix the checkout. # Once all the dependencies have been processed, it's now safe to write # out the gn_args_file and run the hooks. + removed_cipd_entries = [] if command == 'update': for dependency in self.dependencies: gn_args_dep = dependency @@ -2038,13 +2048,24 @@ it or fix the checkout. if gn_args_dep and gn_args_dep.HasGNArgsFile(): gn_args_dep.WriteGNArgsFile() - self._RemoveUnversionedGitDirs() + removed_cipd_entries = self._RemoveUnversionedGitDirs() # Sync CIPD dependencies once removed deps are deleted. In case a git # dependency was moved to CIPD, we want to remove the old git directory # first and then sync the CIPD dep. if self._cipd_root: self._cipd_root.run(command) + # It's possible that CIPD removed some entries that are now part of git + # worktree. Try to checkout those directories + if removed_cipd_entries: + for cipd_entry in removed_cipd_entries: + cwd = os.path.join(self._root_dir, cipd_entry.split(':')[0]) + cwd, tail = os.path.split(cwd) + if cwd: + try: + gclient_scm.scm.GIT.Capture(['checkout', tail], cwd=cwd) + except subprocess2.CalledProcessError: + pass if not self._options.nohooks: if should_show_progress: