summaryrefslogtreecommitdiffstats
path: root/project.py
diff options
context:
space:
mode:
authorGavin Mak <gavinmak@google.com>2025-08-04 12:08:13 -0700
committerLUCI <gerrit-scoped@luci-project-accounts.iam.gserviceaccount.com>2025-08-04 12:17:44 -0700
commit8c3585f367a7d09095a22565a44fa3b47f5b690c (patch)
treeac5a9e00d2e32d7770b359ba6dbff263e99fdc5d /project.py
parent239fad7146e04c631825c340f23d6e69947aac50 (diff)
downloadgit-repo-8c3585f367a7d09095a22565a44fa3b47f5b690c.tar.gz
project: fallback to reading HEAD when rev-parse failsv2.57.3
git rev-parse fails on invalid HEAD, e.g. after incomplete sync, causing NoManifestException. Fall back to v2.56's direct file reading when rev-parse fails. Bug: 435045466 Change-Id: Ia14560335110c00d80408b2a93595a84446f8a57 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/495181 Commit-Queue: Gavin Mak <gavinmak@google.com> Reviewed-by: Scott Lee <ddoman@google.com> Tested-by: Gavin Mak <gavinmak@google.com>
Diffstat (limited to 'project.py')
-rw-r--r--project.py23
1 files changed, 22 insertions, 1 deletions
diff --git a/project.py b/project.py
index 4c699d4b..2badfb02 100644
--- a/project.py
+++ b/project.py
@@ -3841,8 +3841,29 @@ class Project:
3841 return self.rev_parse(HEAD) 3841 return self.rev_parse(HEAD)
3842 return symbolic_head 3842 return symbolic_head
3843 except GitError as e: 3843 except GitError as e:
3844 logger.warning(
3845 "project %s: unparseable HEAD; trying to recover.\n"
3846 "Check that HEAD ref in .git/HEAD is valid. The error "
3847 "was: %s",
3848 self._project.RelPath(local=False),
3849 e,
3850 )
3851
3852 # Fallback to direct file reading for compatibility with broken
3853 # repos, e.g. if HEAD points to an unborn branch.
3844 path = self.GetDotgitPath(subpath=HEAD) 3854 path = self.GetDotgitPath(subpath=HEAD)
3845 raise NoManifestException(path, str(e)) 3855 try:
3856 with open(path) as fd:
3857 line = fd.readline()
3858 except OSError:
3859 raise NoManifestException(path, str(e))
3860 try:
3861 line = line.decode()
3862 except AttributeError:
3863 pass
3864 if line.startswith("ref: "):
3865 return line[5:-1]
3866 return line[:-1]
3846 3867
3847 def SetHead(self, ref, message=None): 3868 def SetHead(self, ref, message=None):
3848 cmdv = [] 3869 cmdv = []