Skip to content

more typing #1390

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Jul 29, 2025
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
40 changes: 30 additions & 10 deletions pygit2/_libgit2/ffi.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@ class _Pointer(Generic[T]):
@overload
def __getitem__(self, item: slice[None, None, None]) -> bytes: ...

class ArrayC(Generic[T]):
# incomplete!
# def _len(self, ?) -> ?: ...
pass

class GitTimeC:
# incomplete
time: int
Expand Down Expand Up @@ -132,13 +137,13 @@ class GitDescribeFormatOptionsC:
version: int
abbreviated_size: int
always_use_long_format: int
dirty_suffix: char_pointer
dirty_suffix: ArrayC[char]

class GitDescribeOptionsC:
version: int
max_candidates_tags: int
describe_strategy: int
pattern: char_pointer
pattern: ArrayC[char]
only_follow_first_parent: int
show_commit_oid_as_fallback: int

Expand All @@ -148,6 +153,11 @@ class GitDescribeResultC:
class GitIndexC:
pass

class GitIndexEntryC:
# incomplete?
mode: int
path: ArrayC[char]

class GitMergeFileResultC:
pass

Expand All @@ -158,11 +168,13 @@ class GitStashSaveOptionsC:
version: int
flags: int
stasher: GitSignatureC
message: char_pointer
message: ArrayC[char]
paths: GitStrrayC

class GitStrrayC:
pass
# incomplete?
strings: NULL_TYPE | ArrayC[char]
count: int

class GitTreeC:
pass
Expand All @@ -171,11 +183,11 @@ class GitRepositoryInitOptionsC:
version: int
flags: int
mode: int
workdir_path: char_pointer
description: char_pointer
template_path: char_pointer
initial_head: char_pointer
origin_url: char_pointer
workdir_path: ArrayC[char]
description: ArrayC[char]
template_path: ArrayC[char]
initial_head: ArrayC[char]
origin_url: ArrayC[char]

class GitCloneOptionsC:
pass
Expand Down Expand Up @@ -229,6 +241,10 @@ def new(a: Literal['git_attr_options *']) -> GitAttrOptionsC: ...
@overload
def new(a: Literal['git_buf *']) -> GitBufC: ...
@overload
def new(a: Literal['char *'], b: bytes) -> char_pointer: ...
@overload
def new(a: Literal['char *[]'], b: list[char_pointer]) -> ArrayC[char_pointer]: ...
@overload
def new(a: Literal['git_checkout_options *']) -> GitCheckoutOptionsC: ...
@overload
def new(a: Literal['git_commit **']) -> _Pointer[GitCommitC]: ...
Expand All @@ -251,6 +267,8 @@ def new(a: Literal['struct git_reference **']) -> _Pointer[GitReferenceC]: ...
@overload
def new(a: Literal['git_index **']) -> _Pointer[GitIndexC]: ...
@overload
def new(a: Literal['git_index_entry *']) -> GitIndexEntryC: ...
@overload
def new(a: Literal['git_merge_file_result *']) -> GitMergeFileResultC: ...
@overload
def new(a: Literal['git_object *']) -> GitObjectC: ...
Expand All @@ -263,13 +281,15 @@ def new(a: Literal['git_signature **']) -> _Pointer[GitSignatureC]: ...
@overload
def new(a: Literal['git_stash_save_options *']) -> GitStashSaveOptionsC: ...
@overload
def new(a: Literal['git_strarray *']) -> GitStrrayC: ...
@overload
def new(a: Literal['git_tree **']) -> _Pointer[GitTreeC]: ...
@overload
def new(a: Literal['git_buf *'], b: tuple[NULL_TYPE, Literal[0]]) -> GitBufC: ...
@overload
def new(a: Literal['char **']) -> _Pointer[char_pointer]: ...
@overload
def new(a: Literal['char[]', 'char []'], b: bytes | NULL_TYPE) -> char_pointer: ...
def new(a: Literal['char[]', 'char []'], b: bytes | NULL_TYPE) -> ArrayC[char]: ...
def addressof(a: object, attribute: str) -> _Pointer[object]: ...

class buffer(bytes):
Expand Down
66 changes: 60 additions & 6 deletions pygit2/_pygit2.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ from typing import (
from . import Index
from ._libgit2.ffi import (
GitCommitC,
GitMergeOptionsC,
GitObjectC,
GitProxyOptionsC,
GitRepositoryC,
Expand All @@ -36,12 +37,16 @@ from .enums import (
BranchType,
CheckoutStrategy,
DeltaStatus,
DescribeStrategy,
DiffFind,
DiffFlag,
DiffOption,
DiffStatsFormat,
FileMode,
MergeAnalysis,
MergeFavor,
MergeFileFlag,
MergeFlag,
MergePreference,
ObjectType,
Option,
Expand All @@ -51,6 +56,7 @@ from .enums import (
ResetMode,
SortMode,
)
from .filter import Filter
from .remotes import Remote
from .repository import BaseRepository
from .submodules import SubmoduleCollection
Expand Down Expand Up @@ -457,6 +463,7 @@ class Diff:
patch: str | None
patchid: Oid
stats: DiffStats
text: str
def find_similar(
self,
flags: DiffFind = DiffFind.FIND_BY_CONFIG,
Expand Down Expand Up @@ -520,6 +527,7 @@ class DiffStats:

class FilterSource:
# probably incomplete
repo: object
pass

class GitError(Exception): ...
Expand All @@ -529,9 +537,9 @@ class Mailmap:
def __init__(self, *args) -> None: ...
def add_entry(
self,
real_name: str = ...,
real_email: str = ...,
replace_name: str = ...,
real_name: str | None = ...,
real_email: str | None = ...,
replace_name: str | None = ...,
replace_email: str = ...,
) -> None: ...
@staticmethod
Expand Down Expand Up @@ -719,6 +727,7 @@ class Branches:

class Repository:
_pointer: GitRepositoryC
_repo: GitRepositoryC
default_signature: Signature
head: Reference
head_is_detached: bool
Expand Down Expand Up @@ -784,7 +793,7 @@ class Repository:
def compress_references(self) -> None: ...
@property
def config(self) -> Config: ...
def create_blob(self, data: bytes) -> Oid: ...
def create_blob(self, data: str | bytes) -> Oid: ...
def create_blob_fromdisk(self, path: str) -> Oid: ...
def create_blob_fromiobase(self, iobase: IOBase) -> Oid: ...
def create_blob_fromworkdir(self, path: str | Path) -> Oid: ...
Expand Down Expand Up @@ -834,14 +843,26 @@ class Repository:
) -> Oid: ...
def diff(
self,
a: None | str | Reference = None,
b: None | str | Reference = None,
a: None | str | bytes | Oid | Reference = None,
b: None | str | bytes | Oid | Reference = None,
cached: bool = False,
flags: DiffOption = DiffOption.NORMAL,
context_lines: int = 3,
interhunk_lines: int = 0,
) -> Diff: ...
def descendant_of(self, oid1: _OidArg, oid2: _OidArg) -> bool: ...
def describe(
self,
committish: str | Reference | Commit | None = None,
max_candidates_tags: int | None = None,
describe_strategy: DescribeStrategy = DescribeStrategy.DEFAULT,
pattern: str | None = None,
only_follow_first_parent: bool | None = None,
show_commit_oid_as_fallback: bool | None = None,
abbreviated_size: object | None = None,
always_use_long_format: bool | None = None,
dirty_suffix: str | None = None,
) -> str: ...
def expand_id(self, hex: str) -> Oid: ...
def free(self) -> None: ...
def get(self, key: _OidArg, default: Optional[Commit] = None) -> None | Object: ...
Expand All @@ -867,12 +888,40 @@ class Repository:
def lookup_reference(self, name: str) -> Reference: ...
def lookup_reference_dwim(self, name: str) -> Reference: ...
def lookup_worktree(self, name: str) -> Worktree: ...
def merge(
self,
source: Reference | Commit | Oid | str,
favor: MergeFavor = MergeFavor.NORMAL,
flags: MergeFlag = MergeFlag.FIND_RENAMES,
file_flags: MergeFileFlag = MergeFileFlag.DEFAULT,
) -> None: ...
def merge_analysis(
self, their_head: _OidArg, our_ref: str = 'HEAD'
) -> tuple[MergeAnalysis, MergePreference]: ...
def merge_base(self, oid1: _OidArg, oid2: _OidArg) -> Oid: ...
def merge_base_many(self, oids: list[_OidArg]) -> Oid: ...
def merge_base_octopus(self, oids: list[_OidArg]) -> Oid: ...
def merge_commits(
self,
ours: str | Oid | Commit,
theirs: str | Oid | Commit,
favor: MergeFavor = MergeFavor.NORMAL,
flags: MergeFlag = MergeFlag.FIND_RENAMES,
file_flags: MergeFileFlag = MergeFileFlag.DEFAULT,
) -> Index: ...
@staticmethod
def _merge_options(
favor: int | MergeFavor, flags: int | MergeFlag, file_flags: int | MergeFileFlag
) -> GitMergeOptionsC: ...
def merge_trees(
self,
ancestor: str | Oid | Tree,
ours: str | Oid | Tree,
theirs: str | Oid | Tree,
favor: MergeFavor = MergeFavor.NORMAL,
flags: MergeFlag = MergeFlag.FIND_RENAMES,
file_flags: MergeFileFlag = MergeFileFlag.DEFAULT,
) -> Index: ...
@property
def message(self) -> str: ...
def notes(self) -> Iterator[Note]: ...
Expand All @@ -881,6 +930,9 @@ class Repository:
self, flag: BranchType = BranchType.LOCAL
) -> list[bytes]: ...
def raw_listall_references(self) -> list[bytes]: ...
@property
def raw_message(self) -> bytes: ...
def remove_message(self) -> None: ...
def references_iterator_init(self) -> Iterator[Reference]: ...
def references_iterator_next(
self,
Expand Down Expand Up @@ -1022,5 +1074,7 @@ def option(opt: Option, *args) -> None: ...
def reference_is_valid_name(refname: str) -> bool: ...
def tree_entry_cmp(a: Object, b: Object) -> int: ...
def _cache_enums() -> None: ...
def filter_register(name: str, filter: type[Filter]) -> None: ...
def filter_unregister(name: str) -> None: ...

_OidArg = str | Oid
6 changes: 3 additions & 3 deletions pygit2/filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ class Filter:
def nattrs(cls) -> int:
return len(cls.attributes.split())

def check(self, src: FilterSource, attr_values: List[Optional[str]]):
def check(self, src: FilterSource, attr_values: List[Optional[str]]) -> None:
"""
Check whether this filter should be applied to the given source.

Expand All @@ -77,7 +77,7 @@ def check(self, src: FilterSource, attr_values: List[Optional[str]]):

def write(
self, data: bytes, src: FilterSource, write_next: Callable[[bytes], None]
):
) -> None:
"""
Write input `data` to this filter.

Expand All @@ -95,7 +95,7 @@ def write(
"""
write_next(data)

def close(self, write_next: Callable[[bytes], None]):
def close(self, write_next: Callable[[bytes], None]) -> None:
"""
Close this filter.

Expand Down
Loading
Loading