Skip to content

more typing #1394

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 10 commits into from
Aug 4, 2025
1 change: 1 addition & 0 deletions mypy.ini
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@

[mypy-test.*]
disallow_untyped_defs = True
disallow_untyped_calls = True
293 changes: 291 additions & 2 deletions pygit2/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,297 @@
from ._build import __version__

# Low level API
from ._pygit2 import *
from ._pygit2 import _cache_enums
from ._pygit2 import (
GIT_APPLY_LOCATION_BOTH,
GIT_APPLY_LOCATION_INDEX,
GIT_APPLY_LOCATION_WORKDIR,
GIT_BLAME_FIRST_PARENT,
GIT_BLAME_IGNORE_WHITESPACE,
GIT_BLAME_NORMAL,
GIT_BLAME_TRACK_COPIES_ANY_COMMIT_COPIES,
GIT_BLAME_TRACK_COPIES_SAME_COMMIT_COPIES,
GIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES,
GIT_BLAME_TRACK_COPIES_SAME_FILE,
GIT_BLAME_USE_MAILMAP,
GIT_BLOB_FILTER_ATTRIBUTES_FROM_COMMIT,
GIT_BLOB_FILTER_ATTRIBUTES_FROM_HEAD,
GIT_BLOB_FILTER_CHECK_FOR_BINARY,
GIT_BLOB_FILTER_NO_SYSTEM_ATTRIBUTES,
GIT_BRANCH_ALL,
GIT_BRANCH_LOCAL,
GIT_BRANCH_REMOTE,
GIT_CHECKOUT_ALLOW_CONFLICTS,
GIT_CHECKOUT_CONFLICT_STYLE_DIFF3,
GIT_CHECKOUT_CONFLICT_STYLE_MERGE,
GIT_CHECKOUT_CONFLICT_STYLE_ZDIFF3,
GIT_CHECKOUT_DISABLE_PATHSPEC_MATCH,
GIT_CHECKOUT_DONT_OVERWRITE_IGNORED,
GIT_CHECKOUT_DONT_REMOVE_EXISTING,
GIT_CHECKOUT_DONT_UPDATE_INDEX,
GIT_CHECKOUT_DONT_WRITE_INDEX,
GIT_CHECKOUT_DRY_RUN,
GIT_CHECKOUT_FORCE,
GIT_CHECKOUT_NO_REFRESH,
GIT_CHECKOUT_NONE,
GIT_CHECKOUT_RECREATE_MISSING,
GIT_CHECKOUT_REMOVE_IGNORED,
GIT_CHECKOUT_REMOVE_UNTRACKED,
GIT_CHECKOUT_SAFE,
GIT_CHECKOUT_SKIP_LOCKED_DIRECTORIES,
GIT_CHECKOUT_SKIP_UNMERGED,
GIT_CHECKOUT_UPDATE_ONLY,
GIT_CHECKOUT_USE_OURS,
GIT_CHECKOUT_USE_THEIRS,
GIT_CONFIG_HIGHEST_LEVEL,
GIT_CONFIG_LEVEL_APP,
GIT_CONFIG_LEVEL_GLOBAL,
GIT_CONFIG_LEVEL_LOCAL,
GIT_CONFIG_LEVEL_PROGRAMDATA,
GIT_CONFIG_LEVEL_SYSTEM,
GIT_CONFIG_LEVEL_WORKTREE,
GIT_CONFIG_LEVEL_XDG,
GIT_DELTA_ADDED,
GIT_DELTA_CONFLICTED,
GIT_DELTA_COPIED,
GIT_DELTA_DELETED,
GIT_DELTA_IGNORED,
GIT_DELTA_MODIFIED,
GIT_DELTA_RENAMED,
GIT_DELTA_TYPECHANGE,
GIT_DELTA_UNMODIFIED,
GIT_DELTA_UNREADABLE,
GIT_DELTA_UNTRACKED,
GIT_DESCRIBE_ALL,
GIT_DESCRIBE_DEFAULT,
GIT_DESCRIBE_TAGS,
GIT_DIFF_BREAK_REWRITES,
GIT_DIFF_BREAK_REWRITES_FOR_RENAMES_ONLY,
GIT_DIFF_DISABLE_PATHSPEC_MATCH,
GIT_DIFF_ENABLE_FAST_UNTRACKED_DIRS,
GIT_DIFF_FIND_ALL,
GIT_DIFF_FIND_AND_BREAK_REWRITES,
GIT_DIFF_FIND_BY_CONFIG,
GIT_DIFF_FIND_COPIES,
GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED,
GIT_DIFF_FIND_DONT_IGNORE_WHITESPACE,
GIT_DIFF_FIND_EXACT_MATCH_ONLY,
GIT_DIFF_FIND_FOR_UNTRACKED,
GIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE,
GIT_DIFF_FIND_IGNORE_WHITESPACE,
GIT_DIFF_FIND_REMOVE_UNMODIFIED,
GIT_DIFF_FIND_RENAMES,
GIT_DIFF_FIND_RENAMES_FROM_REWRITES,
GIT_DIFF_FIND_REWRITES,
GIT_DIFF_FLAG_BINARY,
GIT_DIFF_FLAG_EXISTS,
GIT_DIFF_FLAG_NOT_BINARY,
GIT_DIFF_FLAG_VALID_ID,
GIT_DIFF_FLAG_VALID_SIZE,
GIT_DIFF_FORCE_BINARY,
GIT_DIFF_FORCE_TEXT,
GIT_DIFF_IGNORE_BLANK_LINES,
GIT_DIFF_IGNORE_CASE,
GIT_DIFF_IGNORE_FILEMODE,
GIT_DIFF_IGNORE_SUBMODULES,
GIT_DIFF_IGNORE_WHITESPACE,
GIT_DIFF_IGNORE_WHITESPACE_CHANGE,
GIT_DIFF_IGNORE_WHITESPACE_EOL,
GIT_DIFF_INCLUDE_CASECHANGE,
GIT_DIFF_INCLUDE_IGNORED,
GIT_DIFF_INCLUDE_TYPECHANGE,
GIT_DIFF_INCLUDE_TYPECHANGE_TREES,
GIT_DIFF_INCLUDE_UNMODIFIED,
GIT_DIFF_INCLUDE_UNREADABLE,
GIT_DIFF_INCLUDE_UNREADABLE_AS_UNTRACKED,
GIT_DIFF_INCLUDE_UNTRACKED,
GIT_DIFF_INDENT_HEURISTIC,
GIT_DIFF_MINIMAL,
GIT_DIFF_NORMAL,
GIT_DIFF_PATIENCE,
GIT_DIFF_RECURSE_IGNORED_DIRS,
GIT_DIFF_RECURSE_UNTRACKED_DIRS,
GIT_DIFF_REVERSE,
GIT_DIFF_SHOW_BINARY,
GIT_DIFF_SHOW_UNMODIFIED,
GIT_DIFF_SHOW_UNTRACKED_CONTENT,
GIT_DIFF_SKIP_BINARY_CHECK,
GIT_DIFF_STATS_FULL,
GIT_DIFF_STATS_INCLUDE_SUMMARY,
GIT_DIFF_STATS_NONE,
GIT_DIFF_STATS_NUMBER,
GIT_DIFF_STATS_SHORT,
GIT_DIFF_UPDATE_INDEX,
GIT_FILEMODE_BLOB,
GIT_FILEMODE_BLOB_EXECUTABLE,
GIT_FILEMODE_COMMIT,
GIT_FILEMODE_LINK,
GIT_FILEMODE_TREE,
GIT_FILEMODE_UNREADABLE,
GIT_FILTER_ALLOW_UNSAFE,
GIT_FILTER_ATTRIBUTES_FROM_COMMIT,
GIT_FILTER_ATTRIBUTES_FROM_HEAD,
GIT_FILTER_CLEAN,
GIT_FILTER_DEFAULT,
GIT_FILTER_DRIVER_PRIORITY,
GIT_FILTER_NO_SYSTEM_ATTRIBUTES,
GIT_FILTER_SMUDGE,
GIT_FILTER_TO_ODB,
GIT_FILTER_TO_WORKTREE,
GIT_MERGE_ANALYSIS_FASTFORWARD,
GIT_MERGE_ANALYSIS_NONE,
GIT_MERGE_ANALYSIS_NORMAL,
GIT_MERGE_ANALYSIS_UNBORN,
GIT_MERGE_ANALYSIS_UP_TO_DATE,
GIT_MERGE_PREFERENCE_FASTFORWARD_ONLY,
GIT_MERGE_PREFERENCE_NO_FASTFORWARD,
GIT_MERGE_PREFERENCE_NONE,
GIT_OBJECT_ANY,
GIT_OBJECT_BLOB,
GIT_OBJECT_COMMIT,
GIT_OBJECT_INVALID,
GIT_OBJECT_OFS_DELTA,
GIT_OBJECT_REF_DELTA,
GIT_OBJECT_TAG,
GIT_OBJECT_TREE,
GIT_OID_HEX_ZERO,
GIT_OID_HEXSZ,
GIT_OID_MINPREFIXLEN,
GIT_OID_RAWSZ,
GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS,
GIT_OPT_ENABLE_CACHING,
GIT_OPT_ENABLE_FSYNC_GITDIR,
GIT_OPT_ENABLE_OFS_DELTA,
GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION,
GIT_OPT_ENABLE_STRICT_OBJECT_CREATION,
GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION,
GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY,
GIT_OPT_GET_CACHED_MEMORY,
GIT_OPT_GET_MWINDOW_FILE_LIMIT,
GIT_OPT_GET_MWINDOW_MAPPED_LIMIT,
GIT_OPT_GET_MWINDOW_SIZE,
GIT_OPT_GET_OWNER_VALIDATION,
GIT_OPT_GET_PACK_MAX_OBJECTS,
GIT_OPT_GET_SEARCH_PATH,
GIT_OPT_GET_TEMPLATE_PATH,
GIT_OPT_GET_USER_AGENT,
GIT_OPT_GET_WINDOWS_SHAREMODE,
GIT_OPT_SET_ALLOCATOR,
GIT_OPT_SET_CACHE_MAX_SIZE,
GIT_OPT_SET_CACHE_OBJECT_LIMIT,
GIT_OPT_SET_MWINDOW_FILE_LIMIT,
GIT_OPT_SET_MWINDOW_MAPPED_LIMIT,
GIT_OPT_SET_MWINDOW_SIZE,
GIT_OPT_SET_OWNER_VALIDATION,
GIT_OPT_SET_PACK_MAX_OBJECTS,
GIT_OPT_SET_SEARCH_PATH,
GIT_OPT_SET_SSL_CERT_LOCATIONS,
GIT_OPT_SET_SSL_CIPHERS,
GIT_OPT_SET_TEMPLATE_PATH,
GIT_OPT_SET_USER_AGENT,
GIT_OPT_SET_WINDOWS_SHAREMODE,
GIT_REFERENCES_ALL,
GIT_REFERENCES_BRANCHES,
GIT_REFERENCES_TAGS,
GIT_RESET_HARD,
GIT_RESET_MIXED,
GIT_RESET_SOFT,
GIT_REVSPEC_MERGE_BASE,
GIT_REVSPEC_RANGE,
GIT_REVSPEC_SINGLE,
GIT_SORT_NONE,
GIT_SORT_REVERSE,
GIT_SORT_TIME,
GIT_SORT_TOPOLOGICAL,
GIT_STASH_APPLY_DEFAULT,
GIT_STASH_APPLY_REINSTATE_INDEX,
GIT_STASH_DEFAULT,
GIT_STASH_INCLUDE_IGNORED,
GIT_STASH_INCLUDE_UNTRACKED,
GIT_STASH_KEEP_ALL,
GIT_STASH_KEEP_INDEX,
GIT_STATUS_CONFLICTED,
GIT_STATUS_CURRENT,
GIT_STATUS_IGNORED,
GIT_STATUS_INDEX_DELETED,
GIT_STATUS_INDEX_MODIFIED,
GIT_STATUS_INDEX_NEW,
GIT_STATUS_INDEX_RENAMED,
GIT_STATUS_INDEX_TYPECHANGE,
GIT_STATUS_WT_DELETED,
GIT_STATUS_WT_MODIFIED,
GIT_STATUS_WT_NEW,
GIT_STATUS_WT_RENAMED,
GIT_STATUS_WT_TYPECHANGE,
GIT_STATUS_WT_UNREADABLE,
GIT_SUBMODULE_IGNORE_ALL,
GIT_SUBMODULE_IGNORE_DIRTY,
GIT_SUBMODULE_IGNORE_NONE,
GIT_SUBMODULE_IGNORE_UNSPECIFIED,
GIT_SUBMODULE_IGNORE_UNTRACKED,
GIT_SUBMODULE_STATUS_IN_CONFIG,
GIT_SUBMODULE_STATUS_IN_HEAD,
GIT_SUBMODULE_STATUS_IN_INDEX,
GIT_SUBMODULE_STATUS_IN_WD,
GIT_SUBMODULE_STATUS_INDEX_ADDED,
GIT_SUBMODULE_STATUS_INDEX_DELETED,
GIT_SUBMODULE_STATUS_INDEX_MODIFIED,
GIT_SUBMODULE_STATUS_WD_ADDED,
GIT_SUBMODULE_STATUS_WD_DELETED,
GIT_SUBMODULE_STATUS_WD_INDEX_MODIFIED,
GIT_SUBMODULE_STATUS_WD_MODIFIED,
GIT_SUBMODULE_STATUS_WD_UNINITIALIZED,
GIT_SUBMODULE_STATUS_WD_UNTRACKED,
GIT_SUBMODULE_STATUS_WD_WD_MODIFIED,
LIBGIT2_VER_MAJOR,
LIBGIT2_VER_MINOR,
LIBGIT2_VER_REVISION,
LIBGIT2_VERSION,
AlreadyExistsError,
Blob,
Branch,
Commit,
Diff,
DiffDelta,
DiffFile,
DiffHunk,
DiffLine,
DiffStats,
FilterSource,
GitError,
InvalidSpecError,
Mailmap,
Note,
Object,
Odb,
OdbBackend,
OdbBackendLoose,
OdbBackendPack,
Oid,
Patch,
Refdb,
RefdbBackend,
RefdbFsBackend,
Reference,
RefLogEntry,
RevSpec,
Signature,
Stash,
Tag,
Tree,
TreeBuilder,
Walker,
Worktree,
_cache_enums,
discover_repository,
filter_register,
filter_unregister,
hash,
hashfile,
init_file_backend,
option,
reference_is_valid_name,
tree_entry_cmp,
)
from .blame import Blame, BlameHunk
from .blob import BlobIO
from .callbacks import (
Expand Down
24 changes: 20 additions & 4 deletions pygit2/_libgit2/ffi.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@

from typing import Any, Generic, Literal, NewType, SupportsIndex, TypeVar, overload

from pygit2._pygit2 import Repository

T = TypeVar('T')

NULL_TYPE = NewType('NULL_TYPE', object)
Expand All @@ -38,6 +36,12 @@ char_pointer = NewType('char_pointer', object)
class size_t:
def __getitem__(self, item: Literal[0]) -> int: ...

class int_c:
def __getitem__(self, item: Literal[0]) -> int: ...

class int64_t:
def __getitem__(self, item: Literal[0]) -> int: ...

class _Pointer(Generic[T]):
def __setitem__(self, item: Literal[0], a: T) -> None: ...
@overload
Expand Down Expand Up @@ -76,7 +80,8 @@ class GitHunkC:
class GitRepositoryC:
# incomplete
# TODO: this has to be unified with pygit2._pygit2(pyi).Repository
def _from_c(cls, ptr: 'GitRepositoryC', owned: bool) -> 'Repository': ...
# def _from_c(cls, ptr: 'GitRepositoryC', owned: bool) -> 'Repository': ...
pass

class GitFetchOptionsC:
# TODO: FetchOptions exist in _pygit2.pyi
Expand Down Expand Up @@ -141,9 +146,14 @@ class GitConfigC:
# incomplete
pass

class GitConfigIteratorC:
# incomplete
pass

class GitConfigEntryC:
# incomplete
name: char_pointer
value: char_pointer
level: int

class GitDescribeFormatOptionsC:
Expand Down Expand Up @@ -269,6 +279,8 @@ def new(a: Literal['git_config *']) -> GitConfigC: ...
@overload
def new(a: Literal['git_config **']) -> _Pointer[GitConfigC]: ...
@overload
def new(a: Literal['git_config_iterator **']) -> _Pointer[GitConfigIteratorC]: ...
@overload
def new(a: Literal['git_config_entry **']) -> _Pointer[GitConfigEntryC]: ...
@overload
def new(a: Literal['git_describe_format_options *']) -> GitDescribeFormatOptionsC: ...
Expand Down Expand Up @@ -297,11 +309,15 @@ def new(a: Literal['git_signature *']) -> GitSignatureC: ...
@overload
def new(a: Literal['git_signature **']) -> _Pointer[GitSignatureC]: ...
@overload
def new(a: Literal['int *']) -> int_c: ...
@overload
def new(a: Literal['int64_t *']) -> int64_t: ...
@overload
def new(
a: Literal['git_remote_head ***'],
) -> _Pointer[_MultiPointer[GitRemoteHeadC]]: ...
@overload
def new(a: Literal['size_t *']) -> size_t: ...
def new(a: Literal['size_t *', 'size_t*']) -> size_t: ...
@overload
def new(a: Literal['git_stash_save_options *']) -> GitStashSaveOptionsC: ...
@overload
Expand Down
Loading
Loading