Skip to content

Commit 96942dd

Browse files
codexByron
authored andcommitted
Address rev-parse review feedback
1 parent bdbdf4b commit 96942dd

2 files changed

Lines changed: 34 additions & 9 deletions

File tree

git/repo/fun.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -190,10 +190,6 @@ def name_to_object(repo: "Repo", name: str, return_ref: bool = False) -> Union[A
190190
# END handle short shas
191191
# END find sha if it matches
192192

193-
if hexsha is None:
194-
hexsha = _describe_to_long(repo, name)
195-
# END handle describe output
196-
197193
# If we couldn't find an object for what seemed to be a short hexsha, try to find it
198194
# as reference anyway, it could be named 'aaa' for instance.
199195
if hexsha is None:
@@ -216,6 +212,10 @@ def name_to_object(repo: "Repo", name: str, return_ref: bool = False) -> Union[A
216212
# END for each base
217213
# END handle hexsha
218214

215+
if hexsha is None:
216+
hexsha = _describe_to_long(repo, name)
217+
# END handle describe output
218+
219219
# Didn't find any ref, this is an error.
220220
if return_ref:
221221
raise BadObject("Couldn't find reference named %r" % name)
@@ -363,6 +363,8 @@ def _tracking_branch_object(repo: "Repo", ref: Optional[SymbolicReference]) -> A
363363
raise BadName("@{upstream}") from e
364364
elif isinstance(ref, Head):
365365
head = ref
366+
elif os.fspath(ref.path).startswith("refs/heads/"):
367+
head = Head(repo, ref.path)
366368
else:
367369
raise BadName("%s@{upstream}" % ref.name)
368370
# END handle head
@@ -479,7 +481,11 @@ def _find_commit_by_message(
479481
repo: "Repo", rev: Optional[AnyGitObject], pattern: str, braced: bool = False
480482
) -> AnyGitObject:
481483
pattern, negated = _parse_search(_unescape_braced_regex(pattern) if braced else pattern)
482-
regex = re.compile(pattern)
484+
try:
485+
regex = re.compile(pattern)
486+
except re.error as e:
487+
raise ValueError("Invalid commit message regex %r" % pattern) from e
488+
# END handle invalid regex
483489
if rev is None:
484490
commits = repo.iter_commits("--all")
485491
else:
@@ -527,8 +533,6 @@ def _tree_lookup(obj: AnyGitObject, path: str) -> AnyGitObject:
527533

528534

529535
def _peel(obj: AnyGitObject, output_type: str, repo: "Repo", rev: str) -> AnyGitObject:
530-
if output_type == "/":
531-
return obj
532536
if output_type.startswith("/"):
533537
return _find_commit_by_message(repo, obj, output_type[1:], braced=True)
534538
if output_type == "":

test/test_rev_parse.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
1+
# Copyright (C) 2026 Michael Trier (mtrier@gmail.com) and contributors
2+
#
3+
# This module is part of GitPython and is released under the
4+
# 3-Clause BSD License: https://opensource.org/license/bsd-3-clause/
5+
16
from pathlib import Path
27

38
import pytest
49

510
from git import Repo
11+
from git.refs import SymbolicReference
612
from gitdb.exc import BadName
713

814

@@ -55,16 +61,21 @@ def rev_parse_repo(tmp_path):
5561

5662
def test_rev_parse_names_hex_and_describe_forms(rev_parse_repo):
5763
repo = rev_parse_repo["repo"]
64+
release = rev_parse_repo["release"]
5865
merge = rev_parse_repo["merge"]
5966

6067
assert repo.rev_parse("@") == merge
6168
assert repo.rev_parse("@foo") == merge
6269
assert repo.rev_parse("aaaaaaaa") == merge
6370
assert repo.rev_parse(merge.hexsha[:7]) == merge
71+
describe_name = "anything-9-g%s" % merge.hexsha[:7]
6472
assert repo.rev_parse("v1.0-1-g%s" % merge.hexsha[:7]) == merge
65-
assert repo.rev_parse("anything-9-g%s" % merge.hexsha[:7]) == merge
73+
assert repo.rev_parse(describe_name) == merge
6674
assert repo.rev_parse("%s-dirty" % merge.hexsha[:7]) == merge
6775

76+
repo.create_tag(describe_name, ref=release)
77+
assert repo.rev_parse(describe_name) == release
78+
6879

6980
def test_rev_parse_navigation_and_peeling(rev_parse_repo):
7081
repo = rev_parse_repo["repo"]
@@ -87,7 +98,8 @@ def test_rev_parse_navigation_and_peeling(rev_parse_repo):
8798
assert repo.rev_parse("ann^{}") == root
8899
assert repo.rev_parse("ann^{commit}") == root
89100
assert repo.rev_parse("HEAD^{tree}") == merge.tree
90-
assert repo.rev_parse("HEAD^{/}") == merge
101+
with pytest.raises(ValueError):
102+
repo.rev_parse("HEAD^{/}")
91103

92104

93105
def test_rev_parse_tree_and_index_paths(rev_parse_repo):
@@ -114,6 +126,11 @@ def test_rev_parse_reflog_selectors(rev_parse_repo):
114126
assert repo.rev_parse("%s@{0}" % main.name) == merge
115127
assert repo.rev_parse("@{-1}") == side
116128

129+
repo.create_remote("origin", repo.working_tree_dir)
130+
SymbolicReference.create(repo, "refs/remotes/origin/%s" % main.name, merge)
131+
main.set_tracking_branch(repo.remotes.origin.refs[main.name])
132+
assert repo.rev_parse("%s@{upstream}" % main.name) == merge
133+
117134

118135
def test_rev_parse_commit_message_search(rev_parse_repo):
119136
repo = rev_parse_repo["repo"]
@@ -132,6 +149,10 @@ def test_rev_parse_rejects_invalid_object_specs(rev_parse_repo):
132149
repo.rev_parse(":")
133150
with pytest.raises(ValueError):
134151
repo.rev_parse(":/")
152+
with pytest.raises(ValueError):
153+
repo.rev_parse(":/[")
154+
with pytest.raises(ValueError):
155+
repo.rev_parse("HEAD^{/[}")
135156
with pytest.raises(ValueError):
136157
repo.rev_parse("@{-0}")
137158
with pytest.raises(ValueError):

0 commit comments

Comments
 (0)