summaryrefslogtreecommitdiff
path: root/git/repo/fun.py
diff options
context:
space:
mode:
Diffstat (limited to 'git/repo/fun.py')
-rw-r--r--git/repo/fun.py27
1 files changed, 17 insertions, 10 deletions
diff --git a/git/repo/fun.py b/git/repo/fun.py
index 7d5c7823..1a83dd3d 100644
--- a/git/repo/fun.py
+++ b/git/repo/fun.py
@@ -1,4 +1,5 @@
"""Package with general repository related functions"""
+from __future__ import annotations
import os
import stat
from string import digits
@@ -18,12 +19,13 @@ from git.cmd import Git
# Typing ----------------------------------------------------------------------
from typing import Union, Optional, cast, TYPE_CHECKING
-
+from git.types import Commit_ish
if TYPE_CHECKING:
from git.types import PathLike
from .base import Repo
from git.db import GitCmdObjectDB
+ from git.refs.reference import Reference
from git.objects import Commit, TagObject, Blob, Tree
from git.refs.tag import Tag
@@ -202,7 +204,7 @@ def rev_parse(repo: 'Repo', rev: str) -> Union['Commit', 'Tag', 'Tree', 'Blob']:
raise NotImplementedError("commit by message search ( regex )")
# END handle search
- obj = cast(Object, None) # not ideal. Should use guards
+ obj: Union[Commit_ish, 'Reference', None] = None
ref = None
output_type = "commit"
start = 0
@@ -222,14 +224,16 @@ def rev_parse(repo: 'Repo', rev: str) -> Union['Commit', 'Tag', 'Tree', 'Blob']:
ref = repo.head.ref
else:
if token == '@':
- ref = name_to_object(repo, rev[:start], return_ref=True)
+ ref = cast('Reference', name_to_object(repo, rev[:start], return_ref=True))
else:
- obj = name_to_object(repo, rev[:start])
+ obj = cast(Commit_ish, name_to_object(repo, rev[:start]))
# END handle token
# END handle refname
+ else:
+ assert obj is not None
if ref is not None:
- obj = ref.commit
+ obj = cast('Commit', ref.commit)
# END handle ref
# END initialize obj on first token
@@ -247,11 +251,13 @@ def rev_parse(repo: 'Repo', rev: str) -> Union['Commit', 'Tag', 'Tree', 'Blob']:
pass # default
elif output_type == 'tree':
try:
+ obj = cast(Commit_ish, obj)
obj = to_commit(obj).tree
except (AttributeError, ValueError):
pass # error raised later
# END exception handling
elif output_type in ('', 'blob'):
+ obj = cast('TagObject', obj)
if obj and obj.type == 'tag':
obj = deref_tag(obj)
else:
@@ -280,13 +286,13 @@ def rev_parse(repo: 'Repo', rev: str) -> Union['Commit', 'Tag', 'Tree', 'Blob']:
obj = Object.new_from_sha(repo, hex_to_bin(entry.newhexsha))
# make it pass the following checks
- output_type = None
+ output_type = ''
else:
raise ValueError("Invalid output type: %s ( in %s )" % (output_type, rev))
# END handle output type
# empty output types don't require any specific type, its just about dereferencing tags
- if output_type and obj.type != output_type:
+ if output_type and obj and obj.type != output_type:
raise ValueError("Could not accommodate requested object type %r, got %s" % (output_type, obj.type))
# END verify output type
@@ -319,6 +325,7 @@ def rev_parse(repo: 'Repo', rev: str) -> Union['Commit', 'Tag', 'Tree', 'Blob']:
parsed_to = start
# handle hierarchy walk
try:
+ obj = cast(Commit_ish, obj)
if token == "~":
obj = to_commit(obj)
for _ in range(num):
@@ -340,14 +347,14 @@ def rev_parse(repo: 'Repo', rev: str) -> Union['Commit', 'Tag', 'Tree', 'Blob']:
# END end handle tag
except (IndexError, AttributeError) as e:
raise BadName(
- "Invalid revision spec '%s' - not enough "
- "parent commits to reach '%s%i'" % (rev, token, num)) from e
+ f"Invalid revision spec '{rev}' - not enough "
+ f"parent commits to reach '{token}{int(num)}'") from e
# END exception handling
# END parse loop
# still no obj ? Its probably a simple name
if obj is None:
- obj = name_to_object(repo, rev)
+ obj = cast(Commit_ish, name_to_object(repo, rev))
parsed_to = lr
# END handle simple name