summaryrefslogtreecommitdiff
path: root/git/refs/symbolic.py
diff options
context:
space:
mode:
authorYobmod <yobmod@gmail.com>2021-07-28 17:19:10 +0100
committerYobmod <yobmod@gmail.com>2021-07-28 17:19:10 +0100
commitc464e33793d0839666233883212018dbbcdf1e09 (patch)
tree1dbc2b8ce6a46f55a2df5da8ec370e69aa9ee812 /git/refs/symbolic.py
parent679142481d94c779d46f1e347604ec9ab24b05f3 (diff)
downloadgitpython-c464e33793d0839666233883212018dbbcdf1e09.tar.gz
Fix some SymbolicReference types
Diffstat (limited to 'git/refs/symbolic.py')
-rw-r--r--git/refs/symbolic.py80
1 files changed, 39 insertions, 41 deletions
diff --git a/git/refs/symbolic.py b/git/refs/symbolic.py
index 9a5a4479..86dc04e1 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 @@ from gitdb.exc import (
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 @@ T_References = TypeVar('T_References', bound='SymbolicReference')
__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 '<git.%s "%s">' % (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 @@ class SymbolicReference(object):
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 @@ class SymbolicReference(object):
# 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 @@ class SymbolicReference(object):
# 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 @@ class SymbolicReference(object):
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 @@ class SymbolicReference(object):
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 @@ class SymbolicReference(object):
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 @@ class SymbolicReference(object):
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 @@ class SymbolicReference(object):
# 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 @@ class SymbolicReference(object):
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 @@ class SymbolicReference(object):
: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 @@ class SymbolicReference(object):
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 @@ class SymbolicReference(object):
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 @@ class SymbolicReference(object):
# 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