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
This commit is contained in:
Gabe Black 2014-10-09 17:54:35 -07:00 committed by Mike Frysinger
parent 7a77c16d37
commit 2ff302929c

View File

@ -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()