summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosip Sokcevic <sokcevic@chromium.org>2025-01-15 23:43:22 +0000
committerLUCI <gerrit-scoped@luci-project-accounts.iam.gserviceaccount.com>2025-01-16 09:19:45 -0800
commitdb111d392407797e170355e1c0ec98e71d4a8278 (patch)
tree453a756ed1a3a97ffb0a4c013d931fdf4a5497e9
parent3405446a4eb382467ef539764f6a31869fd1ce43 (diff)
downloadgit-repo-db111d392407797e170355e1c0ec98e71d4a8278.tar.gz
sync: Recover from errors during read-treev2.51
When repo is initializing a git repository, it calls `git read-tree`. During such operation, git is restoring workspace based on the current index. However, some things can go wrong: a user can run out of disk space, or, in case of partial clone, user may no longer reach the remote host. That will leave affected repository in a bad state with partially checked out workspace. The follow up repo sync won't try to fix such state. This change removes .git symlink, which will force the next `repo sync` to redo Git repository setup. Bug: b/363171216 Bug: b/390161127 Change-Id: I57db4b6cae0ef21826dc7cede4d3bf02cfc3d955 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/447801 Reviewed-by: Scott Lee <ddoman@google.com> Tested-by: Josip Sokcevic <sokcevic@chromium.org> Commit-Queue: Josip Sokcevic <sokcevic@chromium.org>
-rw-r--r--project.py17
1 files changed, 12 insertions, 5 deletions
diff --git a/project.py b/project.py
index 8fec9816..de1ab3c6 100644
--- a/project.py
+++ b/project.py
@@ -3443,11 +3443,18 @@ class Project:
3443 3443
3444 # Finish checking out the worktree. 3444 # Finish checking out the worktree.
3445 cmd = ["read-tree", "--reset", "-u", "-v", HEAD] 3445 cmd = ["read-tree", "--reset", "-u", "-v", HEAD]
3446 if GitCommand(self, cmd).Wait() != 0: 3446 try:
3447 raise GitError( 3447 if GitCommand(self, cmd).Wait() != 0:
3448 "Cannot initialize work tree for " + self.name, 3448 raise GitError(
3449 project=self.name, 3449 "Cannot initialize work tree for " + self.name,
3450 ) 3450 project=self.name,
3451 )
3452 except Exception as e:
3453 # Something went wrong with read-tree (perhaps fetching
3454 # missing blobs), so remove .git to avoid half initialized
3455 # workspace from which repo can't recover on its own.
3456 platform_utils.remove(dotgit)
3457 raise e
3451 3458
3452 if submodules: 3459 if submodules:
3453 self._SyncSubmodules(quiet=True) 3460 self._SyncSubmodules(quiet=True)