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+
16from pathlib import Path
27
38import pytest
49
510from git import Repo
11+ from git .refs import SymbolicReference
612from gitdb .exc import BadName
713
814
@@ -55,16 +61,21 @@ def rev_parse_repo(tmp_path):
5561
5662def 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
6980def 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
93105def 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
118135def 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