diff options
author | Josip Sokcevic <sokcevic@chromium.org> | 2025-01-15 23:43:22 +0000 |
---|---|---|
committer | LUCI <gerrit-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2025-01-16 09:19:45 -0800 |
commit | db111d392407797e170355e1c0ec98e71d4a8278 (patch) | |
tree | 453a756ed1a3a97ffb0a4c013d931fdf4a5497e9 /project.py | |
parent | 3405446a4eb382467ef539764f6a31869fd1ce43 (diff) | |
download | git-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>
Diffstat (limited to 'project.py')
-rw-r--r-- | project.py | 17 |
1 files changed, 12 insertions, 5 deletions
@@ -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) |