From 2ff302929ca12b309ab35a3f957cd0179f382d74 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Thu, 9 Oct 2014 17:54:35 -0700 Subject: [PATCH] When syncing a project with a shared object store, disable automatic pruning. The shared object stores confuse git and make it throw away objects which are still in use. We'll avoid that problem by disabling automatic pruning on those projects, but there's nothing preventing a user from changing the config back or pruning a repository manually. BUG=chromium:375945 TEST=Ran repo sync on fresh ChromeOS checkout, starting with a branch of repo with this change. Verified that the kernel projects and no others were identified as having shared object stores, and that repo successfully disabled automatic pruning in their configs. Re-enabled pruning and ran repo sync just on one of the kernel directories. Verified that pruning was re-disabled as a result. Change-Id: I728ed5b06f0087aeb5a23ba8f5410a7cd10af5b0 --- subcmds/sync.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/subcmds/sync.py b/subcmds/sync.py index 9124a653..ecf2ffc0 100644 --- a/subcmds/sync.py +++ b/subcmds/sync.py @@ -397,9 +397,12 @@ later is required to fix a server side protocol bug. return fetched def _GCProjects(self, projects): - gitdirs = {} + gc_gitdirs = {} for project in projects: - gitdirs[project.gitdir] = project.bare_git + if len(project.manifest.GetProjectsWithName(project.name)) > 1: + print('Shared project %s found, disabling pruning.' % project.name) + project.bare_git.config('--replace-all', 'gc.pruneExpire', 'never') + gc_gitdirs[project.gitdir] = project.bare_git has_dash_c = git_require((1, 7, 2)) if multiprocessing and has_dash_c: @@ -409,7 +412,7 @@ later is required to fix a server side protocol bug. jobs = min(self.jobs, cpu_count) if jobs < 2: - for bare_git in gitdirs.values(): + for bare_git in gc_gitdirs.values(): bare_git.gc('--auto') return @@ -431,7 +434,7 @@ later is required to fix a server side protocol bug. finally: sem.release() - for bare_git in gitdirs.values(): + for bare_git in gc_gitdirs.values(): if err_event.isSet(): break sem.acquire()