| 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 = []
|
|
|