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.py38
1 files changed, 25 insertions, 13 deletions
diff --git a/git/repo/fun.py b/git/repo/fun.py
index 714d4122..70394081 100644
--- a/git/repo/fun.py
+++ b/git/repo/fun.py
@@ -1,4 +1,5 @@
"""Package with general repository related functions"""
+from git.refs.tag import Tag
import os
import stat
from string import digits
@@ -15,18 +16,28 @@ from gitdb.exc import (
import os.path as osp
from git.cmd import Git
+# Typing ----------------------------------------------------------------------
+
+from typing import AnyStr, Union, Optional, cast, TYPE_CHECKING
+from git.types import PathLike
+if TYPE_CHECKING:
+ from .base import Repo
+ from git.db import GitCmdObjectDB
+ from git.objects import Commit, TagObject, Blob, Tree
+
+# ----------------------------------------------------------------------------
__all__ = ('rev_parse', 'is_git_dir', 'touch', 'find_submodule_git_dir', 'name_to_object', 'short_to_long', 'deref_tag',
'to_commit', 'find_worktree_git_dir')
-def touch(filename):
+def touch(filename: str) -> str:
with open(filename, "ab"):
pass
return filename
-def is_git_dir(d):
+def is_git_dir(d: PathLike) -> bool:
""" This is taken from the git setup.c:is_git_directory
function.
@@ -48,7 +59,7 @@ def is_git_dir(d):
return False
-def find_worktree_git_dir(dotgit):
+def find_worktree_git_dir(dotgit: PathLike) -> Optional[str]:
"""Search for a gitdir for this worktree."""
try:
statbuf = os.stat(dotgit)
@@ -67,7 +78,7 @@ def find_worktree_git_dir(dotgit):
return None
-def find_submodule_git_dir(d):
+def find_submodule_git_dir(d: PathLike) -> Optional[PathLike]:
"""Search for a submodule repo."""
if is_git_dir(d):
return d
@@ -75,7 +86,7 @@ def find_submodule_git_dir(d):
try:
with open(d) as fp:
content = fp.read().rstrip()
- except (IOError, OSError):
+ except IOError:
# it's probably not a file
pass
else:
@@ -92,7 +103,7 @@ def find_submodule_git_dir(d):
return None
-def short_to_long(odb, hexsha):
+def short_to_long(odb: 'GitCmdObjectDB', hexsha: AnyStr) -> Optional[bytes]:
""":return: long hexadecimal sha1 from the given less-than-40 byte hexsha
or None if no candidate could be found.
:param hexsha: hexsha with less than 40 byte"""
@@ -103,14 +114,15 @@ def short_to_long(odb, hexsha):
# END exception handling
-def name_to_object(repo, name, return_ref=False):
+def name_to_object(repo: 'Repo', name: str, return_ref: bool = False
+ ) -> Union[SymbolicReference, 'Commit', 'TagObject', 'Blob', 'Tree']:
"""
:return: object specified by the given name, hexshas ( short and long )
as well as references are supported
:param return_ref: if name specifies a reference, we will return the reference
instead of the object. Otherwise it will raise BadObject or BadName
"""
- hexsha = None
+ hexsha = None # type: Union[None, str, bytes]
# is it a hexsha ? Try the most common ones, which is 7 to 40
if repo.re_hexsha_shortened.match(name):
@@ -150,7 +162,7 @@ def name_to_object(repo, name, return_ref=False):
return Object.new_from_sha(repo, hex_to_bin(hexsha))
-def deref_tag(tag):
+def deref_tag(tag: Tag) -> 'TagObject':
"""Recursively dereference a tag and return the resulting object"""
while True:
try:
@@ -161,7 +173,7 @@ def deref_tag(tag):
return tag
-def to_commit(obj):
+def to_commit(obj: Object) -> Union['Commit', 'TagObject']:
"""Convert the given object to a commit if possible and return it"""
if obj.type == 'tag':
obj = deref_tag(obj)
@@ -172,7 +184,7 @@ def to_commit(obj):
return obj
-def rev_parse(repo, rev):
+def rev_parse(repo: 'Repo', rev: str) -> Union['Commit', 'Tag', 'Tree', 'Blob']:
"""
:return: Object at the given revision, either Commit, Tag, Tree or Blob
:param rev: git-rev-parse compatible revision specification as string, please see
@@ -188,7 +200,7 @@ def rev_parse(repo, rev):
raise NotImplementedError("commit by message search ( regex )")
# END handle search
- obj = None
+ obj = cast(Object, None) # not ideal. Should use guards
ref = None
output_type = "commit"
start = 0
@@ -238,7 +250,7 @@ def rev_parse(repo, rev):
pass # error raised later
# END exception handling
elif output_type in ('', 'blob'):
- if obj.type == 'tag':
+ if obj and obj.type == 'tag':
obj = deref_tag(obj)
else:
# cannot do anything for non-tags