diff options
author | Mike Frysinger <vapier@google.com> | 2020-02-09 02:28:34 -0500 |
---|---|---|
committer | Mike Frysinger <vapier@google.com> | 2020-02-19 18:11:33 +0000 |
commit | 979d5bdc3ebe45998a76dbbaff46c33d4e59683b (patch) | |
tree | 97c639570a60dd02a6ee9b712dff091a83ac8110 /subcmds/sync.py | |
parent | 56ce3468b4f2faa1cccfea01dc91e7db73fb3843 (diff) | |
download | git-repo-979d5bdc3ebe45998a76dbbaff46c33d4e59683b.tar.gz |
add experimental git worktree support
This provides initial support for using git worktrees internally
instead of our own ad-hoc symlink tree. It's been lightly tested
which is why it's not currently exposed via --help.
When people opt-in to worktrees in an existing repo client checkout,
no projects are migrated. Instead, only new projects will use the
worktree method. This allows for limited testing/opting in without
having to completely blow things away or get a second checkout.
Bug: https://crbug.com/gerrit/11486
Change-Id: Ic3ff891b30940a6ba497b406b2a387e0a8517ed8
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/254075
Tested-by: Mike Frysinger <vapier@google.com>
Reviewed-by: Mike Frysinger <vapier@google.com>
Diffstat (limited to 'subcmds/sync.py')
-rw-r--r-- | subcmds/sync.py | 24 |
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 | ||
17 | from __future__ import print_function | 17 | from __future__ import print_function |
18 | |||
19 | import errno | ||
18 | import json | 20 | import json |
19 | import netrc | 21 | import netrc |
20 | from optparse import SUPPRESS_HELP | 22 | from 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 |