Skip to content

Implement (almost) all global options #1409

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 9 commits into from
Aug 13, 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
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
/.envrc
/.tox/
/build/
/ci/
/dist/
/docs/_build/
/MANIFEST
Expand All @@ -13,3 +14,5 @@ __pycache__/
*.pyc
*.so
*.swp
/pygit2/_libgit2.c
/pygit2/_libgit2.o
2 changes: 1 addition & 1 deletion build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ if [ -n "$LIBGIT2_VERSION" ]; then
wget https://github.com/libgit2/libgit2/archive/refs/tags/v$LIBGIT2_VERSION.tar.gz -N -O $FILENAME.tar.gz
tar xf $FILENAME.tar.gz
cd $FILENAME
mkdir build -p
mkdir -p build
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Otherwise this fails on macOS where mkdir doesn't use the GNU version.

cd build
if [ "$KERNEL" = "Darwin" ] && [ "$CIBUILDWHEEL" = "1" ]; then
CMAKE_PREFIX_PATH=$OPENSSL_PREFIX:$PREFIX cmake .. \
Expand Down
96 changes: 63 additions & 33 deletions pygit2/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -191,38 +191,6 @@
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,
Expand Down Expand Up @@ -322,7 +290,6 @@
hash,
hashfile,
init_file_backend,
option,
reference_is_valid_name,
tree_entry_cmp,
)
Expand All @@ -345,6 +312,55 @@
from .filter import Filter
from .index import Index, IndexEntry
from .legacyenums import *
from .options import (
GIT_OPT_ADD_SSL_X509_CERT,
GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS,
GIT_OPT_ENABLE_CACHING,
GIT_OPT_ENABLE_FSYNC_GITDIR,
GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE,
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_EXTENSIONS,
GIT_OPT_GET_HOMEDIR,
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_SERVER_CONNECT_TIMEOUT,
GIT_OPT_GET_SERVER_TIMEOUT,
GIT_OPT_GET_TEMPLATE_PATH,
GIT_OPT_GET_USER_AGENT,
GIT_OPT_GET_USER_AGENT_PRODUCT,
GIT_OPT_GET_WINDOWS_SHAREMODE,
GIT_OPT_SET_ALLOCATOR,
GIT_OPT_SET_CACHE_MAX_SIZE,
GIT_OPT_SET_CACHE_OBJECT_LIMIT,
GIT_OPT_SET_EXTENSIONS,
GIT_OPT_SET_HOMEDIR,
GIT_OPT_SET_MWINDOW_FILE_LIMIT,
GIT_OPT_SET_MWINDOW_MAPPED_LIMIT,
GIT_OPT_SET_MWINDOW_SIZE,
GIT_OPT_SET_ODB_LOOSE_PRIORITY,
GIT_OPT_SET_ODB_PACKED_PRIORITY,
GIT_OPT_SET_OWNER_VALIDATION,
GIT_OPT_SET_PACK_MAX_OBJECTS,
GIT_OPT_SET_SEARCH_PATH,
GIT_OPT_SET_SERVER_CONNECT_TIMEOUT,
GIT_OPT_SET_SERVER_TIMEOUT,
GIT_OPT_SET_SSL_CERT_LOCATIONS,
GIT_OPT_SET_SSL_CIPHERS,
GIT_OPT_SET_TEMPLATE_PATH,
GIT_OPT_SET_USER_AGENT,
GIT_OPT_SET_USER_AGENT_PRODUCT,
GIT_OPT_SET_WINDOWS_SHAREMODE,
option,
)
from .packbuilder import PackBuilder
from .remotes import Remote
from .repository import Repository
Expand Down Expand Up @@ -745,37 +761,51 @@ def clone_repository(
'GIT_OBJECT_REF_DELTA',
'GIT_OBJECT_TAG',
'GIT_OBJECT_TREE',
'GIT_OPT_ADD_SSL_X509_CERT',
'GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS',
'GIT_OPT_ENABLE_CACHING',
'GIT_OPT_ENABLE_FSYNC_GITDIR',
'GIT_OPT_ENABLE_HTTP_EXPECT_CONTINUE',
'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_EXTENSIONS',
'GIT_OPT_GET_HOMEDIR',
'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_SERVER_CONNECT_TIMEOUT',
'GIT_OPT_GET_SERVER_TIMEOUT',
'GIT_OPT_GET_TEMPLATE_PATH',
'GIT_OPT_GET_USER_AGENT',
'GIT_OPT_GET_USER_AGENT_PRODUCT',
'GIT_OPT_GET_WINDOWS_SHAREMODE',
'GIT_OPT_SET_ALLOCATOR',
'GIT_OPT_SET_CACHE_MAX_SIZE',
'GIT_OPT_SET_CACHE_OBJECT_LIMIT',
'GIT_OPT_SET_EXTENSIONS',
'GIT_OPT_SET_HOMEDIR',
'GIT_OPT_SET_MWINDOW_FILE_LIMIT',
'GIT_OPT_SET_MWINDOW_MAPPED_LIMIT',
'GIT_OPT_SET_MWINDOW_SIZE',
'GIT_OPT_SET_ODB_LOOSE_PRIORITY',
'GIT_OPT_SET_ODB_PACKED_PRIORITY',
'GIT_OPT_SET_OWNER_VALIDATION',
'GIT_OPT_SET_PACK_MAX_OBJECTS',
'GIT_OPT_SET_SEARCH_PATH',
'GIT_OPT_SET_SERVER_CONNECT_TIMEOUT',
'GIT_OPT_SET_SERVER_TIMEOUT',
'GIT_OPT_SET_SSL_CERT_LOCATIONS',
'GIT_OPT_SET_SSL_CIPHERS',
'GIT_OPT_SET_TEMPLATE_PATH',
'GIT_OPT_SET_USER_AGENT',
'GIT_OPT_SET_USER_AGENT_PRODUCT',
'GIT_OPT_SET_WINDOWS_SHAREMODE',
'GIT_REFERENCES_ALL',
'GIT_REFERENCES_BRANCHES',
Expand Down
27 changes: 25 additions & 2 deletions pygit2/_libgit2/ffi.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ class int_c:
class int64_t:
def __getitem__(self, item: Literal[0]) -> int: ...

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

class _Pointer(Generic[T]):
def __setitem__(self, item: Literal[0], a: T) -> None: ...
@overload
Expand All @@ -55,7 +58,8 @@ class _MultiPointer(Generic[T]):
class ArrayC(Generic[T]):
# incomplete!
# def _len(self, ?) -> ?: ...
pass
def __getitem__(self, index: int) -> T: ...
def __setitem__(self, index: int, value: T) -> None: ...

class GitTimeC:
# incomplete
Expand Down Expand Up @@ -196,7 +200,7 @@ class GitStashSaveOptionsC:

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

class GitTreeC:
Expand Down Expand Up @@ -319,6 +323,8 @@ def new(
@overload
def new(a: Literal['size_t *', 'size_t*']) -> size_t: ...
@overload
def new(a: Literal['ssize_t *', 'ssize_t*']) -> ssize_t: ...
@overload
def new(a: Literal['git_stash_save_options *']) -> GitStashSaveOptionsC: ...
@overload
def new(a: Literal['git_strarray *']) -> GitStrrayC: ...
Expand All @@ -330,6 +336,14 @@ def new(a: Literal['git_buf *'], b: tuple[NULL_TYPE, Literal[0]]) -> GitBufC: ..
def new(a: Literal['char **']) -> _Pointer[char_pointer]: ...
@overload
def new(a: Literal['char[]', 'char []'], b: bytes | NULL_TYPE) -> ArrayC[char]: ...
@overload
def new(
a: Literal['char *[]'], b: int
) -> ArrayC[char_pointer]: ... # For ext_array in SET_EXTENSIONS
@overload
def new(
a: Literal['char *[]'], b: list[Any]
) -> ArrayC[char_pointer]: ... # For string arrays
def addressof(a: object, attribute: str) -> _Pointer[object]: ...

class buffer(bytes):
Expand All @@ -340,4 +354,13 @@ class buffer(bytes):
@overload
def __getitem__(self, item: slice[Any, Any, Any]) -> bytes: ...

@overload
def cast(a: Literal['int'], b: object) -> int: ...
@overload
def cast(a: Literal['unsigned int'], b: object) -> int: ...
@overload
def cast(a: Literal['size_t'], b: object) -> int: ...
@overload
def cast(a: Literal['ssize_t'], b: object) -> int: ...
@overload
def cast(a: Literal['char *'], b: object) -> char_pointer: ...
107 changes: 0 additions & 107 deletions pygit2/_pygit2.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ from .enums import (
ApplyLocation,
BlobFilter,
BranchType,
ConfigLevel,
DeltaStatus,
DiffFind,
DiffFlag,
Expand All @@ -35,7 +34,6 @@ from .enums import (
MergeAnalysis,
MergePreference,
ObjectType,
Option,
ReferenceFilter,
ReferenceType,
ResetMode,
Expand All @@ -52,38 +50,6 @@ LIBGIT2_VER_MAJOR: int
LIBGIT2_VER_MINOR: int
LIBGIT2_VER_REVISION: int
LIBGIT2_VERSION: str
GIT_OPT_GET_MWINDOW_SIZE: int
GIT_OPT_SET_MWINDOW_SIZE: int
GIT_OPT_GET_MWINDOW_MAPPED_LIMIT: int
GIT_OPT_SET_MWINDOW_MAPPED_LIMIT: int
GIT_OPT_GET_SEARCH_PATH: int
GIT_OPT_SET_SEARCH_PATH: int
GIT_OPT_SET_CACHE_OBJECT_LIMIT: int
GIT_OPT_SET_CACHE_MAX_SIZE: int
GIT_OPT_ENABLE_CACHING: int
GIT_OPT_GET_CACHED_MEMORY: int
GIT_OPT_GET_TEMPLATE_PATH: int
GIT_OPT_SET_TEMPLATE_PATH: int
GIT_OPT_SET_SSL_CERT_LOCATIONS: int
GIT_OPT_SET_USER_AGENT: int
GIT_OPT_ENABLE_STRICT_OBJECT_CREATION: int
GIT_OPT_ENABLE_STRICT_SYMBOLIC_REF_CREATION: int
GIT_OPT_SET_SSL_CIPHERS: int
GIT_OPT_GET_USER_AGENT: int
GIT_OPT_ENABLE_OFS_DELTA: int
GIT_OPT_ENABLE_FSYNC_GITDIR: int
GIT_OPT_GET_WINDOWS_SHAREMODE: int
GIT_OPT_SET_WINDOWS_SHAREMODE: int
GIT_OPT_ENABLE_STRICT_HASH_VERIFICATION: int
GIT_OPT_SET_ALLOCATOR: int
GIT_OPT_ENABLE_UNSAVED_INDEX_SAFETY: int
GIT_OPT_GET_PACK_MAX_OBJECTS: int
GIT_OPT_SET_PACK_MAX_OBJECTS: int
GIT_OPT_DISABLE_PACK_KEEP_FILE_CHECKS: int
GIT_OPT_GET_OWNER_VALIDATION: int
GIT_OPT_SET_OWNER_VALIDATION: int
GIT_OPT_GET_MWINDOW_FILE_LIMIT: int
GIT_OPT_SET_MWINDOW_FILE_LIMIT: int
GIT_OID_RAWSZ: int
GIT_OID_HEXSZ: int
GIT_OID_HEX_ZERO: str
Expand Down Expand Up @@ -887,79 +853,6 @@ def discover_repository(
def hash(data: bytes | str) -> Oid: ...
def hashfile(path: str) -> Oid: ...
def init_file_backend(path: str, flags: int = 0) -> object: ...
@overload
def option(
opt: Literal[
Option.GET_MWINDOW_FILE_LIMIT,
Option.GET_MWINDOW_MAPPED_LIMIT,
Option.GET_MWINDOW_SIZE,
],
) -> int: ...
@overload
def option(
opt: Literal[
Option.SET_MWINDOW_FILE_LIMIT,
Option.SET_MWINDOW_MAPPED_LIMIT,
Option.SET_MWINDOW_SIZE,
],
value: int,
) -> None: ...
@overload
def option(opt: Literal[Option.GET_SEARCH_PATH], level: ConfigLevel) -> str: ...
@overload
def option(
opt: Literal[Option.SET_SEARCH_PATH], level: ConfigLevel, value: str
) -> None: ...
@overload
def option(
opt: Literal[Option.SET_CACHE_OBJECT_LIMIT], object_type: ObjectType, limit: int
) -> None: ...
@overload
def option(opt: Literal[Option.SET_CACHE_MAX_SIZE], max_size: int) -> None: ...
@overload
def option(opt: Literal[Option.GET_CACHED_MEMORY]) -> tuple[int, int]: ...

# not implemented:
# Option.GET_TEMPLATE_PATH
# Option.SET_TEMPLATE_PATH

@overload
def option(
opt: Literal[Option.SET_SSL_CERT_LOCATIONS],
file: str | bytes | None,
dir: str | bytes | None,
) -> None: ...

# not implemented:
# Option.SET_USER_AGENT

@overload
def option(
opt: Literal[
Option.ENABLE_CACHING,
Option.ENABLE_STRICT_OBJECT_CREATION,
Option.ENABLE_STRICT_SYMBOLIC_REF_CREATION,
Option.ENABLE_OFS_DELTA,
Option.ENABLE_FSYNC_GITDIR,
Option.ENABLE_STRICT_HASH_VERIFICATION,
Option.ENABLE_UNSAVED_INDEX_SAFETY,
Option.DISABLE_PACK_KEEP_FILE_CHECKS,
Option.SET_OWNER_VALIDATION,
],
value: bool | Literal[0, 1],
) -> None: ...
@overload
def option(opt: Literal[Option.GET_OWNER_VALIDATION]) -> int: ...

# not implemented:
# Option.SET_SSL_CIPHERS
# Option.GET_USER_AGENT
# Option.GET_WINDOWS_SHAREMODE
# Option.SET_WINDOWS_SHAREMODE
# Option.SET_ALLOCATOR
# Option.GET_PACK_MAX_OBJECTS
# Option.SET_PACK_MAX_OBJECTS

def reference_is_valid_name(refname: str) -> bool: ...
def tree_entry_cmp(a: Object, b: Object) -> int: ...
def _cache_enums() -> None: ...
Expand Down
1 change: 1 addition & 0 deletions pygit2/_run.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
'revert.h',
'stash.h',
'submodule.h',
'options.h',
'callbacks.h', # Bridge from libgit2 to Python
]
h_source = []
Expand Down
Loading
Loading