pygit2 1.20.1__tar.gz → 1.21.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. {pygit2-1.20.1 → pygit2-1.21.0}/AGENTS.md +4 -6
  2. {pygit2-1.20.1 → pygit2-1.21.0}/AUTHORS.md +5 -4
  3. {pygit2-1.20.1 → pygit2-1.21.0}/CHANGELOG.md +33 -0
  4. {pygit2-1.20.1 → pygit2-1.21.0}/Makefile +1 -1
  5. {pygit2-1.20.1 → pygit2-1.21.0}/PKG-INFO +3 -2
  6. {pygit2-1.20.1 → pygit2-1.21.0}/README.md +1 -1
  7. {pygit2-1.20.1 → pygit2-1.21.0}/build.sh +6 -2
  8. pygit2-1.21.0/mypy-stubtest.ini +28 -0
  9. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/__init__.py +7 -1
  10. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/_build.py +9 -1
  11. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/_run.py +3 -5
  12. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/branches.py +6 -4
  13. pygit2-1.21.0/pygit2/config.py +1023 -0
  14. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/config.h +1 -0
  15. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/errors.h +41 -2
  16. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/enums.py +4 -0
  17. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/errors.py +13 -3
  18. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/references.py +5 -1
  19. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/repository.py +16 -19
  20. {pygit2-1.20.1 → pygit2-1.21.0}/pyproject.toml +7 -3
  21. {pygit2-1.20.1 → pygit2-1.21.0}/setup.py +6 -5
  22. {pygit2-1.20.1 → pygit2-1.21.0}/src/odb_backend.c +129 -74
  23. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_branch.py +21 -0
  24. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_branch_empty.py +1 -0
  25. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_config.py +168 -13
  26. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_odb_backend.py +79 -0
  27. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_packbuilder.py +1 -0
  28. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_refs.py +20 -0
  29. {pygit2-1.20.1 → pygit2-1.21.0}/test/utils.py +1 -1
  30. pygit2-1.20.1/mypy-stubtest.ini +0 -16
  31. pygit2-1.20.1/pygit2/config.py +0 -428
  32. pygit2-1.20.1/setup.cfg +0 -3
  33. {pygit2-1.20.1 → pygit2-1.21.0}/CONTRIBUTING.md +0 -0
  34. {pygit2-1.20.1 → pygit2-1.21.0}/COPYING +0 -0
  35. {pygit2-1.20.1 → pygit2-1.21.0}/SPONSORS.md +0 -0
  36. {pygit2-1.20.1 → pygit2-1.21.0}/build.ps1 +0 -0
  37. {pygit2-1.20.1 → pygit2-1.21.0}/build_tag.py +0 -0
  38. {pygit2-1.20.1 → pygit2-1.21.0}/mypy.ini +0 -0
  39. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/_libgit2/ffi.pyi +0 -0
  40. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/_pygit2.pyi +0 -0
  41. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/blame.py +0 -0
  42. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/blob.py +0 -0
  43. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/callbacks.py +0 -0
  44. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/credentials.py +0 -0
  45. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/attr.h +0 -0
  46. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/blame.h +0 -0
  47. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/buffer.h +0 -0
  48. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/callbacks.h +0 -0
  49. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/checkout.h +0 -0
  50. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/clone.h +0 -0
  51. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/commit.h +0 -0
  52. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/common.h +0 -0
  53. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/describe.h +0 -0
  54. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/diff.h +0 -0
  55. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/filter.h +0 -0
  56. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/graph.h +0 -0
  57. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/index.h +0 -0
  58. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/indexer.h +0 -0
  59. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/merge.h +0 -0
  60. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/net.h +0 -0
  61. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/oid.h +0 -0
  62. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/options.h +0 -0
  63. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/pack.h +0 -0
  64. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/proxy.h +0 -0
  65. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/rebase.h +0 -0
  66. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/refspec.h +0 -0
  67. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/remote.h +0 -0
  68. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/repository.h +0 -0
  69. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/revert.h +0 -0
  70. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/stash.h +0 -0
  71. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/strarray.h +0 -0
  72. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/submodule.h +0 -0
  73. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/transaction.h +0 -0
  74. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/transport.h +0 -0
  75. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/decl/types.h +0 -0
  76. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/ffi.py +0 -0
  77. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/filter.py +0 -0
  78. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/index.py +0 -0
  79. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/options.py +0 -0
  80. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/packbuilder.py +0 -0
  81. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/py.typed +0 -0
  82. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/rebase.py +0 -0
  83. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/refspec.py +0 -0
  84. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/remotes.py +0 -0
  85. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/settings.py +0 -0
  86. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/submodules.py +0 -0
  87. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/transaction.py +0 -0
  88. {pygit2-1.20.1 → pygit2-1.21.0}/pygit2/utils.py +0 -0
  89. {pygit2-1.20.1 → pygit2-1.21.0}/pytest.ini +0 -0
  90. {pygit2-1.20.1 → pygit2-1.21.0}/requirements-test.txt +0 -0
  91. {pygit2-1.20.1 → pygit2-1.21.0}/requirements-typing.txt +0 -0
  92. {pygit2-1.20.1 → pygit2-1.21.0}/requirements-wheel.txt +0 -0
  93. {pygit2-1.20.1 → pygit2-1.21.0}/requirements.txt +0 -0
  94. {pygit2-1.20.1 → pygit2-1.21.0}/src/blob.c +0 -0
  95. {pygit2-1.20.1 → pygit2-1.21.0}/src/branch.c +0 -0
  96. {pygit2-1.20.1 → pygit2-1.21.0}/src/branch.h +0 -0
  97. {pygit2-1.20.1 → pygit2-1.21.0}/src/commit.c +0 -0
  98. {pygit2-1.20.1 → pygit2-1.21.0}/src/diff.c +0 -0
  99. {pygit2-1.20.1 → pygit2-1.21.0}/src/diff.h +0 -0
  100. {pygit2-1.20.1 → pygit2-1.21.0}/src/error.c +0 -0
  101. {pygit2-1.20.1 → pygit2-1.21.0}/src/error.h +0 -0
  102. {pygit2-1.20.1 → pygit2-1.21.0}/src/filter.c +0 -0
  103. {pygit2-1.20.1 → pygit2-1.21.0}/src/filter.h +0 -0
  104. {pygit2-1.20.1 → pygit2-1.21.0}/src/mailmap.c +0 -0
  105. {pygit2-1.20.1 → pygit2-1.21.0}/src/mailmap.h +0 -0
  106. {pygit2-1.20.1 → pygit2-1.21.0}/src/note.c +0 -0
  107. {pygit2-1.20.1 → pygit2-1.21.0}/src/note.h +0 -0
  108. {pygit2-1.20.1 → pygit2-1.21.0}/src/object.c +0 -0
  109. {pygit2-1.20.1 → pygit2-1.21.0}/src/object.h +0 -0
  110. {pygit2-1.20.1 → pygit2-1.21.0}/src/odb.c +0 -0
  111. {pygit2-1.20.1 → pygit2-1.21.0}/src/odb.h +0 -0
  112. {pygit2-1.20.1 → pygit2-1.21.0}/src/odb_backend.h +0 -0
  113. {pygit2-1.20.1 → pygit2-1.21.0}/src/oid.c +0 -0
  114. {pygit2-1.20.1 → pygit2-1.21.0}/src/oid.h +0 -0
  115. {pygit2-1.20.1 → pygit2-1.21.0}/src/patch.c +0 -0
  116. {pygit2-1.20.1 → pygit2-1.21.0}/src/patch.h +0 -0
  117. {pygit2-1.20.1 → pygit2-1.21.0}/src/pygit2.c +0 -0
  118. {pygit2-1.20.1 → pygit2-1.21.0}/src/refdb.c +0 -0
  119. {pygit2-1.20.1 → pygit2-1.21.0}/src/refdb.h +0 -0
  120. {pygit2-1.20.1 → pygit2-1.21.0}/src/refdb_backend.c +0 -0
  121. {pygit2-1.20.1 → pygit2-1.21.0}/src/refdb_backend.h +0 -0
  122. {pygit2-1.20.1 → pygit2-1.21.0}/src/reference.c +0 -0
  123. {pygit2-1.20.1 → pygit2-1.21.0}/src/reference.h +0 -0
  124. {pygit2-1.20.1 → pygit2-1.21.0}/src/repository.c +0 -0
  125. {pygit2-1.20.1 → pygit2-1.21.0}/src/repository.h +0 -0
  126. {pygit2-1.20.1 → pygit2-1.21.0}/src/revspec.c +0 -0
  127. {pygit2-1.20.1 → pygit2-1.21.0}/src/revspec.h +0 -0
  128. {pygit2-1.20.1 → pygit2-1.21.0}/src/signature.c +0 -0
  129. {pygit2-1.20.1 → pygit2-1.21.0}/src/signature.h +0 -0
  130. {pygit2-1.20.1 → pygit2-1.21.0}/src/stash.c +0 -0
  131. {pygit2-1.20.1 → pygit2-1.21.0}/src/tag.c +0 -0
  132. {pygit2-1.20.1 → pygit2-1.21.0}/src/tree.c +0 -0
  133. {pygit2-1.20.1 → pygit2-1.21.0}/src/tree.h +0 -0
  134. {pygit2-1.20.1 → pygit2-1.21.0}/src/treebuilder.c +0 -0
  135. {pygit2-1.20.1 → pygit2-1.21.0}/src/treebuilder.h +0 -0
  136. {pygit2-1.20.1 → pygit2-1.21.0}/src/types.h +0 -0
  137. {pygit2-1.20.1 → pygit2-1.21.0}/src/utils.c +0 -0
  138. {pygit2-1.20.1 → pygit2-1.21.0}/src/utils.h +0 -0
  139. {pygit2-1.20.1 → pygit2-1.21.0}/src/walker.c +0 -0
  140. {pygit2-1.20.1 → pygit2-1.21.0}/src/walker.h +0 -0
  141. {pygit2-1.20.1 → pygit2-1.21.0}/src/wildmatch.c +0 -0
  142. {pygit2-1.20.1 → pygit2-1.21.0}/src/wildmatch.h +0 -0
  143. {pygit2-1.20.1 → pygit2-1.21.0}/src/worktree.c +0 -0
  144. {pygit2-1.20.1 → pygit2-1.21.0}/src/worktree.h +0 -0
  145. {pygit2-1.20.1 → pygit2-1.21.0}/test/__init__.py +0 -0
  146. {pygit2-1.20.1 → pygit2-1.21.0}/test/conftest.py +0 -0
  147. {pygit2-1.20.1 → pygit2-1.21.0}/test/data/barerepo.zip +0 -0
  148. {pygit2-1.20.1 → pygit2-1.21.0}/test/data/bigrepo.zip +0 -0
  149. {pygit2-1.20.1 → pygit2-1.21.0}/test/data/binaryfilerepo.zip +0 -0
  150. {pygit2-1.20.1 → pygit2-1.21.0}/test/data/blameflagsrepo.zip +0 -0
  151. {pygit2-1.20.1 → pygit2-1.21.0}/test/data/dirtyrepo.zip +0 -0
  152. {pygit2-1.20.1 → pygit2-1.21.0}/test/data/emptyrepo.zip +0 -0
  153. {pygit2-1.20.1 → pygit2-1.21.0}/test/data/encoding.zip +0 -0
  154. {pygit2-1.20.1 → pygit2-1.21.0}/test/data/gpgsigned.zip +0 -0
  155. {pygit2-1.20.1 → pygit2-1.21.0}/test/data/submodulerepo.zip +0 -0
  156. {pygit2-1.20.1 → pygit2-1.21.0}/test/data/testrepo.zip +0 -0
  157. {pygit2-1.20.1 → pygit2-1.21.0}/test/data/testrepoformerging.zip +0 -0
  158. {pygit2-1.20.1 → pygit2-1.21.0}/test/data/testrepopacked.zip +0 -0
  159. {pygit2-1.20.1 → pygit2-1.21.0}/test/data/trailerrepo.zip +0 -0
  160. {pygit2-1.20.1 → pygit2-1.21.0}/test/data/utf8branchrepo.zip +0 -0
  161. {pygit2-1.20.1 → pygit2-1.21.0}/test/keys/pygit2_empty +0 -0
  162. {pygit2-1.20.1 → pygit2-1.21.0}/test/keys/pygit2_empty.pub +0 -0
  163. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_apply_diff.py +0 -0
  164. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_archive.py +0 -0
  165. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_attributes.py +0 -0
  166. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_blame.py +0 -0
  167. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_blob.py +0 -0
  168. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_cherrypick.py +0 -0
  169. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_commit.py +0 -0
  170. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_commit_gpg.py +0 -0
  171. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_commit_trailer.py +0 -0
  172. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_credentials.py +0 -0
  173. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_describe.py +0 -0
  174. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_diff.py +0 -0
  175. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_diff_binary.py +0 -0
  176. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_errors.py +0 -0
  177. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_filter.py +0 -0
  178. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_index.py +0 -0
  179. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_mailmap.py +0 -0
  180. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_merge.py +0 -0
  181. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_nonunicode.py +0 -0
  182. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_note.py +0 -0
  183. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_object.py +0 -0
  184. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_odb.py +0 -0
  185. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_oid.py +0 -0
  186. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_options.py +0 -0
  187. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_patch.py +0 -0
  188. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_patch_encoding.py +0 -0
  189. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_rebase.py +0 -0
  190. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_refdb_backend.py +0 -0
  191. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_remote.py +0 -0
  192. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_remote_prune.py +0 -0
  193. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_remote_utf8.py +0 -0
  194. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_repository.py +0 -0
  195. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_repository_bare.py +0 -0
  196. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_repository_custom.py +0 -0
  197. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_repository_empty.py +0 -0
  198. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_revparse.py +0 -0
  199. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_revwalk.py +0 -0
  200. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_settings.py +0 -0
  201. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_signature.py +0 -0
  202. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_status.py +0 -0
  203. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_submodule.py +0 -0
  204. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_tag.py +0 -0
  205. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_transaction.py +0 -0
  206. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_tree.py +0 -0
  207. {pygit2-1.20.1 → pygit2-1.21.0}/test/test_treebuilder.py +0 -0
@@ -10,7 +10,7 @@ and a high-level, Pythonic API for repository manipulation.
10
10
  - **Version**: 1.19.3 (canonical version is defined in `pygit2/_build.py`)
11
11
  - **License**: GPLv2 with linking exception (see `COPYING`)
12
12
  - **Maintainer**: J. David Ibáñez
13
- - **Python Support**: 3.11 – 3.14 and PyPy3 7.3+
13
+ - **Python Support**: 3.11 – 3.15 and PyPy3 7.3+
14
14
  - **libgit2 Version**: 1.9.7
15
15
  - **Homepage**: <https://www.pygit2.org/>
16
16
  - **Repository**: <https://github.com/libgit2/pygit2>
@@ -69,7 +69,6 @@ modules:
69
69
  also copies `git2.dll` into the package (see `BuildWithDLLs`).
70
70
  - **`pyproject.toml`** — Build-system requirements, `cibuildwheel`
71
71
  configuration, `ruff` settings, and `codespell` settings.
72
- - **`setup.cfg`** — Legacy pycodestyle configuration.
73
72
  - **`pytest.ini`** — pytest configuration (`--capture=no -ra --verbose`,
74
73
  `testpaths = test/`).
75
74
  - **`mypy.ini`** — mypy configuration with strict settings.
@@ -240,7 +239,7 @@ GitHub Actions workflows live in `.github/workflows/`:
240
239
  Allowed to fail (`continue-on-error`); see issue #812.
241
240
  - **`lint.yml`** — Runs `ruff format --diff`, `ruff check`, and
242
241
  `sh build.sh mypy`.
243
- - **`wheels.yml`** — Uses `cibuildwheel` (`~=3.3`) to build wheels for Linux
242
+ - **`wheels.yml`** — Uses `cibuildwheel` (`~=4.3.1`) to build wheels for Linux
244
243
  (amd64, arm64, ppc64le and riscv64 via QEMU, musl), macOS (intel, arm64,
245
244
  PyPy), and Windows (x64, x86, arm64). Linux, macOS and Windows jobs cache
246
245
  the compiled dependencies between runs. It also builds an sdist, runs a
@@ -253,12 +252,11 @@ The `cibuildwheel` configuration in `pyproject.toml` pins:
253
252
 
254
253
  - `LIBGIT2_VERSION="1.9.7"`
255
254
  - `LIBSSH2_VERSION="1.11.1"`
256
- - `OPENSSL_VERSION="3.5.7"`
255
+ - `OPENSSL_VERSION="3.5.9"`
257
256
 
258
257
  and skips `*musllinux_ppc64le` plus testing on `*-*linux_ppc64le`,
259
258
  `*-*linux_riscv64` and `pp*-macosx_arm64`. On Windows it uses the
260
- `Visual Studio 18 2026` CMake generator for x64/x86 and
261
- `Visual Studio 17 2022` for ARM64.
259
+ `Visual Studio 18 2026` CMake generator for x64/x86 and ARM64.
262
260
 
263
261
  ## Security Considerations
264
262
 
@@ -14,9 +14,9 @@ Authors:
14
14
  Brandon Milton
15
15
  Daniel Rodríguez Troitiño
16
16
  Brendan Doherty
17
+ Christian Boos
17
18
  Peter Rowlands
18
19
  Richo Healey
19
- Christian Boos
20
20
  Julien Miotte
21
21
  Nick Hynes
22
22
  Richard Möhn
@@ -42,6 +42,7 @@ Authors:
42
42
  Bernardo Heynemann
43
43
  John Szakmeister
44
44
  Nabijacz Leweli
45
+ Nicholas Williams
45
46
  Simon Cozens
46
47
  Vlad Temian
47
48
  WANG Xuerui
@@ -60,6 +61,7 @@ Authors:
60
61
  David Versmisse
61
62
  Grégory Herrero
62
63
  Mikhail Yushkovskiy
64
+ Or Hayat
63
65
  Robin Stocker
64
66
  Rohit Sanjay
65
67
  Rémi Duraffort
@@ -88,6 +90,7 @@ Authors:
88
90
  Petr Viktorin
89
91
  Robert Hölzl
90
92
  Ron Cohen
93
+ Roshan Ramani
91
94
  Sebastian Böhm
92
95
  Sukhman Bhuller
93
96
  Thomas Kluyver
@@ -128,7 +131,6 @@ Authors:
128
131
  Michael Sondergaard
129
132
  Michal Koutný
130
133
  Natanael Arndt
131
- Nick Williams
132
134
  Ondřej Nový
133
135
  Sarath Lakshman
134
136
  Steve Kieffer
@@ -201,6 +203,7 @@ Authors:
201
203
  Kyriakos Oikonomakos
202
204
  Lance Eftink
203
205
  Legorooj
206
+ Logan Hunt
204
207
  Lukas Berk
205
208
  Marius Gedminas
206
209
  Martin von Zweigbergk
@@ -218,7 +221,6 @@ Authors:
218
221
  Nikolai Zujev
219
222
  Nils Philippsen
220
223
  Noah Fontes
221
- Or Hayat
222
224
  Óscar San José
223
225
  Patrick Lühne
224
226
  Paul Wagland
@@ -229,7 +231,6 @@ Authors:
229
231
  Remy Suen
230
232
  Ridge Kennedy
231
233
  Rodrigo Bistolfi
232
- Roshan Ramani
233
234
  Ross Nicoll
234
235
  Rui Abreu Ferreira
235
236
  Rui Chen
@@ -1,3 +1,36 @@
1
+ # 1.21.0 (2026-11-04)
2
+
3
+ - Add support for Python 3.15
4
+ [#1498](https://github.com/libgit2/pygit2/pull/1498)
5
+
6
+ - New `Config` subclasses: `DefaultConfig` for the default configuration and
7
+ `RepositoryConfig` for repository configurations
8
+ [#1501](https://github.com/libgit2/pygit2/pull/1501)
9
+
10
+ - Fix `ConfigEntry` retaining `git_config_entry` pointers owned by config
11
+ iterators, which could make entry values change unexpectedly and cause
12
+ crashes; values are now copied eagerly
13
+ [#1499](https://github.com/libgit2/pygit2/pull/1499)
14
+
15
+ - Fix custom ODB backends: acquire the GIL when calling back into Python,
16
+ and fix `write_cb`'s type argument
17
+ [#1496](https://github.com/libgit2/pygit2/pull/1496)
18
+
19
+ - Fix `References.get()`, `Branches.get()`, and the `in` operator on both
20
+ collections raising `InvalidSpecError` for invalid names; they now return
21
+ `None` and `False` respectively, as documented
22
+ [#1495](https://github.com/libgit2/pygit2/pull/1495)
23
+
24
+ - Fix `sh build.sh stubtest`
25
+ [#1492](https://github.com/libgit2/pygit2/pull/1492)
26
+
27
+ - Wheels: Build the bundled libgit2 and libssh2 in Release mode instead of Debug
28
+ [#1497](https://github.com/libgit2/pygit2/pull/1497)
29
+
30
+ - Wheels: Update OpenSSL to 3.5.9
31
+ [#1506](https://github.com/libgit2/pygit2/issues/1506)
32
+
33
+
1
34
  # 1.20.1 (2026-09-12)
2
35
 
3
36
  - Update wheels to libgit2 1.9.7
@@ -1,7 +1,7 @@
1
1
  .PHONY: build html
2
2
 
3
3
  build:
4
- OPENSSL_VERSION=3.5.7 LIBSSH2_VERSION=1.11.1 LIBGIT2_VERSION=1.9.7 sh build.sh
4
+ OPENSSL_VERSION=3.5.9 LIBSSH2_VERSION=1.11.1 LIBGIT2_VERSION=1.9.7 sh build.sh
5
5
 
6
6
  html: build
7
7
  make -C docs html
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pygit2
3
- Version: 1.20.1
3
+ Version: 1.21.0
4
4
  Summary: Python bindings for libgit2.
5
5
  Home-page: https://github.com/libgit2/pygit2
6
6
  Maintainer: J. David Ibáñez
@@ -18,6 +18,7 @@ Classifier: Programming Language :: Python :: 3.11
18
18
  Classifier: Programming Language :: Python :: 3.12
19
19
  Classifier: Programming Language :: Python :: 3.13
20
20
  Classifier: Programming Language :: Python :: 3.14
21
+ Classifier: Programming Language :: Python :: 3.15
21
22
  Classifier: Programming Language :: Python :: Implementation :: PyPy
22
23
  Classifier: Programming Language :: Python :: Implementation :: CPython
23
24
  Classifier: Topic :: Software Development :: Version Control
@@ -44,7 +45,7 @@ Dynamic: summary
44
45
  # pygit2 - libgit2 bindings in Python
45
46
 
46
47
  Bindings to the libgit2 shared library, implements Git plumbing.
47
- Supports Python 3.11 to 3.14 and PyPy3 7.3+
48
+ Supports Python 3.11 to 3.15 and PyPy3 7.3+
48
49
 
49
50
  [![test-ci-badge][test-ci-badge]][test-ci-link]
50
51
  [![deploy-ci-badge][deploy-ci-badge]][deploy-ci-link]
@@ -1,7 +1,7 @@
1
1
  # pygit2 - libgit2 bindings in Python
2
2
 
3
3
  Bindings to the libgit2 shared library, implements Git plumbing.
4
- Supports Python 3.11 to 3.14 and PyPy3 7.3+
4
+ Supports Python 3.11 to 3.15 and PyPy3 7.3+
5
5
 
6
6
  [![test-ci-badge][test-ci-badge]][test-ci-link]
7
7
  [![deploy-ci-badge][deploy-ci-badge]][deploy-ci-link]
@@ -83,11 +83,12 @@ if [ "$CIBUILDWHEEL" = "1" ]; then
83
83
  fi
84
84
  fi
85
85
 
86
- # Use cached dependencies if they match the requested versions.
86
+ # Use cached dependencies if they match the requested versions and build type.
87
87
  if [ -f ci/versions.txt ] && \
88
88
  grep -q "^LIBGIT2_VERSION=$LIBGIT2_VERSION$" ci/versions.txt && \
89
89
  grep -q "^LIBSSH2_VERSION=$LIBSSH2_VERSION$" ci/versions.txt && \
90
- grep -q "^OPENSSL_VERSION=$OPENSSL_VERSION$" ci/versions.txt; then
90
+ grep -q "^OPENSSL_VERSION=$OPENSSL_VERSION$" ci/versions.txt && \
91
+ grep -q "^BUILD_TYPE=$BUILD_TYPE$" ci/versions.txt; then
91
92
  echo "Using cached dependencies"
92
93
  exit 0
93
94
  fi
@@ -163,6 +164,7 @@ if [ -n "$LIBSSH2_VERSION" ]; then
163
164
  -DCMAKE_INSTALL_PREFIX=$PREFIX \
164
165
  -DBUILD_SHARED_LIBS=ON \
165
166
  -DBUILD_EXAMPLES=OFF \
167
+ -DCMAKE_BUILD_TYPE=$BUILD_TYPE \
166
168
  -DCMAKE_OSX_ARCHITECTURES="$ARCH" \
167
169
  -DBUILD_TESTING=OFF
168
170
  else
@@ -170,6 +172,7 @@ if [ -n "$LIBSSH2_VERSION" ]; then
170
172
  -DCMAKE_INSTALL_PREFIX=$PREFIX \
171
173
  -DBUILD_SHARED_LIBS=ON \
172
174
  -DBUILD_EXAMPLES=OFF \
175
+ -DCMAKE_BUILD_TYPE=$BUILD_TYPE \
173
176
  -DBUILD_TESTING=OFF
174
177
  fi
175
178
  cmake --build . --target install
@@ -216,6 +219,7 @@ if [ "$CIBUILDWHEEL" = "1" ]; then
216
219
  LIBGIT2_VERSION=$LIBGIT2_VERSION
217
220
  LIBSSH2_VERSION=$LIBSSH2_VERSION
218
221
  OPENSSL_VERSION=$OPENSSL_VERSION
222
+ BUILD_TYPE=$BUILD_TYPE
219
223
  EOF
220
224
  if [ "$KERNEL" = "Darwin" ]; then
221
225
  echo "PREFIX " $PREFIX
@@ -0,0 +1,28 @@
1
+ # Config file for testing the stub file (_pygit2.pyi) with "stubtest"
2
+ # (tool shipped with mypy).
3
+ #
4
+ # Run "build.sh stubtest", or:
5
+ # stubtest --mypy-config-file test/mypy-stubtest.ini pygit2._pygit2
6
+ #
7
+ # Format info:
8
+ # https://mypy.readthedocs.io/en/stable/config_file.html
9
+
10
+ [mypy]
11
+ warn_unused_configs = True
12
+ disallow_any_explicit = True
13
+
14
+ # don't follow import pygit2 from _pygit2.pyi, we only want to check the pyi file.
15
+ [mypy-pygit2]
16
+ follow_imports = skip
17
+
18
+ # The stub imports names from the package (pygit2.Index) and from the cffi
19
+ # binding stub, so those modules enter the build even though stubtest only
20
+ # reads _pygit2.pyi. disallow_any_explicit above is about the stub under test;
21
+ # applying it to the rest of the package is what stopped stubtest running at
22
+ # all once pygit2/_libgit2/ffi.pyi arrived.
23
+ [mypy-pygit2.*]
24
+ disallow_any_explicit = False
25
+
26
+ # ... except the stub under test, which is the point of the setting.
27
+ [mypy-pygit2._pygit2]
28
+ disallow_any_explicit = True
@@ -301,7 +301,11 @@ from .callbacks import (
301
301
  git_fetch_options,
302
302
  git_proxy_options,
303
303
  )
304
- from .config import Config
304
+ from .config import (
305
+ Config,
306
+ DefaultConfig,
307
+ RepositoryConfig,
308
+ )
305
309
  from .credentials import *
306
310
  from .errors import (
307
311
  AlreadyExistsError,
@@ -606,6 +610,7 @@ __all__ = (
606
610
  'Branch',
607
611
  'CertificateError',
608
612
  'Commit',
613
+ 'DefaultConfig',
609
614
  'Diff',
610
615
  'DiffDelta',
611
616
  'DiffFile',
@@ -941,6 +946,7 @@ __all__ = (
941
946
  'Remote',
942
947
  'repository',
943
948
  'Repository',
949
+ 'RepositoryConfig',
944
950
  'branches',
945
951
  'references',
946
952
  'settings',
@@ -34,7 +34,7 @@ from pathlib import Path
34
34
  #
35
35
  # The version number of pygit2
36
36
  #
37
- __version__ = '1.20.1'
37
+ __version__ = '1.21.0'
38
38
 
39
39
 
40
40
  #
@@ -70,5 +70,13 @@ def get_libgit2_paths() -> tuple[Path, dict[str, list[str]]]:
70
70
  'libraries': ['git2'],
71
71
  'include_dirs': [str(x) for x in include_dirs],
72
72
  'library_dirs': [str(x) for x in library_dirs],
73
+ # For debugging memory issues (segfaults) during development, uncomment the
74
+ # following lines and rebuild everything. YMMV
75
+ # 'extra_compile_args': [
76
+ # '-fsanitize=address',
77
+ # '-fsanitize-address-use-after-scope',
78
+ # '-fsanitize-address-use-odr-indicator',
79
+ # ],
80
+ # 'extra_link_args': ['-fsanitize=address'],
73
81
  },
74
82
  )
@@ -24,11 +24,10 @@
24
24
  # Boston, MA 02110-1301, USA.
25
25
 
26
26
  """
27
- This is an special module, it provides stuff used by by pygit2 at run-time.
27
+ This is a special module, it provides stuff used by pygit2 at run-time.
28
28
  """
29
29
 
30
30
  # Import from the Standard Library
31
- import codecs
32
31
  import sys
33
32
  from pathlib import Path
34
33
 
@@ -89,9 +88,8 @@ h_files = [
89
88
  ]
90
89
  h_source = []
91
90
  for h_file in h_files:
92
- h_file = dir_path / 'decl' / h_file # type: ignore
93
- with codecs.open(h_file, 'r', 'utf-8') as f:
94
- h_source.append(f.read())
91
+ h_path = dir_path / 'decl' / h_file
92
+ h_source.append(h_path.read_text(encoding='utf-8'))
95
93
 
96
94
  C_HEADER_SRC = '\n'.join(h_source)
97
95
 
@@ -28,7 +28,7 @@ from __future__ import annotations
28
28
  from collections.abc import Iterator
29
29
  from typing import TYPE_CHECKING
30
30
 
31
- from ._pygit2 import Branch, Commit, Oid
31
+ from ._pygit2 import Branch, Commit, InvalidSpecError, Oid
32
32
  from .enums import BranchType, ReferenceType
33
33
 
34
34
  # Need BaseRepository for type hints, but don't let it cause a circular dependency
@@ -72,11 +72,13 @@ class Branches:
72
72
 
73
73
  return branch
74
74
 
75
- def get(self, key: str) -> Branch:
75
+ def get(self, key: str) -> Branch | None:
76
76
  try:
77
77
  return self[key]
78
- except KeyError:
79
- return None # type:ignore # next commit
78
+ except (KeyError, InvalidSpecError):
79
+ # As in References.get: git_branch_lookup reports
80
+ # GIT_EINVALIDSPEC for a name that is not a valid branch name.
81
+ return None
80
82
 
81
83
  def __iter__(self) -> Iterator[str]:
82
84
  for branch_name in self._repository.listall_branches(self._flag):