From 3347c00137e45a8b8b512afab242703892a1a1d2 Mon Sep 17 00:00:00 2001 From: Yobmod Date: Wed, 28 Jul 2021 15:57:22 +0100 Subject: [PATCH 01/15] change ordereddict guard, add type: ignore --- git/config.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/git/config.py b/git/config.py index c4b26ba63..77fa3045c 100644 --- a/git/config.py +++ b/git/config.py @@ -41,12 +41,17 @@ T_ConfigParser = TypeVar('T_ConfigParser', bound='GitConfigParser') -if sys.version_info[:2] < (3, 7): +if sys.version_info[:2] < (3, 7, 2): + # typing.Ordereddict not added until py 3.7.2 from collections import OrderedDict OrderedDict_OMD = OrderedDict +elif sys.version_info[:2] >= (3, 10): + # then deprecated from 3.10 as collections.OrderedDict was made generic + from collections import OrderedDict + OrderedDict_OMD = OrderedDict[str, List[_T]] else: from typing import OrderedDict - OrderedDict_OMD = OrderedDict[str, List[_T]] + OrderedDict_OMD = OrderedDict[str, List[_T]] # type: ignore[assignment, misc] # ------------------------------------------------------------- From 28fdd30a579362a1121fa7e81d8051098b31f2d1 Mon Sep 17 00:00:00 2001 From: Yobmod Date: Wed, 28 Jul 2021 16:26:35 +0100 Subject: [PATCH 02/15] Fix SymbolicReference reference typing --- git/refs/head.py | 2 +- git/refs/symbolic.py | 6 ++++-- git/repo/base.py | 5 ++--- test/test_refs.py | 9 +++++++-- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/git/refs/head.py b/git/refs/head.py index 338efce9f..4b9bf33cc 100644 --- a/git/refs/head.py +++ b/git/refs/head.py @@ -142,7 +142,7 @@ def delete(cls, repo: 'Repo', *heads: 'Head', **kwargs: Any): flag = "-D" repo.git.branch(flag, *heads) - def set_tracking_branch(self, remote_reference: 'RemoteReference') -> 'Head': + def set_tracking_branch(self, remote_reference: Union['RemoteReference', None]) -> 'Head': """ Configure this branch to track the given remote reference. This will alter this branch's configuration accordingly. diff --git a/git/refs/symbolic.py b/git/refs/symbolic.py index 0e9dad5cc..9a5a44794 100644 --- a/git/refs/symbolic.py +++ b/git/refs/symbolic.py @@ -28,6 +28,7 @@ if TYPE_CHECKING: from git.repo import Repo + from git.refs import Reference T_References = TypeVar('T_References', bound='SymbolicReference') @@ -356,8 +357,9 @@ def set_reference(self, ref, logmsg=None): return self # aliased reference - reference = property(_get_reference, set_reference, doc="Returns the Reference we point to") - ref: Union[Commit_ish] = reference # type: ignore # Union[str, Commit_ish, SymbolicReference] + reference: Union[Commit_ish, 'Reference'] = property( # type: ignore + _get_reference, set_reference, doc="Returns the Reference we point to") + ref = reference def is_valid(self): """ diff --git a/git/repo/base.py b/git/repo/base.py index f8a1689a1..74f27b2e1 100644 --- a/git/repo/base.py +++ b/git/repo/base.py @@ -422,7 +422,7 @@ def _to_full_tag_path(path): def create_head(self, path: PathLike, commit: str = 'HEAD', force: bool = False, logmsg: Optional[str] = None - ) -> 'SymbolicReference': + ) -> 'Head': """Create a new head within the repository. For more documentation, please see the Head.create method. @@ -788,9 +788,8 @@ def ignored(self, *paths: PathLike) -> List[PathLike]: return proc.replace("\\\\", "\\").replace('"', "").split("\n") @property - def active_branch(self) -> 'SymbolicReference': + def active_branch(self) -> 'HEAD': """The name of the currently active branch. - :return: Head to the active branch""" return self.head.reference diff --git a/test/test_refs.py b/test/test_refs.py index 1315f885f..6f158bee2 100644 --- a/test/test_refs.py +++ b/test/test_refs.py @@ -4,6 +4,7 @@ # This module is part of GitPython and is released under # the BSD License: http://www.opensource.org/licenses/bsd-license.php +from git.repo.base import Repo from itertools import chain from git import ( @@ -125,11 +126,15 @@ def test_heads(self, rwrepo): gp_tracking_branch = rwrepo.create_head('gp_tracking#123') special_name_remote_ref = rwrepo.remotes[0].refs[special_name] # get correct type gp_tracking_branch.set_tracking_branch(special_name_remote_ref) - assert gp_tracking_branch.tracking_branch().path == special_name_remote_ref.path + TBranch = gp_tracking_branch.tracking_branch() + if TBranch is not None: + assert TBranch.path == special_name_remote_ref.path git_tracking_branch = rwrepo.create_head('git_tracking#123') rwrepo.git.branch('-u', special_name_remote_ref.name, git_tracking_branch.name) - assert git_tracking_branch.tracking_branch().name == special_name_remote_ref.name + TBranch = gp_tracking_branch.tracking_branch() + if TBranch is not None: + assert TBranch.name == special_name_remote_ref.name # END for each head # verify REFLOG gets altered From 3abc837c7c1f3241524d788933c287ec1a804b7e Mon Sep 17 00:00:00 2001 From: Yobmod Date: Wed, 28 Jul 2021 16:35:38 +0100 Subject: [PATCH 03/15] Add another type ignore for Ordereddict --- git/config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/git/config.py b/git/config.py index 77fa3045c..def8ab8c4 100644 --- a/git/config.py +++ b/git/config.py @@ -41,7 +41,7 @@ T_ConfigParser = TypeVar('T_ConfigParser', bound='GitConfigParser') -if sys.version_info[:2] < (3, 7, 2): +if sys.version_info[:3] < (3, 7, 2): # typing.Ordereddict not added until py 3.7.2 from collections import OrderedDict OrderedDict_OMD = OrderedDict @@ -50,7 +50,7 @@ from collections import OrderedDict OrderedDict_OMD = OrderedDict[str, List[_T]] else: - from typing import OrderedDict + from typing import OrderedDict # type: ignore # until 3.6 dropped OrderedDict_OMD = OrderedDict[str, List[_T]] # type: ignore[assignment, misc] # ------------------------------------------------------------- From 679142481d94c779d46f1e347604ec9ab24b05f3 Mon Sep 17 00:00:00 2001 From: Yobmod Date: Wed, 28 Jul 2021 16:41:14 +0100 Subject: [PATCH 04/15] Rmv py 3.10 check for typing.Ordereddict - its deprecated then, but will still work until 3.12 --- git/config.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/git/config.py b/git/config.py index def8ab8c4..ad02b4373 100644 --- a/git/config.py +++ b/git/config.py @@ -43,12 +43,8 @@ if sys.version_info[:3] < (3, 7, 2): # typing.Ordereddict not added until py 3.7.2 - from collections import OrderedDict - OrderedDict_OMD = OrderedDict -elif sys.version_info[:2] >= (3, 10): - # then deprecated from 3.10 as collections.OrderedDict was made generic - from collections import OrderedDict - OrderedDict_OMD = OrderedDict[str, List[_T]] + from collections import OrderedDict # type: ignore # until 3.6 dropped + OrderedDict_OMD = OrderedDict # type: ignore # until 3.6 dropped else: from typing import OrderedDict # type: ignore # until 3.6 dropped OrderedDict_OMD = OrderedDict[str, List[_T]] # type: ignore[assignment, misc] From c464e33793d0839666233883212018dbbcdf1e09 Mon Sep 17 00:00:00 2001 From: Yobmod Date: Wed, 28 Jul 2021 17:19:10 +0100 Subject: [PATCH 05/15] Fix some SymbolicReference types --- git/refs/symbolic.py | 80 +++++++++++++++++++++----------------------- git/refs/tag.py | 2 +- git/repo/base.py | 2 +- test/test_refs.py | 1 - 4 files changed, 41 insertions(+), 44 deletions(-) diff --git a/git/refs/symbolic.py b/git/refs/symbolic.py index 9a5a44794..86dc04e10 100644 --- a/git/refs/symbolic.py +++ b/git/refs/symbolic.py @@ -1,4 +1,3 @@ -from git.types import PathLike import os from git.compat import defenc @@ -17,13 +16,11 @@ BadName ) -import os.path as osp - from .log import RefLog # typing ------------------------------------------------------------------ -from typing import Any, Iterator, List, Match, Optional, Tuple, Type, TypeVar, Union, TYPE_CHECKING # NOQA +from typing import Any, Iterator, List, Match, Optional, Tuple, Type, TypeVar, Union, TYPE_CHECKING, cast # NOQA from git.types import Commit_ish, PathLike, TBD, Literal # NOQA if TYPE_CHECKING: @@ -38,9 +35,9 @@ __all__ = ["SymbolicReference"] -def _git_dir(repo, path): +def _git_dir(repo: 'Repo', path: PathLike) -> PathLike: """ Find the git dir that's appropriate for the path""" - name = "%s" % (path,) + name = f"{path}" if name in ['HEAD', 'ORIG_HEAD', 'FETCH_HEAD', 'index', 'logs']: return repo.git_dir return repo.common_dir @@ -60,46 +57,46 @@ class SymbolicReference(object): _remote_common_path_default = "refs/remotes" _id_attribute_ = "name" - def __init__(self, repo: 'Repo', path: PathLike, check_path: bool = False): + def __init__(self, repo: 'Repo', path: PathLike, check_path: bool = False) -> None: self.repo = repo self.path = str(path) def __str__(self) -> str: return self.path - def __repr__(self): + def __repr__(self) -> str: return '' % (self.__class__.__name__, self.path) - def __eq__(self, other): + def __eq__(self, other) -> bool: if hasattr(other, 'path'): return self.path == other.path return False - def __ne__(self, other): + def __ne__(self, other) -> bool: return not (self == other) def __hash__(self): return hash(self.path) @property - def name(self): + def name(self) -> str: """ :return: In case of symbolic references, the shortest assumable name is the path itself.""" - return self.path + return str(self.path) @property - def abspath(self): + def abspath(self) -> PathLike: return join_path_native(_git_dir(self.repo, self.path), self.path) @classmethod - def _get_packed_refs_path(cls, repo): - return osp.join(repo.common_dir, 'packed-refs') + def _get_packed_refs_path(cls, repo: 'Repo') -> str: + return os.path.join(repo.common_dir, 'packed-refs') @classmethod - def _iter_packed_refs(cls, repo): - """Returns an iterator yielding pairs of sha1/path pairs (as bytes) for the corresponding refs. + def _iter_packed_refs(cls, repo: 'Repo') -> Iterator[Tuple[str, str]]: + """Returns an iterator yielding pairs of sha1/path pairs for the corresponding refs. :note: The packed refs file will be kept open as long as we iterate""" try: with open(cls._get_packed_refs_path(repo), 'rt', encoding='UTF-8') as fp: @@ -127,7 +124,7 @@ def _iter_packed_refs(cls, repo): if line[0] == '^': continue - yield tuple(line.split(' ', 1)) + yield cast(Tuple[str, str], tuple(line.split(' ', 1))) # END for each line except OSError: return None @@ -138,7 +135,7 @@ def _iter_packed_refs(cls, repo): # alright. @classmethod - def dereference_recursive(cls, repo, ref_path): + def dereference_recursive(cls, repo: 'Repo', ref_path: PathLike) -> str: """ :return: hexsha stored in the reference at the given ref_path, recursively dereferencing all intermediate references as required @@ -150,14 +147,14 @@ def dereference_recursive(cls, repo, ref_path): # END recursive dereferencing @classmethod - def _get_ref_info_helper(cls, repo, ref_path): + def _get_ref_info_helper(cls, repo: Repo, ref_path: PathLike): """Return: (str(sha), str(target_ref_path)) if available, the sha the file at rela_path points to, or None. target_ref_path is the reference we point to, or None""" - tokens = None + tokens: Union[List[str], Tuple[str, str], None] = None repodir = _git_dir(repo, ref_path) try: - with open(osp.join(repodir, ref_path), 'rt', encoding='UTF-8') as fp: + with open(os.path.join(repodir, ref_path), 'rt', encoding='UTF-8') as fp: value = fp.read().rstrip() # Don't only split on spaces, but on whitespace, which allows to parse lines like # 60b64ef992065e2600bfef6187a97f92398a9144 branch 'master' of git-server:/path/to/repo @@ -189,7 +186,7 @@ def _get_ref_info_helper(cls, repo, ref_path): raise ValueError("Failed to parse reference information from %r" % ref_path) @classmethod - def _get_ref_info(cls, repo, ref_path): + def _get_ref_info(cls, repo: 'Repo', ref_path: PathLike): """Return: (str(sha), str(target_ref_path)) if available, the sha the file at rela_path points to, or None. target_ref_path is the reference we point to, or None""" @@ -424,21 +421,22 @@ def log_entry(self, index): return RefLog.entry_at(RefLog.path(self), index) @classmethod - def to_full_path(cls, path) -> PathLike: + def to_full_path(cls, path: Union[PathLike, 'SymbolicReference']) -> str: """ :return: string with a full repository-relative path which can be used to initialize a Reference instance, for instance by using ``Reference.from_path``""" if isinstance(path, SymbolicReference): path = path.path - full_ref_path = path + full_ref_path = str(path) if not cls._common_path_default: return full_ref_path - if not path.startswith(cls._common_path_default + "/"): + + if not str(path).startswith(cls._common_path_default + "/"): full_ref_path = '%s/%s' % (cls._common_path_default, path) return full_ref_path @classmethod - def delete(cls, repo, path): + def delete(cls, repo: 'Repo', path: PathLike) -> None: """Delete the reference at the given path :param repo: @@ -449,8 +447,8 @@ def delete(cls, repo, path): or just "myreference", hence 'refs/' is implied. Alternatively the symbolic reference to be deleted""" full_ref_path = cls.to_full_path(path) - abs_path = osp.join(repo.common_dir, full_ref_path) - if osp.exists(abs_path): + abs_path = os.path.join(repo.common_dir, full_ref_path) + if os.path.exists(abs_path): os.remove(abs_path) else: # check packed refs @@ -460,8 +458,8 @@ def delete(cls, repo, path): new_lines = [] made_change = False dropped_last_line = False - for line in reader: - line = line.decode(defenc) + for line_bytes in reader: + line = line_bytes.decode(defenc) _, _, line_ref = line.partition(' ') line_ref = line_ref.strip() # keep line if it is a comment or if the ref to delete is not @@ -491,7 +489,7 @@ def delete(cls, repo, path): # delete the reflog reflog_path = RefLog.path(cls(repo, full_ref_path)) - if osp.isfile(reflog_path): + if os.path.isfile(reflog_path): os.remove(reflog_path) # END remove reflog @@ -504,14 +502,14 @@ def _create(cls, repo, path, resolve, reference, force, logmsg=None): instead""" git_dir = _git_dir(repo, path) full_ref_path = cls.to_full_path(path) - abs_ref_path = osp.join(git_dir, full_ref_path) + abs_ref_path = os.path.join(git_dir, full_ref_path) # figure out target data target = reference if resolve: target = repo.rev_parse(str(reference)) - if not force and osp.isfile(abs_ref_path): + if not force and os.path.isfile(abs_ref_path): target_data = str(target) if isinstance(target, SymbolicReference): target_data = target.path @@ -561,7 +559,7 @@ def create(cls, repo: 'Repo', path: PathLike, reference: Union[Commit_ish, str] :note: This does not alter the current HEAD, index or Working Tree""" return cls._create(repo, path, cls._resolve_ref_on_create, reference, force, logmsg) - def rename(self, new_path, force=False): + def rename(self, new_path: str, force: bool = False) -> 'SymbolicReference': """Rename self to a new path :param new_path: @@ -579,9 +577,9 @@ def rename(self, new_path, force=False): if self.path == new_path: return self - new_abs_path = osp.join(_git_dir(self.repo, new_path), new_path) - cur_abs_path = osp.join(_git_dir(self.repo, self.path), self.path) - if osp.isfile(new_abs_path): + new_abs_path = os.path.join(_git_dir(self.repo, new_path), new_path) + cur_abs_path = os.path.join(_git_dir(self.repo, self.path), self.path) + if os.path.isfile(new_abs_path): if not force: # if they point to the same file, its not an error with open(new_abs_path, 'rb') as fd1: @@ -596,8 +594,8 @@ def rename(self, new_path, force=False): os.remove(new_abs_path) # END handle existing target file - dname = osp.dirname(new_abs_path) - if not osp.isdir(dname): + dname = os.path.dirname(new_abs_path) + if not os.path.isdir(dname): os.makedirs(dname) # END create directory @@ -632,7 +630,7 @@ def _iter_items(cls: Type[T_References], repo: 'Repo', common_path: Union[PathLi # read packed refs for _sha, rela_path in cls._iter_packed_refs(repo): - if rela_path.startswith(common_path): + if rela_path.startswith(str(common_path)): rela_paths.add(rela_path) # END relative path matches common path # END packed refs reading diff --git a/git/refs/tag.py b/git/refs/tag.py index 281ce09ad..3aec99fed 100644 --- a/git/refs/tag.py +++ b/git/refs/tag.py @@ -111,7 +111,7 @@ def create(cls, repo: 'Repo', path: PathLike, reference: Union[Commit_ish, str] return TagReference(repo, "%s/%s" % (cls._common_path_default, path)) @classmethod - def delete(cls, repo: 'Repo', *tags: 'TagReference') -> None: + def delete(cls, repo: 'Repo', *tags: 'TagReference') -> None: # type: ignore[override] """Delete the given existing tag or tags""" repo.git.tag("-d", *tags) diff --git a/git/repo/base.py b/git/repo/base.py index 74f27b2e1..12efe9c66 100644 --- a/git/repo/base.py +++ b/git/repo/base.py @@ -429,7 +429,7 @@ def create_head(self, path: PathLike, commit: str = 'HEAD', :return: newly created Head Reference""" return Head.create(self, path, commit, logmsg, force) - def delete_head(self, *heads: 'SymbolicReference', **kwargs: Any) -> None: + def delete_head(self, *heads: 'Head', **kwargs: Any) -> None: """Delete the given heads :param kwargs: Additional keyword arguments to be passed to git-branch""" diff --git a/test/test_refs.py b/test/test_refs.py index 6f158bee2..f30d4bdaf 100644 --- a/test/test_refs.py +++ b/test/test_refs.py @@ -4,7 +4,6 @@ # This module is part of GitPython and is released under # the BSD License: http://www.opensource.org/licenses/bsd-license.php -from git.repo.base import Repo from itertools import chain from git import ( From 7cf30c1cf4a6494916a162983bdb439388d59ff3 Mon Sep 17 00:00:00 2001 From: Yobmod Date: Wed, 28 Jul 2021 17:22:09 +0100 Subject: [PATCH 06/15] Fix forwardref --- git/refs/symbolic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/git/refs/symbolic.py b/git/refs/symbolic.py index 86dc04e10..4919ea835 100644 --- a/git/refs/symbolic.py +++ b/git/refs/symbolic.py @@ -147,7 +147,7 @@ def dereference_recursive(cls, repo: 'Repo', ref_path: PathLike) -> str: # END recursive dereferencing @classmethod - def _get_ref_info_helper(cls, repo: Repo, ref_path: PathLike): + def _get_ref_info_helper(cls, repo: 'Repo', ref_path: PathLike): """Return: (str(sha), str(target_ref_path)) if available, the sha the file at rela_path points to, or None. target_ref_path is the reference we point to, or None""" From 5b880c0e98e41276de9fc498b25727c149cfcc40 Mon Sep 17 00:00:00 2001 From: Yobmod Date: Wed, 28 Jul 2021 17:39:01 +0100 Subject: [PATCH 07/15] Fix more missing types in Symbolic.py --- git/refs/symbolic.py | 22 +++++++++++++--------- pyproject.toml | 6 +++--- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/git/refs/symbolic.py b/git/refs/symbolic.py index 4919ea835..2e8544d39 100644 --- a/git/refs/symbolic.py +++ b/git/refs/symbolic.py @@ -25,7 +25,7 @@ if TYPE_CHECKING: from git.repo import Repo - from git.refs import Reference + from git.refs import Reference, Head, HEAD, TagReference, RemoteReference T_References = TypeVar('T_References', bound='SymbolicReference') @@ -141,13 +141,13 @@ def dereference_recursive(cls, repo: 'Repo', ref_path: PathLike) -> str: intermediate references as required :param repo: the repository containing the reference at ref_path""" while True: - hexsha, ref_path = cls._get_ref_info(repo, ref_path) + hexsha, _ref_path_out = cls._get_ref_info(repo, ref_path) if hexsha is not None: return hexsha # END recursive dereferencing @classmethod - def _get_ref_info_helper(cls, repo: 'Repo', ref_path: PathLike): + def _get_ref_info_helper(cls, repo: 'Repo', ref_path: PathLike) -> Union[Tuple[str, None], Tuple[None, PathLike]]: """Return: (str(sha), str(target_ref_path)) if available, the sha the file at rela_path points to, or None. target_ref_path is the reference we point to, or None""" @@ -186,13 +186,14 @@ def _get_ref_info_helper(cls, repo: 'Repo', ref_path: PathLike): raise ValueError("Failed to parse reference information from %r" % ref_path) @classmethod - def _get_ref_info(cls, repo: 'Repo', ref_path: PathLike): + def _get_ref_info(cls, repo: 'Repo', ref_path: PathLike + ) -> Union[Tuple[str, None], Tuple[None, PathLike]]: """Return: (str(sha), str(target_ref_path)) if available, the sha the file at rela_path points to, or None. target_ref_path is the reference we point to, or None""" return cls._get_ref_info_helper(repo, ref_path) - def _get_object(self): + def _get_object(self) -> Commit_ish: """ :return: The object our ref currently refers to. Refs can be cached, they will @@ -201,7 +202,7 @@ def _get_object(self): # Our path will be resolved to the hexsha which will be used accordingly return Object.new_from_sha(self.repo, hex_to_bin(self.dereference_recursive(self.repo, self.path))) - def _get_commit(self): + def _get_commit(self) -> 'Commit': """ :return: Commit object we point to, works for detached and non-detached @@ -216,7 +217,8 @@ def _get_commit(self): # END handle type return obj - def set_commit(self, commit: Union[Commit, 'SymbolicReference', str], logmsg=None): + def set_commit(self, commit: Union[Commit, 'SymbolicReference', str], + logmsg: Union[str, None] = None) -> None: """As set_object, but restricts the type of object to be a Commit :raise ValueError: If commit is not a Commit object or doesn't point to @@ -243,7 +245,8 @@ def set_commit(self, commit: Union[Commit, 'SymbolicReference', str], logmsg=Non # we leave strings to the rev-parse method below self.set_object(commit, logmsg) - return self + # return self + return None def set_object(self, object, logmsg=None): # @ReservedAssignment """Set the object we point to, possibly dereference our symbolic reference first. @@ -275,7 +278,8 @@ def set_object(self, object, logmsg=None): # @ReservedAssignment commit = property(_get_commit, set_commit, doc="Query or set commits directly") object = property(_get_object, set_object, doc="Return the object our ref currently refers to") - def _get_reference(self): + def _get_reference(self + ) -> Union['HEAD', 'Head', 'RemoteReference', 'TagReference', 'Reference', 'SymbolicReference']: """:return: Reference Object we point to :raise TypeError: If this symbolic reference is detached, hence it doesn't point to a reference, but to a commit""" diff --git a/pyproject.toml b/pyproject.toml index 94f74793d..de5bc4eaf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,11 +19,11 @@ filterwarnings = 'ignore::DeprecationWarning' # filterwarnings ignore::WarningType # ignores those warnings [tool.mypy] -# disallow_untyped_defs = True +# disallow_untyped_defs = true no_implicit_optional = true warn_redundant_casts = true -# warn_unused_ignores = True -# warn_unreachable = True +# warn_unused_ignores = true +# warn_unreachable = true show_error_codes = true # TODO: remove when 'gitdb' is fully annotated From 07d71e57c422e8df943fe14f5e2a1b4856d5077c Mon Sep 17 00:00:00 2001 From: Yobmod Date: Wed, 28 Jul 2021 17:58:23 +0100 Subject: [PATCH 08/15] Fix more missing types in Symbolic.py --- git/refs/symbolic.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/git/refs/symbolic.py b/git/refs/symbolic.py index 2e8544d39..d5dc87c6e 100644 --- a/git/refs/symbolic.py +++ b/git/refs/symbolic.py @@ -358,11 +358,11 @@ def set_reference(self, ref, logmsg=None): return self # aliased reference - reference: Union[Commit_ish, 'Reference'] = property( # type: ignore + reference: Union[Commit_ish, 'Head', 'Reference'] = property( # type: ignore _get_reference, set_reference, doc="Returns the Reference we point to") ref = reference - def is_valid(self): + def is_valid(self) -> bool: """ :return: True if the reference is valid, hence it can be read and points to @@ -531,7 +531,7 @@ def _create(cls, repo, path, resolve, reference, force, logmsg=None): return ref @classmethod - def create(cls, repo: 'Repo', path: PathLike, reference: Union[Commit_ish, str] = 'HEAD', + def create(cls, repo: 'Repo', path: PathLike, reference: Union[Commit_ish, str] = 'SymbolicReference', logmsg: Union[str, None] = None, force: bool = False, **kwargs: Any): """Create a new symbolic reference, hence a reference pointing , to another reference. From b8b07b9ff5fe478b872d3da767e549841da02205 Mon Sep 17 00:00:00 2001 From: Yobmod Date: Wed, 28 Jul 2021 18:03:29 +0100 Subject: [PATCH 09/15] Fix more missing types in Symbolic.py. --- git/refs/tag.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/git/refs/tag.py b/git/refs/tag.py index 3aec99fed..4cbea5ea0 100644 --- a/git/refs/tag.py +++ b/git/refs/tag.py @@ -98,7 +98,9 @@ def create(cls, repo: 'Repo', path: PathLike, reference: Union[Commit_ish, str] Additional keyword arguments to be passed to git-tag :return: A new TagReference""" - args = (path, reference) + if 'ref' in kwargs and kwargs['ref']: + reference = kwargs['ref'] + if logmsg: kwargs['m'] = logmsg elif 'message' in kwargs and kwargs['message']: @@ -107,6 +109,8 @@ def create(cls, repo: 'Repo', path: PathLike, reference: Union[Commit_ish, str] if force: kwargs['f'] = True + args = (path, reference) + repo.git.tag(*args, **kwargs) return TagReference(repo, "%s/%s" % (cls._common_path_default, path)) From 390efbf521d62d9cb188c7688288878ef1b1b45d Mon Sep 17 00:00:00 2001 From: Yobmod Date: Wed, 28 Jul 2021 20:40:29 +0100 Subject: [PATCH 10/15] Fix more missing types in Symbolic.py, cos GuthubActions pytest stuck --- git/objects/submodule/base.py | 8 ++++--- git/refs/symbolic.py | 41 +++++++++++++++++++++-------------- git/refs/tag.py | 6 +++-- git/repo/base.py | 3 ++- pyproject.toml | 6 ++--- t.py | 9 ++++++++ 6 files changed, 48 insertions(+), 25 deletions(-) create mode 100644 t.py diff --git a/git/objects/submodule/base.py b/git/objects/submodule/base.py index 29212167c..143511909 100644 --- a/git/objects/submodule/base.py +++ b/git/objects/submodule/base.py @@ -563,6 +563,7 @@ def update(self, recursive: bool = False, init: bool = True, to_latest_revision: progress.update(op, i, len_rmts, prefix + "Done fetching remote of submodule %r" % self.name) # END fetch new data except InvalidGitRepositoryError: + mrepo = None if not init: return self # END early abort if init is not allowed @@ -603,7 +604,7 @@ def update(self, recursive: bool = False, init: bool = True, to_latest_revision: # make sure HEAD is not detached mrepo.head.set_reference(local_branch, logmsg="submodule: attaching head to %s" % local_branch) - mrepo.head.ref.set_tracking_branch(remote_branch) + mrepo.head.reference.set_tracking_branch(remote_branch) except (IndexError, InvalidGitRepositoryError): log.warning("Failed to checkout tracking branch %s", self.branch_path) # END handle tracking branch @@ -629,13 +630,14 @@ def update(self, recursive: bool = False, init: bool = True, to_latest_revision: if mrepo is not None and to_latest_revision: msg_base = "Cannot update to latest revision in repository at %r as " % mrepo.working_dir if not is_detached: - rref = mrepo.head.ref.tracking_branch() + rref = mrepo.head.reference.tracking_branch() if rref is not None: rcommit = rref.commit binsha = rcommit.binsha hexsha = rcommit.hexsha else: - log.error("%s a tracking branch was not set for local branch '%s'", msg_base, mrepo.head.ref) + log.error("%s a tracking branch was not set for local branch '%s'", + msg_base, mrepo.head.reference) # END handle remote ref else: log.error("%s there was no local tracking branch", msg_base) diff --git a/git/refs/symbolic.py b/git/refs/symbolic.py index d5dc87c6e..4ae7a9d11 100644 --- a/git/refs/symbolic.py +++ b/git/refs/symbolic.py @@ -25,7 +25,7 @@ if TYPE_CHECKING: from git.repo import Repo - from git.refs import Reference, Head, HEAD, TagReference, RemoteReference + from git.refs import Reference, Head, TagReference, RemoteReference T_References = TypeVar('T_References', bound='SymbolicReference') @@ -60,6 +60,7 @@ class SymbolicReference(object): def __init__(self, repo: 'Repo', path: PathLike, check_path: bool = False) -> None: self.repo = repo self.path = str(path) + self.ref = self._get_reference() def __str__(self) -> str: return self.path @@ -279,7 +280,7 @@ def set_object(self, object, logmsg=None): # @ReservedAssignment object = property(_get_object, set_object, doc="Return the object our ref currently refers to") def _get_reference(self - ) -> Union['HEAD', 'Head', 'RemoteReference', 'TagReference', 'Reference', 'SymbolicReference']: + ) -> Union['Head', 'RemoteReference', 'TagReference', 'Reference']: """:return: Reference Object we point to :raise TypeError: If this symbolic reference is detached, hence it doesn't point to a reference, but to a commit""" @@ -288,7 +289,8 @@ def _get_reference(self raise TypeError("%s is a detached symbolic reference as it points to %r" % (self, sha)) return self.from_path(self.repo, target_ref_path) - def set_reference(self, ref, logmsg=None): + def set_reference(self, ref: Union[str, Commit_ish, 'SymbolicReference'], logmsg: Union[str, None] = None + ) -> None: """Set ourselves to the given ref. It will stay a symbol if the ref is a Reference. Otherwise an Object, given as Object instance or refspec, is assumed and if valid, will be set which effectively detaches the refererence if it was a purely @@ -355,12 +357,16 @@ def set_reference(self, ref, logmsg=None): if logmsg is not None: self.log_append(oldbinsha, logmsg) - return self + return None - # aliased reference - reference: Union[Commit_ish, 'Head', 'Reference'] = property( # type: ignore - _get_reference, set_reference, doc="Returns the Reference we point to") - ref = reference + @ property + def reference(self) -> Union['Head', 'RemoteReference', 'TagReference', 'Reference']: + return self._get_reference() + + @ reference.setter + def reference(self, ref: Union[str, Commit_ish, 'SymbolicReference'], logmsg: Union[str, None] = None + ) -> None: + return self.set_reference(ref=ref, logmsg=logmsg) def is_valid(self) -> bool: """ @@ -374,7 +380,7 @@ def is_valid(self) -> bool: else: return True - @property + @ property def is_detached(self): """ :return: @@ -424,7 +430,7 @@ def log_entry(self, index): In that case, it will be faster than the ``log()`` method""" return RefLog.entry_at(RefLog.path(self), index) - @classmethod + @ classmethod def to_full_path(cls, path: Union[PathLike, 'SymbolicReference']) -> str: """ :return: string with a full repository-relative path which can be used to initialize @@ -439,7 +445,7 @@ def to_full_path(cls, path: Union[PathLike, 'SymbolicReference']) -> str: full_ref_path = '%s/%s' % (cls._common_path_default, path) return full_ref_path - @classmethod + @ classmethod def delete(cls, repo: 'Repo', path: PathLike) -> None: """Delete the reference at the given path @@ -497,8 +503,10 @@ def delete(cls, repo: 'Repo', path: PathLike) -> None: os.remove(reflog_path) # END remove reflog - @classmethod - def _create(cls, repo, path, resolve, reference, force, logmsg=None): + @ classmethod + def _create(cls: Type[T_References], repo: 'Repo', path: PathLike, resolve: bool, + reference: Union[str, 'SymbolicReference'], + force: bool, logmsg: Union[str, None] = None) -> T_References: """internal method used to create a new symbolic reference. If resolve is False, the reference will be taken as is, creating a proper symbolic reference. Otherwise it will be resolved to the @@ -531,8 +539,9 @@ def _create(cls, repo, path, resolve, reference, force, logmsg=None): return ref @classmethod - def create(cls, repo: 'Repo', path: PathLike, reference: Union[Commit_ish, str] = 'SymbolicReference', - logmsg: Union[str, None] = None, force: bool = False, **kwargs: Any): + def create(cls: Type[T_References], repo: 'Repo', path: PathLike, + reference: Union[Commit_ish, str, 'SymbolicReference'] = 'SymbolicReference', + logmsg: Union[str, None] = None, force: bool = False, **kwargs: Any) -> T_References: """Create a new symbolic reference, hence a reference pointing , to another reference. :param repo: @@ -669,7 +678,7 @@ def iter_items(cls, repo: 'Repo', common_path: Union[PathLike, None] = None, *ar return (r for r in cls._iter_items(repo, common_path) if r.__class__ == SymbolicReference or not r.is_detached) @classmethod - def from_path(cls, repo, path): + def from_path(cls, repo: 'Repo', path: PathLike) -> Union['Head', 'RemoteReference', 'TagReference', 'Reference']: """ :param path: full .git-directory-relative path name to the Reference to instantiate :note: use to_full_path() if you only have a partial path of a known Reference Type diff --git a/git/refs/tag.py b/git/refs/tag.py index 4cbea5ea0..ce2a58a05 100644 --- a/git/refs/tag.py +++ b/git/refs/tag.py @@ -4,13 +4,14 @@ # typing ------------------------------------------------------------------ -from typing import Any, Union, TYPE_CHECKING +from typing import Any, Type, Union, TYPE_CHECKING from git.types import Commit_ish, PathLike if TYPE_CHECKING: from git.repo import Repo from git.objects import Commit from git.objects import TagObject + from git.refs import SymbolicReference # ------------------------------------------------------------------------------ @@ -68,7 +69,8 @@ def object(self) -> Commit_ish: # type: ignore[override] return Reference._get_object(self) @classmethod - def create(cls, repo: 'Repo', path: PathLike, reference: Union[Commit_ish, str] = 'HEAD', + def create(cls: Type['TagReference'], repo: 'Repo', path: PathLike, + reference: Union[Commit_ish, str, 'SymbolicReference'] = 'HEAD', logmsg: Union[str, None] = None, force: bool = False, **kwargs: Any) -> 'TagReference': """Create a new tag reference. diff --git a/git/repo/base.py b/git/repo/base.py index 12efe9c66..355f93999 100644 --- a/git/repo/base.py +++ b/git/repo/base.py @@ -788,9 +788,10 @@ def ignored(self, *paths: PathLike) -> List[PathLike]: return proc.replace("\\\\", "\\").replace('"', "").split("\n") @property - def active_branch(self) -> 'HEAD': + def active_branch(self) -> Head: """The name of the currently active branch. :return: Head to the active branch""" + # reveal_type(self.head.reference) # => Reference return self.head.reference def blame_incremental(self, rev: TBD, file: TBD, **kwargs: Any) -> Optional[Iterator['BlameEntry']]: diff --git a/pyproject.toml b/pyproject.toml index de5bc4eaf..94f74793d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,11 +19,11 @@ filterwarnings = 'ignore::DeprecationWarning' # filterwarnings ignore::WarningType # ignores those warnings [tool.mypy] -# disallow_untyped_defs = true +# disallow_untyped_defs = True no_implicit_optional = true warn_redundant_casts = true -# warn_unused_ignores = true -# warn_unreachable = true +# warn_unused_ignores = True +# warn_unreachable = True show_error_codes = true # TODO: remove when 'gitdb' is fully annotated diff --git a/t.py b/t.py new file mode 100644 index 000000000..560e420ea --- /dev/null +++ b/t.py @@ -0,0 +1,9 @@ +from git import Repo + + +def get_active_branch(gitobj: Repo) -> str: + return gitobj.active_branch.name + + +gitobj = Repo(".") +print(get_active_branch(gitobj)) From 070f5c0d1f06d3e15ec5aa841b96fa2a1fdb7bf4 Mon Sep 17 00:00:00 2001 From: Yobmod Date: Wed, 28 Jul 2021 20:41:16 +0100 Subject: [PATCH 11/15] Rmv test file --- t.py | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 t.py diff --git a/t.py b/t.py deleted file mode 100644 index 560e420ea..000000000 --- a/t.py +++ /dev/null @@ -1,9 +0,0 @@ -from git import Repo - - -def get_active_branch(gitobj: Repo) -> str: - return gitobj.active_branch.name - - -gitobj = Repo(".") -print(get_active_branch(gitobj)) From adc00dd1773ee1b532803b2272cc989f11e09f8a Mon Sep 17 00:00:00 2001 From: Yobmod Date: Wed, 28 Jul 2021 21:50:49 +0100 Subject: [PATCH 12/15] Fix more missing types in Symbolic.py, cos GuthubActions pytest stuck --- git/objects/commit.py | 1 + git/objects/util.py | 5 +++++ git/refs/head.py | 13 ++++++------ git/refs/reference.py | 4 +++- git/refs/symbolic.py | 47 ++++++++++++++++++++++++++----------------- git/refs/tag.py | 4 ++-- 6 files changed, 47 insertions(+), 27 deletions(-) diff --git a/git/objects/commit.py b/git/objects/commit.py index 884f65228..9d7096563 100644 --- a/git/objects/commit.py +++ b/git/objects/commit.py @@ -128,6 +128,7 @@ def __init__(self, repo: 'Repo', binsha: bytes, tree: Union[Tree, None] = None, as what time.altzone returns. The sign is inverted compared to git's UTC timezone.""" super(Commit, self).__init__(repo, binsha) + self.binsha = binsha if tree is not None: assert isinstance(tree, Tree), "Tree needs to be a Tree instance, was %s" % type(tree) if tree is not None: diff --git a/git/objects/util.py b/git/objects/util.py index ef1ae77ba..db7807c26 100644 --- a/git/objects/util.py +++ b/git/objects/util.py @@ -493,6 +493,11 @@ def list_traverse(self: T_TIobj, *args: Any, **kwargs: Any) -> IterableList[T_TI return super(TraversableIterableObj, self)._list_traverse(* args, **kwargs) @ overload # type: ignore + def traverse(self: T_TIobj + ) -> Iterator[T_TIobj]: + ... + + @ overload def traverse(self: T_TIobj, predicate: Callable[[Union[T_TIobj, Tuple[Union[T_TIobj, None], T_TIobj]], int], bool], prune: Callable[[Union[T_TIobj, Tuple[Union[T_TIobj, None], T_TIobj]], int], bool], diff --git a/git/refs/head.py b/git/refs/head.py index 4b9bf33cc..260bf5e7e 100644 --- a/git/refs/head.py +++ b/git/refs/head.py @@ -1,4 +1,4 @@ -from git.config import SectionConstraint +from git.config import GitConfigParser, SectionConstraint from git.util import join_path from git.exc import GitCommandError @@ -203,7 +203,7 @@ def rename(self, new_path: PathLike, force: bool = False) -> 'Head': self.path = "%s/%s" % (self._common_path_default, new_path) return self - def checkout(self, force: bool = False, **kwargs: Any): + def checkout(self, force: bool = False, **kwargs: Any) -> Union['HEAD', 'Head']: """Checkout this head by setting the HEAD to this reference, by updating the index to reflect the tree we point to and by updating the working tree to reflect the latest index. @@ -235,10 +235,11 @@ def checkout(self, force: bool = False, **kwargs: Any): self.repo.git.checkout(self, **kwargs) if self.repo.head.is_detached: return self.repo.head - return self.repo.active_branch + else: + return self.repo.active_branch #{ Configuration - def _config_parser(self, read_only: bool) -> SectionConstraint: + def _config_parser(self, read_only: bool) -> SectionConstraint[GitConfigParser]: if read_only: parser = self.repo.config_reader() else: @@ -247,13 +248,13 @@ def _config_parser(self, read_only: bool) -> SectionConstraint: return SectionConstraint(parser, 'branch "%s"' % self.name) - def config_reader(self) -> SectionConstraint: + def config_reader(self) -> SectionConstraint[GitConfigParser]: """ :return: A configuration parser instance constrained to only read this instance's values""" return self._config_parser(read_only=True) - def config_writer(self) -> SectionConstraint: + def config_writer(self) -> SectionConstraint[GitConfigParser]: """ :return: A configuration writer instance with read-and write access to options of this head""" diff --git a/git/refs/reference.py b/git/refs/reference.py index 646622816..bc2c6e807 100644 --- a/git/refs/reference.py +++ b/git/refs/reference.py @@ -62,7 +62,9 @@ def __str__(self) -> str: #{ Interface - def set_object(self, object: Commit_ish, logmsg: Union[str, None] = None) -> 'Reference': # @ReservedAssignment + # @ReservedAssignment + def set_object(self, object: Union[Commit_ish, 'SymbolicReference'], logmsg: Union[str, None] = None + ) -> 'SymbolicReference': """Special version which checks if the head-log needs an update as well :return: self""" oldbinsha = None diff --git a/git/refs/symbolic.py b/git/refs/symbolic.py index 4ae7a9d11..4171fe234 100644 --- a/git/refs/symbolic.py +++ b/git/refs/symbolic.py @@ -16,7 +16,7 @@ BadName ) -from .log import RefLog +from .log import RefLog, RefLogEntry # typing ------------------------------------------------------------------ @@ -26,6 +26,8 @@ if TYPE_CHECKING: from git.repo import Repo from git.refs import Reference, Head, TagReference, RemoteReference + from git.config import GitConfigParser + from git.objects.commit import Actor T_References = TypeVar('T_References', bound='SymbolicReference') @@ -229,11 +231,13 @@ def set_commit(self, commit: Union[Commit, 'SymbolicReference', str], invalid_type = False if isinstance(commit, Object): invalid_type = commit.type != Commit.type + commit = cast('Commit', commit) elif isinstance(commit, SymbolicReference): invalid_type = commit.object.type != Commit.type else: try: - invalid_type = self.repo.rev_parse(commit).type != Commit.type + commit = self.repo.rev_parse(commit) + invalid_type = commit.type != Commit.type except (BadObject, BadName) as e: raise ValueError("Invalid object: %s" % commit) from e # END handle exception @@ -249,7 +253,9 @@ def set_commit(self, commit: Union[Commit, 'SymbolicReference', str], # return self return None - def set_object(self, object, logmsg=None): # @ReservedAssignment + def set_object(self, object: Union[Commit_ish, 'SymbolicReference'], + logmsg: Union[str, None] = None + ) -> 'SymbolicReference': # @ReservedAssignment """Set the object we point to, possibly dereference our symbolic reference first. If the reference does not exist, it will be created @@ -276,8 +282,8 @@ def set_object(self, object, logmsg=None): # @ReservedAssignment # set the commit on our reference return self._get_reference().set_object(object, logmsg) - commit = property(_get_commit, set_commit, doc="Query or set commits directly") - object = property(_get_object, set_object, doc="Return the object our ref currently refers to") + commit = cast('Commit', property(_get_commit, set_commit, doc="Query or set commits directly")) + object = property(_get_object, set_object, doc="Return the object our ref currently refers to") # type: ignore def _get_reference(self ) -> Union['Head', 'RemoteReference', 'TagReference', 'Reference']: @@ -290,7 +296,7 @@ def _get_reference(self return self.from_path(self.repo, target_ref_path) def set_reference(self, ref: Union[str, Commit_ish, 'SymbolicReference'], logmsg: Union[str, None] = None - ) -> None: + ) -> 'SymbolicReference': """Set ourselves to the given ref. It will stay a symbol if the ref is a Reference. Otherwise an Object, given as Object instance or refspec, is assumed and if valid, will be set which effectively detaches the refererence if it was a purely @@ -331,7 +337,7 @@ def set_reference(self, ref: Union[str, Commit_ish, 'SymbolicReference'], logmsg raise TypeError("Require commit, got %r" % obj) # END verify type - oldbinsha = None + oldbinsha: bytes = b'' if logmsg is not None: try: oldbinsha = self.commit.binsha @@ -357,7 +363,7 @@ def set_reference(self, ref: Union[str, Commit_ish, 'SymbolicReference'], logmsg if logmsg is not None: self.log_append(oldbinsha, logmsg) - return None + return self @ property def reference(self) -> Union['Head', 'RemoteReference', 'TagReference', 'Reference']: @@ -365,7 +371,7 @@ def reference(self) -> Union['Head', 'RemoteReference', 'TagReference', 'Referen @ reference.setter def reference(self, ref: Union[str, Commit_ish, 'SymbolicReference'], logmsg: Union[str, None] = None - ) -> None: + ) -> 'SymbolicReference': return self.set_reference(ref=ref, logmsg=logmsg) def is_valid(self) -> bool: @@ -392,7 +398,7 @@ def is_detached(self): except TypeError: return True - def log(self): + def log(self) -> 'RefLog': """ :return: RefLog for this reference. Its last entry reflects the latest change applied to this reference @@ -401,7 +407,8 @@ def log(self): instead of calling this method repeatedly. It should be considered read-only.""" return RefLog.from_file(RefLog.path(self)) - def log_append(self, oldbinsha, message, newbinsha=None): + def log_append(self, oldbinsha: bytes, message: Union[str, None], + newbinsha: Union[bytes, None] = None) -> 'RefLogEntry': """Append a logentry to the logfile of this ref :param oldbinsha: binary sha this ref used to point to @@ -413,15 +420,19 @@ def log_append(self, oldbinsha, message, newbinsha=None): # correct to allow overriding the committer on a per-commit level. # See https://github.com/gitpython-developers/GitPython/pull/146 try: - committer_or_reader = self.commit.committer + committer_or_reader: Union['Actor', 'GitConfigParser'] = self.commit.committer except ValueError: committer_or_reader = self.repo.config_reader() # end handle newly cloned repositories - return RefLog.append_entry(committer_or_reader, RefLog.path(self), oldbinsha, - (newbinsha is None and self.commit.binsha) or newbinsha, - message) + if newbinsha is None: + newbinsha = self.commit.binsha + + if message is None: + message = '' + + return RefLog.append_entry(committer_or_reader, RefLog.path(self), oldbinsha, newbinsha, message) - def log_entry(self, index): + def log_entry(self, index: int) -> RefLogEntry: """:return: RefLogEntry at the given index :param index: python list compatible positive or negative index @@ -540,7 +551,7 @@ def _create(cls: Type[T_References], repo: 'Repo', path: PathLike, resolve: bool @classmethod def create(cls: Type[T_References], repo: 'Repo', path: PathLike, - reference: Union[Commit_ish, str, 'SymbolicReference'] = 'SymbolicReference', + reference: Union[str, 'SymbolicReference'] = 'SymbolicReference', logmsg: Union[str, None] = None, force: bool = False, **kwargs: Any) -> T_References: """Create a new symbolic reference, hence a reference pointing , to another reference. @@ -553,7 +564,7 @@ def create(cls: Type[T_References], repo: 'Repo', path: PathLike, :param reference: The reference to which the new symbolic reference should point to. - If it is a commit'ish, the symbolic ref will be detached. + If it is a ref to a commit'ish, the symbolic ref will be detached. :param force: if True, force creation even if a symbolic reference with that name already exists. diff --git a/git/refs/tag.py b/git/refs/tag.py index ce2a58a05..edfab33d8 100644 --- a/git/refs/tag.py +++ b/git/refs/tag.py @@ -70,7 +70,7 @@ def object(self) -> Commit_ish: # type: ignore[override] @classmethod def create(cls: Type['TagReference'], repo: 'Repo', path: PathLike, - reference: Union[Commit_ish, str, 'SymbolicReference'] = 'HEAD', + reference: Union[str, 'SymbolicReference'] = 'HEAD', logmsg: Union[str, None] = None, force: bool = False, **kwargs: Any) -> 'TagReference': """Create a new tag reference. @@ -80,7 +80,7 @@ def create(cls: Type['TagReference'], repo: 'Repo', path: PathLike, The prefix refs/tags is implied :param ref: - A reference to the object you want to tag. It can be a commit, tree or + A reference to the Object you want to tag. The Object can be a commit, tree or blob. :param logmsg: From 28251c3858fd9fb528bde0ef77a2de9a3995a20f Mon Sep 17 00:00:00 2001 From: Yobmod Date: Wed, 28 Jul 2021 21:57:19 +0100 Subject: [PATCH 13/15] Try downgrading pip --- .github/workflows/pythonpackage.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pythonpackage.yml b/.github/workflows/pythonpackage.yml index bf712b2d8..d293bc9a8 100644 --- a/.github/workflows/pythonpackage.yml +++ b/.github/workflows/pythonpackage.yml @@ -28,7 +28,8 @@ jobs: - name: Install dependencies and prepare tests run: | set -x - python -m pip install --upgrade pip setuptools wheel + python -m pip install pip==21.1.3 + python -m pip install --upgrade setuptools wheel python --version; git --version git submodule update --init --recursive git fetch --tags From dbb689b19891ab3151e406cdf9751becfa1b31fa Mon Sep 17 00:00:00 2001 From: Yobmod Date: Wed, 28 Jul 2021 22:15:54 +0100 Subject: [PATCH 14/15] its not pip... --- .github/workflows/pythonpackage.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/pythonpackage.yml b/.github/workflows/pythonpackage.yml index d293bc9a8..bf712b2d8 100644 --- a/.github/workflows/pythonpackage.yml +++ b/.github/workflows/pythonpackage.yml @@ -28,8 +28,7 @@ jobs: - name: Install dependencies and prepare tests run: | set -x - python -m pip install pip==21.1.3 - python -m pip install --upgrade setuptools wheel + python -m pip install --upgrade pip setuptools wheel python --version; git --version git submodule update --init --recursive git fetch --tags From cf295145c510575d4b1ec4d1b086bcc013281dd0 Mon Sep 17 00:00:00 2001 From: Yobmod Date: Wed, 28 Jul 2021 22:49:31 +0100 Subject: [PATCH 15/15] try https://github.com/actions/virtual-environments/issues/709 workaround --- .github/workflows/pythonpackage.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/pythonpackage.yml b/.github/workflows/pythonpackage.yml index bf712b2d8..8cb8041d0 100644 --- a/.github/workflows/pythonpackage.yml +++ b/.github/workflows/pythonpackage.yml @@ -28,6 +28,9 @@ jobs: - name: Install dependencies and prepare tests run: | set -x + sudo rm -rf "/usr/local/share/boost" + sudo rm -rf "$AGENT_TOOLSDIRECTORY" + python -m pip install --upgrade pip setuptools wheel python --version; git --version git submodule update --init --recursive