Index: gclient.py |
diff --git a/gclient.py b/gclient.py |
index f6db225c11c0d94e834580728faf3fad74011ed1..22a4eb96a369c59ef900c2abff35e331af21ecb9 100755 |
--- a/gclient.py |
+++ b/gclient.py |
@@ -1542,23 +1542,18 @@ been automagically updated. The previous version is available at %s.old. |
# Fix path separator on Windows. |
entry_fixed = entry.replace('/', os.path.sep) |
e_dir = os.path.join(self.root_dir, entry_fixed) |
- |
- def _IsParentOfAny(parent, path_list): |
- parent_plus_slash = parent + '/' |
- return any( |
- path[:len(parent_plus_slash)] == parent_plus_slash |
- for path in path_list) |
- |
# Use entry and not entry_fixed there. |
if (entry not in entries and |
(not any(path.startswith(entry + '/') for path in entries)) and |
os.path.exists(e_dir)): |
+ # The entry has been removed from DEPS. |
scm = gclient_scm.CreateSCM( |
prev_url, self.root_dir, entry_fixed, self.outbuf) |
# Check to see if this directory is now part of a higher-up checkout. |
# The directory might be part of a git OR svn checkout. |
scm_root = None |
+ scm_class = None |
for scm_class in (gclient_scm.scm.GIT, gclient_scm.scm.SVN): |
try: |
scm_root = scm_class.GetCheckoutRoot(scm.checkout_path) |
@@ -1571,9 +1566,45 @@ been automagically updated. The previous version is available at %s.old. |
'determine whether it is part of a higher-level ' |
'checkout, so not removing.' % entry) |
continue |
+ |
+ # This is to handle the case of third_party/WebKit migrating from |
+ # being a DEPS entry to being part of the main project. |
+ # If the subproject is a Git project, we need to remove its .git |
+ # folder. Otherwise git operations on that folder will have different |
+ # effects depending on the current working directory. |
+ if scm_class == gclient_scm.scm.GIT and ( |
+ os.path.abspath(scm_root) == os.path.abspath(e_dir)): |
+ e_par_dir = os.path.join(e_dir, os.pardir) |
+ if scm_class.IsInsideWorkTree(e_par_dir): |
+ par_scm_root = scm_class.GetCheckoutRoot(e_par_dir) |
+ # rel_e_dir : relative path of entry w.r.t. its parent repo. |
+ rel_e_dir = os.path.relpath(e_dir, par_scm_root) |
+ if scm_class.IsDirectoryVersioned(par_scm_root, rel_e_dir): |
+ save_dir = scm.GetGitBackupDirPath() |
+ # Remove any eventual stale backup dir for the same project. |
+ if os.path.exists(save_dir): |
+ gclient_utils.rmtree(save_dir) |
+ os.rename(os.path.join(e_dir, '.git'), save_dir) |
+ # When switching between the two states (entry/ is a subproject |
+ # -> entry/ is part of the outer project), it is very likely |
+ # that some files are changed in the checkout, unless we are |
+ # jumping *exactly* across the commit which changed just DEPS. |
+ # In such case we want to cleanup any eventual stale files |
+ # (coming from the old subproject) in order to end up with a |
+ # clean checkout. |
+ scm_class.CleanupDir(par_scm_root, rel_e_dir) |
+ assert not os.path.exists(os.path.join(e_dir, '.git')) |
+ print(('\nWARNING: \'%s\' has been moved from DEPS to a higher ' |
+ 'level checkout. The git folder containing all the local' |
+ ' branches has been saved to %s.\n' |
+ 'If you don\'t care about its state you can safely ' |
+ 'remove that folder to free up space.') % |
+ (entry, save_dir)) |
+ continue |
+ |
if scm_root in full_entries: |
- logging.info('%s is part of a higher level checkout, not ' |
- 'removing.', scm.GetCheckoutRoot()) |
+ logging.info('%s is part of a higher level checkout, not removing', |
+ scm.GetCheckoutRoot()) |
continue |
file_list = [] |