From d79a4bc51b6ca5b47bbea861143c72bccc0ad13a Mon Sep 17 00:00:00 2001 From: Xin Li Date: Wed, 20 May 2020 16:03:45 -0700 Subject: Make partial clone imply no-clone-bundle by default. For large projects, clone bundle is useful because it provided a way to efficiently transfer a large portion of git objects through CDN, without needing to interact with git server. However, with partial clones, the intention is to not download most of the objects, so the use of clone bundles would defeat the space savings normally seen with partial clones, as they are downloaded before the first fetch. A new option, --clone-bundle is added to override this behavior. Add a new repo.clonebundle variable which remembers the choice if explicitly given from command line at repo init. Change-Id: I03638474af303a82af34579e16cd4700690b5f43 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/268452 Tested-by: Xin Li Reviewed-by: Jonathan Nieder --- docs/internal-fs-layout.md | 1 + manifest_xml.py | 8 ++++++++ repo | 9 +++++++-- subcmds/init.py | 11 +++++++++-- subcmds/sync.py | 8 ++++++-- 5 files changed, 31 insertions(+), 6 deletions(-) diff --git a/docs/internal-fs-layout.md b/docs/internal-fs-layout.md index 5e8690b8..3537dfda 100644 --- a/docs/internal-fs-layout.md +++ b/docs/internal-fs-layout.md @@ -134,6 +134,7 @@ User controlled settings are initialized when running `repo init`. |-------------------|---------------------------|-------------| | manifest.groups | `--groups` & `--platform` | The manifest groups to sync | | repo.archive | `--archive` | Use `git archive` for checkouts | +| repo.clonebundle | `--clone-bundle` | Whether the initial sync used clone.bundle explicitly | | repo.clonefilter | `--clone-filter` | Filter setting when using [partial git clones] | | repo.depth | `--depth` | Create shallow checkouts when cloning | | repo.dissociate | `--dissociate` | Dissociate from any reference/mirrors after initial clone | diff --git a/manifest_xml.py b/manifest_xml.py index b2918cac..b6aef510 100644 --- a/manifest_xml.py +++ b/manifest_xml.py @@ -501,6 +501,14 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md self._Load() return self._manifest_server + @property + def CloneBundle(self): + clone_bundle = self.manifestProject.config.GetBoolean('repo.clonebundle') + if clone_bundle is None: + return False if self.manifestProject.config.GetBoolean('repo.partialclone') else True + else: + return clone_bundle + @property def CloneFilter(self): if self.manifestProject.config.GetBoolean('repo.partialclone'): diff --git a/repo b/repo index be59c87f..18c7e77a 100755 --- a/repo +++ b/repo @@ -317,9 +317,11 @@ def GetParser(gitc_init=False): help='restrict manifest projects to ones with a specified ' 'platform group [auto|all|none|linux|darwin|...]', metavar='PLATFORM') + group.add_option('--clone-bundle', action='store_true', + help='enable use of /clone.bundle on HTTP/HTTPS (default if not --partial-clone)') group.add_option('--no-clone-bundle', - dest='clone_bundle', default=True, action='store_false', - help='disable use of /clone.bundle on HTTP/HTTPS') + dest='clone_bundle', action='store_false', + help='disable use of /clone.bundle on HTTP/HTTPS (default if --partial-clone)') group.add_option('--no-tags', dest='tags', default=True, action='store_false', help="don't fetch tags in the manifest") @@ -502,6 +504,9 @@ def _Init(args, gitc_init=False): opt.quiet = opt.output_mode is False opt.verbose = opt.output_mode is True + if opt.clone_bundle is None: + opt.clone_bundle = False if opt.partial_clone else True + url = opt.repo_url or REPO_URL rev = opt.repo_rev or REPO_REV diff --git a/subcmds/init.py b/subcmds/init.py index ce8b0187..eb82e2e4 100644 --- a/subcmds/init.py +++ b/subcmds/init.py @@ -155,9 +155,11 @@ to update the working directory files. help='restrict manifest projects to ones with a specified ' 'platform group [auto|all|none|linux|darwin|...]', metavar='PLATFORM') + g.add_option('--clone-bundle', action='store_true', + help='force use of /clone.bundle on HTTP/HTTPS (default if not --partial-clone)') g.add_option('--no-clone-bundle', - dest='clone_bundle', default=True, action='store_false', - help='disable use of /clone.bundle on HTTP/HTTPS') + dest='clone_bundle', action='store_false', + help='disable use of /clone.bundle on HTTP/HTTPS (default if --partial-clone)') g.add_option('--no-tags', dest='tags', default=True, action='store_false', help="don't fetch tags in the manifest") @@ -303,6 +305,11 @@ to update the working directory files. else: opt.clone_filter = None + if opt.clone_bundle is None: + opt.clone_bundle = False if opt.partial_clone else True + else: + m.config.SetString('repo.clonebundle', 'true' if opt.clone_bundle else 'false') + if opt.submodules: m.config.SetString('repo.submodules', 'true') diff --git a/subcmds/sync.py b/subcmds/sync.py index efd39616..a40dd5e0 100644 --- a/subcmds/sync.py +++ b/subcmds/sync.py @@ -247,8 +247,9 @@ later is required to fix a server side protocol bug. p.add_option('-m', '--manifest-name', dest='manifest_name', help='temporary manifest to use for this sync', metavar='NAME.xml') - p.add_option('--no-clone-bundle', - dest='clone_bundle', default=True, action='store_false', + p.add_option('--clone-bundle', action='store_true', + help='enable use of /clone.bundle on HTTP/HTTPS') + p.add_option('--no-clone-bundle', dest='clone_bundle', action='store_false', help='disable use of /clone.bundle on HTTP/HTTPS') p.add_option('-u', '--manifest-server-username', action='store', dest='manifest_server_username', @@ -836,6 +837,9 @@ later is required to fix a server side protocol bug. smart_sync_manifest_path = os.path.join( self.manifest.manifestProject.worktree, 'smart_sync_override.xml') + if opt.clone_bundle is None: + opt.clone_bundle = self.manifest.CloneBundle + if opt.smart_sync or opt.smart_tag: manifest_name = self._SmartSyncSetup(opt, smart_sync_manifest_path) else: -- cgit v1.2.3-54-g00ecf