diff options
author | Dominic <yobmod@gmail.com> | 2021-08-03 16:40:48 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-03 16:40:48 +0100 |
commit | fe54118ec07a68d5dc6f6108510cffc55dfca643 (patch) | |
tree | 3025974ca54ef607ee3d4660da4dc242e184f8ea /git/repo/fun.py | |
parent | d8a639865d02a6bb3f93a233d3caa928d18bc622 (diff) | |
parent | 84232f7c71e41e56636f203eb26763a03ab6e945 (diff) | |
download | gitpython-fe54118ec07a68d5dc6f6108510cffc55dfca643.tar.gz |
Merge pull request #1311 from Yobmod/main
Drop 3.6, increase type strictness
Diffstat (limited to 'git/repo/fun.py')
-rw-r--r-- | git/repo/fun.py | 27 |
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 |