From 9267d587273c0f702d04c9c5cb122972f351f3f5 Mon Sep 17 00:00:00 2001 From: Josip Sokcevic Date: Thu, 19 Oct 2023 14:46:11 -0700 Subject: project: Speculative fix for project corruption When a new shared project is added to manifest, there's a short window where objects can be deleted that are used by other projects. To close that window, set preciousObjects during git init. For non-shared projects, repo should correct the state in the same execution instance. Bug: 288102993 Change-Id: I366f524535ac58c820d51a88599ae2108df9ab48 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/390234 Commit-Queue: Josip Sokcevic Tested-by: Josip Sokcevic Reviewed-by: Mike Frysinger --- project.py | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'project.py') diff --git a/project.py b/project.py index be53defd..7b78427d 100644 --- a/project.py +++ b/project.py @@ -2990,6 +2990,17 @@ class Project: self.config.SetBoolean( "core.bare", True if self.manifest.IsMirror else None ) + + if not init_obj_dir: + # The project might be shared (obj_dir already initialized), but + # such information is not available here. Instead of passing it, + # set it as shared, and rely to be unset down the execution + # path. + if git_require((2, 7, 0)): + self.EnableRepositoryExtension("preciousObjects") + else: + self.config.SetString("gc.pruneExpire", "never") + except Exception: if init_obj_dir and os.path.exists(self.objdir): platform_utils.rmtree(self.objdir) -- cgit v1.2.3-54-g00ecf