diff options
-rw-r--r-- | git/objects/base.py | 2 | ||||
-rw-r--r-- | git/objects/tag.py | 8 | ||||
-rw-r--r-- | git/objects/util.py | 26 |
3 files changed, 21 insertions, 15 deletions
diff --git a/git/objects/base.py b/git/objects/base.py index 34c595ee..884f9651 100644 --- a/git/objects/base.py +++ b/git/objects/base.py @@ -89,7 +89,7 @@ class Object(LazyMixin): """Retrieve object information""" if attr == "size": oinfo = self.repo.odb.info(self.binsha) - self.size = oinfo.size + self.size = oinfo.size # type: int # assert oinfo.type == self.type, _assertion_msg_format % (self.binsha, oinfo.type, self.type) else: super(Object, self)._set_cache_(attr) diff --git a/git/objects/tag.py b/git/objects/tag.py index 84d65d3f..abcc7534 100644 --- a/git/objects/tag.py +++ b/git/objects/tag.py @@ -14,6 +14,9 @@ from typing import List, TYPE_CHECKING, Union if TYPE_CHECKING: from git.repo import Repo from git.util import Actor + from .commit import Commit + from .blob import Blob + from .tree import Tree __all__ = ("TagObject", ) @@ -42,7 +45,7 @@ class TagObject(base.Object): authored_date is in, in a format similar to time.altzone""" super(TagObject, self).__init__(repo, binsha) if object is not None: - self.object = object + self.object = object # type: Union['Commit', 'Blob', 'Tree', 'TagObject'] if tag is not None: self.tag = tag if tagger is not None: @@ -62,8 +65,9 @@ class TagObject(base.Object): _obj, hexsha = lines[0].split(" ") _type_token, type_name = lines[1].split(" ") + object_type = get_object_type_by_name(type_name.encode('ascii')) self.object = \ - get_object_type_by_name(type_name.encode('ascii'))(self.repo, hex_to_bin(hexsha)) + object_type(self.repo, hex_to_bin(hexsha)) self.tag = lines[2][4:] # tag <tag name> diff --git a/git/objects/util.py b/git/objects/util.py index ebfb3758..6bc1b709 100644 --- a/git/objects/util.py +++ b/git/objects/util.py @@ -18,7 +18,7 @@ import calendar from datetime import datetime, timedelta, tzinfo # typing ------------------------------------------------------------ -from typing import Literal, TYPE_CHECKING, Tuple, Union +from typing import Literal, TYPE_CHECKING, Tuple, Type, Union, cast if TYPE_CHECKING: from .commit import Commit @@ -36,7 +36,7 @@ ZERO = timedelta(0) #{ Functions -def mode_str_to_int(modestr: str) -> int: +def mode_str_to_int(modestr: Union[bytes, str]) -> int: """ :param modestr: string like 755 or 644 or 100644 - only the last 6 chars will be used :return: @@ -46,12 +46,14 @@ def mode_str_to_int(modestr: str) -> int: for example.""" mode = 0 for iteration, char in enumerate(reversed(modestr[-6:])): + char = cast(Union[str, int], char) mode += int(char) << iteration * 3 # END for each char return mode -def get_object_type_by_name(object_type_name: str) -> Union['Commit', 'TagObject', 'Tree', 'Blob']: +def get_object_type_by_name(object_type_name: bytes + ) -> Union[Type['Commit'], Type['TagObject'], Type['Tree'], Type['Blob']]: """ :return: type suitable to handle the given object type name. Use the type to create new instances. @@ -72,7 +74,7 @@ def get_object_type_by_name(object_type_name: str) -> Union['Commit', 'TagObject from . import tree return tree.Tree else: - raise ValueError("Cannot handle unknown object type: %s" % object_type_name) + raise ValueError("Cannot handle unknown object type: %s" % object_type_name.decode()) def utctz_to_altz(utctz: str) -> int: @@ -116,7 +118,7 @@ class tzoffset(tzinfo): self._offset = timedelta(seconds=-secs_west_of_utc) self._name = name or 'fixed' - def __reduce__(self) -> Tuple['tzoffset', Tuple[float, str]]: + def __reduce__(self) -> Tuple[Type['tzoffset'], Tuple[float, str]]: return tzoffset, (-self._offset.total_seconds(), self._name) def utcoffset(self, dt) -> timedelta: @@ -163,18 +165,18 @@ def parse_date(string_date: str) -> Tuple[int, int]: # git time try: if string_date.count(' ') == 1 and string_date.rfind(':') == -1: - timestamp, offset = string_date.split() + timestamp, offset_str = string_date.split() if timestamp.startswith('@'): timestamp = timestamp[1:] - timestamp = int(timestamp) - return timestamp, utctz_to_altz(verify_utctz(offset)) + timestamp_int = int(timestamp) + return timestamp_int, utctz_to_altz(verify_utctz(offset_str)) else: - offset = "+0000" # local time by default + offset_str = "+0000" # local time by default if string_date[-5] in '-+': - offset = verify_utctz(string_date[-5:]) + offset_str = verify_utctz(string_date[-5:]) string_date = string_date[:-6] # skip space as well # END split timezone info - offset = utctz_to_altz(offset) + offset = utctz_to_altz(offset_str) # now figure out the date and time portion - split time date_formats = [] @@ -235,7 +237,7 @@ def parse_actor_and_date(line: str) -> Tuple[Actor, int, int]: author Tom Preston-Werner <tom@mojombo.com> 1191999972 -0700 :return: [Actor, int_seconds_since_epoch, int_timezone_offset]""" - actor, epoch, offset = '', 0, 0 + actor, epoch, offset = '', '0', '0' m = _re_actor_epoch.search(line) if m: actor, epoch, offset = m.groups() |