Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion git/cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -1358,7 +1358,7 @@ def execute(

# Allow the user to have the command executed in their working dir.
try:
cwd = self._working_dir or os.getcwd() # type: Union[None, str]
cwd = self._working_dir or os.getcwd() # type: Optional[PathLike]
if not os.access(str(cwd), os.X_OK):
cwd = None
except FileNotFoundError:
Expand Down
46 changes: 28 additions & 18 deletions git/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ def rmtree(path: PathLike) -> None:
couldn't be deleted are read-only. Windows will not remove them in that case.
"""

def handler(function: Callable, path: PathLike, _excinfo: Any) -> None:
def handler(function: Callable[[str], Any], path: str, _excinfo: Any) -> None:
"""Callback for :func:`shutil.rmtree`.

This works as either a ``onexc`` or ``onerror`` style callback.
Expand Down Expand Up @@ -401,7 +401,7 @@ def _cygexpath(drive: Optional[str], path: str, expand_vars: bool = True) -> str
return p_str.replace("\\", "/")


_cygpath_parsers: Tuple[Tuple[Pattern[str], Callable, bool], ...] = (
_cygpath_parsers: Tuple[Tuple[Pattern[str], Callable[..., str], bool], ...] = (
# See: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
# and: https://www.cygwin.com/cygwin-ug-net/using.html#unc-paths
(
Expand Down Expand Up @@ -508,7 +508,7 @@ def get_user_id() -> str:
return "%s@%s" % (getpass.getuser(), platform.node())


def finalize_process(proc: Union[subprocess.Popen, "Git.AutoInterrupt"], **kwargs: Any) -> None:
def finalize_process(proc: Union["subprocess.Popen[Any]", "Git.AutoInterrupt"], **kwargs: Any) -> None:
"""Wait for the process (clone, fetch, pull or push) and handle its errors
accordingly."""
# TODO: No close proc-streams??
Expand All @@ -520,19 +520,21 @@ def expand_path(p: None, expand_vars: bool = ...) -> None: ...


@overload
def expand_path(p: PathLike, expand_vars: bool = ...) -> str:
def expand_path(p: PathLike, expand_vars: bool = ...) -> Optional[PathLike]:
# TODO: Support for Python 3.5 has been dropped, so these overloads can be improved.
...


def expand_path(p: Union[None, PathLike], expand_vars: bool = True) -> Optional[PathLike]:
if isinstance(p, Path):
return p.resolve()
if p is None:
return None
try:
Comment thread
Byron marked this conversation as resolved.
p = osp.expanduser(p) # type: ignore[arg-type]
if isinstance(p, Path):
return p.resolve()
expanded_path = osp.expanduser(os.fspath(p))
if expand_vars:
p = osp.expandvars(p)
return osp.normpath(osp.abspath(p))
expanded_path = osp.expandvars(expanded_path)
return osp.normpath(osp.abspath(expanded_path))
except Exception:
return None

Expand Down Expand Up @@ -767,7 +769,7 @@ class CallableRemoteProgress(RemoteProgress):

__slots__ = ("_callable",)

def __init__(self, fn: Callable) -> None:
def __init__(self, fn: Callable[..., Any]) -> None:
self._callable = fn
super().__init__()

Expand Down Expand Up @@ -846,7 +848,7 @@ def _main_actor(
cls,
env_name: str,
env_email: str,
config_reader: Union[None, "GitConfigParser", "SectionConstraint"] = None,
config_reader: Union[None, "GitConfigParser", "SectionConstraint[GitConfigParser]"] = None,
) -> "Actor":
actor = Actor("", "")
user_id = None # We use this to avoid multiple calls to getpass.getuser().
Expand Down Expand Up @@ -882,7 +884,9 @@ def default_name() -> str:
return actor

@classmethod
def committer(cls, config_reader: Union[None, "GitConfigParser", "SectionConstraint"] = None) -> "Actor":
def committer(
cls, config_reader: Union[None, "GitConfigParser", "SectionConstraint[GitConfigParser]"] = None
) -> "Actor":
"""
:return:
:class:`Actor` instance corresponding to the configured committer. It
Expand All @@ -897,7 +901,9 @@ def committer(cls, config_reader: Union[None, "GitConfigParser", "SectionConstra
return cls._main_actor(cls.env_committer_name, cls.env_committer_email, config_reader)

@classmethod
def author(cls, config_reader: Union[None, "GitConfigParser", "SectionConstraint"] = None) -> "Actor":
def author(
cls, config_reader: Union[None, "GitConfigParser", "SectionConstraint[GitConfigParser]"] = None
) -> "Actor":
"""Same as :meth:`committer`, but defines the main author. It may be specified
in the environment, but defaults to the committer."""
return cls._main_actor(cls.env_author_name, cls.env_author_email, config_reader)
Expand Down Expand Up @@ -980,11 +986,11 @@ class IndexFileSHA1Writer:

__slots__ = ("f", "sha1")

def __init__(self, f: IO) -> None:
def __init__(self, f: IO[bytes]) -> None:
self.f = f
self.sha1 = make_sha(b"")

def write(self, data: AnyStr) -> int:
def write(self, data: bytes) -> int:
self.sha1.update(data)
return self.f.write(data)

Expand Down Expand Up @@ -1181,6 +1187,7 @@ def __new__(cls, id_attr: str, prefix: str = "") -> "IterableList[T_IterableObj]
return super().__new__(cls)

def __init__(self, id_attr: str, prefix: str = "") -> None:
super().__init__()
self._id_attr = id_attr
self._prefix = prefix

Expand Down Expand Up @@ -1210,7 +1217,9 @@ def __getattr__(self, attr: str) -> T_IterableObj:
# END for each item
return list.__getattribute__(self, attr)

def __getitem__(self, index: Union[SupportsIndex, int, slice, str]) -> T_IterableObj: # type: ignore[override]
def __getitem__( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride]
self, index: Union[SupportsIndex, int, slice, str]
) -> T_IterableObj:
if isinstance(index, int):
return list.__getitem__(self, index)
elif isinstance(index, slice):
Expand Down Expand Up @@ -1288,7 +1297,7 @@ def list_items(cls, repo: "Repo", *args: Any, **kwargs: Any) -> IterableList[T_I
:return:
list(Item,...) list of item instances
"""
out_list: IterableList = IterableList(cls._id_attribute_)
out_list: IterableList[T_IterableObj] = IterableList(cls._id_attribute_)
out_list.extend(cls.iter_items(repo, *args, **kwargs))
return out_list

Expand All @@ -1297,7 +1306,8 @@ class IterableClassWatcher(type):
"""Metaclass that issues :exc:`DeprecationWarning` when :class:`git.util.Iterable`
is subclassed."""

def __init__(cls, name: str, bases: Tuple, clsdict: Dict) -> None:
def __init__(cls, name: str, bases: Tuple[type, ...], clsdict: Dict[str, Any]) -> None:
super().__init__(name, bases, clsdict)
for base in bases:
if type(base) is IterableClassWatcher:
warnings.warn(
Expand Down
11 changes: 11 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,17 @@ exclude = ["^git/ext/gitdb"]
module = "gitdb.*"
ignore_missing_imports = true

[tool.basedpyright]
typeCheckingMode = "standard"
pythonVersion = "3.7"
extraPaths = [
"git/ext/gitdb",
"git/ext/gitdb/gitdb/ext/smmap",
]
Comment on lines +39 to +42
exclude = [
"git/ext/gitdb",
]

[tool.coverage.run]
source = ["git"]

Expand Down
Loading