project: centralize safe branch and commit resolution

Resolve commit-ish values through one typed helper using rev-parse
--verify --quiet and, on Git 2.30+, --end-of-options. Reject option-like
revisions on older clients, reuse the helper for project and manifest
resolution, and validate user branch names with check-ref-format
--branch.

Bug: 553599402
Change-Id: I2dda49ff3e781cec14d3b84263a8dace06b4073f
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/623182
Tested-by: Gavin Mak <gavinmak@google.com>
Commit-Queue: Gavin Mak <gavinmak@google.com>
Reviewed-by: Brian Gan <brgan@google.com>
This commit is contained in:
Gavin Mak authored and gerrit-scoped@luci-project-accounts.iam.gserviceaccount.com committed 2026-08-31 12:34:53 -07:00
1 parent 6541729a18
commit d27034bf62
7 files changed
+95 -10

No files matched your search

+15 -2
View File
@@ -1767,7 +1767,7 @@ class Project:
return self.GetRevisionId(self._allrefs)
try:
return self.bare_git.rev_list(self.revisionExpr, "-1")[0]
return self.bare_git.ResolveCommit(self.revisionExpr)
except GitError:
raise ManifestInvalidRevisionError(
f"revision {self.revisionExpr} in {self.name} not found"
@@ -1800,7 +1800,7 @@ class Project:
return all_refs[rev]
try:
return self.bare_git.rev_parse("--verify", "%s^0" % rev)
return self.bare_git.ResolveCommit(rev)
except GitError:
raise ManifestInvalidRevisionError(
f"revision {self.revisionExpr} in {self.name} not found"
@@ -4581,6 +4581,19 @@ class Project:
)
return ref
def ResolveCommit(self, revision: str) -> str:
"""Resolve |revision| to a commit without option ambiguity."""
cmdv = ["--verify", "--quiet"]
if git_require((2, 30, 0)):
cmdv.append("--end-of-options")
elif revision.startswith("-"):
raise GitError(
f"invalid revision: {revision}",
project=self._project.name,
)
cmdv.append(f"{revision}^{{commit}}")
return self.rev_parse(*cmdv, log_as_error=False)
def SetHead(self, ref, message=None):
cmdv = []
if message is not None: