summaryrefslogtreecommitdiffstats
path: root/subcmds/sync.py
diff options
context:
space:
mode:
Diffstat (limited to 'subcmds/sync.py')
-rw-r--r--subcmds/sync.py24
1 files changed, 18 insertions, 6 deletions
diff --git a/subcmds/sync.py b/subcmds/sync.py
index 0ac308e6..49867a97 100644
--- a/subcmds/sync.py
+++ b/subcmds/sync.py
@@ -15,6 +15,8 @@
15# limitations under the License. 15# limitations under the License.
16 16
17from __future__ import print_function 17from __future__ import print_function
18
19import errno
18import json 20import json
19import netrc 21import netrc
20from optparse import SUPPRESS_HELP 22from optparse import SUPPRESS_HELP
@@ -569,7 +571,8 @@ later is required to fix a server side protocol bug.
569 gc_gitdirs = {} 571 gc_gitdirs = {}
570 for project in projects: 572 for project in projects:
571 # Make sure pruning never kicks in with shared projects. 573 # Make sure pruning never kicks in with shared projects.
572 if len(project.manifest.GetProjectsWithName(project.name)) > 1: 574 if (not project.use_git_worktrees and
575 len(project.manifest.GetProjectsWithName(project.name)) > 1):
573 print('%s: Shared project %s found, disabling pruning.' % 576 print('%s: Shared project %s found, disabling pruning.' %
574 (project.relpath, project.name)) 577 (project.relpath, project.name))
575 if git_require((2, 7, 0)): 578 if git_require((2, 7, 0)):
@@ -637,13 +640,22 @@ later is required to fix a server side protocol bug.
637 # Delete the .git directory first, so we're less likely to have a partially 640 # Delete the .git directory first, so we're less likely to have a partially
638 # working git repository around. There shouldn't be any git projects here, 641 # working git repository around. There shouldn't be any git projects here,
639 # so rmtree works. 642 # so rmtree works.
643 dotgit = os.path.join(path, '.git')
644 # Try to remove plain files first in case of git worktrees. If this fails
645 # for any reason, we'll fall back to rmtree, and that'll display errors if
646 # it can't remove things either.
647 try:
648 platform_utils.remove(dotgit)
649 except OSError:
650 pass
640 try: 651 try:
641 platform_utils.rmtree(os.path.join(path, '.git')) 652 platform_utils.rmtree(dotgit)
642 except OSError as e: 653 except OSError as e:
643 print('Failed to remove %s (%s)' % (os.path.join(path, '.git'), str(e)), file=sys.stderr) 654 if e.errno != errno.ENOENT:
644 print('error: Failed to delete obsolete path %s' % path, file=sys.stderr) 655 print('error: %s: %s' % (dotgit, str(e)), file=sys.stderr)
645 print(' remove manually, then run sync again', file=sys.stderr) 656 print('error: %s: Failed to delete obsolete path; remove manually, then '
646 return 1 657 'run sync again' % (path,), file=sys.stderr)
658 return 1
647 659
648 # Delete everything under the worktree, except for directories that contain 660 # Delete everything under the worktree, except for directories that contain
649 # another git project 661 # another git project