- Fix a number of reference leaks
- Review custom object backends
Breaking changes:
- In custom backends the callbacks have been renamed from
readtoread_cb,writetowrite_cb, and so on.
- New optional
proxyargument inRemotemethods #642 #1063 #1069 - New GIT_MERGE_PREFERENCE constants #1071
- Don't require cached-property with Python 3.8 or later #1066
- Add wheels for aarch64 #1077 #1078
- Documentation fixes #1068 #1072
- Refactored build and CI, new
build.shscript
Breaking changes:
- Remove deprecated
GIT_CREDTYPE_XXXcontants, useGIT_CREDENTIAL_XXXinstead. - Remove deprecated
Patch.patchgetter, usePatch.textinstead.
- New
PackBuilderclass andRepository.pack(...)#1048 - New
Config.delete_multivar(...)#1056 - New
Repository.is_shallow#1058 - New optional
messageargument inRepository.create_reference(...)#1061 #1062 - Fix truncated diff when there are nulls #1047 #1043
- Unit tests & Continuous integration #1039 #1052
Breaking changes:
- Fix
Index.add(...)raiseTypeErrorinstead ofAttributeErrorwhen arguments are of unexpected type
- Upgrade to libgit2 1.1, new
GIT_BLAME_IGNORE_WHITESPACEconstant #1040 - Add wheels for Python 3.9 #1038
- Drop support for PyPy3 7.2
- New optional
flagsargument inRepository.__init__(...), newGIT_REPOSITORY_OPEN_*constants #1044 - Documentation #509 #752 #1037 #1045
- New
Repository.add_submodule(...)#1011 - New
Repository.applies(...)#1019 - New
Repository.revparse(...)andRepository.revparse_ext(...)#1022 - New optional
flagsandfile_flagsarguments inRepository.merge_commitsandRepository.merge_trees#1008 - New
Reference.raw_target,Repository.raw_listall_branches(...)andRepository.raw_listall_references(); allow bytes inRepository.lookup_branch(...)andRepository.diff(...)#1029 - New
GIT_BLAME_FIRST_PARENTandGIT_BLAME_USE_MAILMAPconstants #1031 - New
IndexEntrysupportsrepr(),str(),==and!=#1009 - New
Objectsupportsrepr()#1022 - New accept tuples of strings (not only lists) in a number of places #1025
- Fix compatibility with old macOS 10.9 #1026 #1027
- Fix check argument type in
Repository.apply(...)#1033 - Fix raise exception if error in
Repository.listall_submodules()commit 32133974 - Fix a couple of refcount errors in
OdbBackend.refresh()andWorktree_is_prunablecommit fed0c19c - Unit tests #800 #1015
- Documentation #705
- Fix segfault in
Object.raw_namewhen not reached through a tree #1002 - Internal: Use @ffi.def_extern instead of @ffi.callback #899
- Internal: callbacks code refactored
- Test suite completely switched to pytest #824
- New unit tests #538 #996
- Documentation changes #999
Deprecations:
- Deprecate
Repository.create_remote(...), use insteadRepository.remotes.create(...) - Deprecate
GIT_CREDTYPE_XXXcontants, useGIT_CREDENTIAL_XXXinstead.
- Drop support for Python 3.5 #991
- Upgrade to libgit2 1.0 #982
- New support for custom reference database backends #982
- New support for path objects #990 #955
- New
indexoptional parameter inRepository.checkout_index#987 - New MacOS wheels #988
- Fix re-raise exception from credentials callback in clone_repository #996
- Fix warning with
pip install pygit2#986 - Tests: disable global Git config #989
- Fix crash in tree iteration #984 #980
- Do not include the docs in dist files, so they're much smaller now
- Upgrade to libgit2 0.99 #959
- Continued work on custom odb backends #948
- New
Diff.patchidgetter #960 #877 - New
settings.disable_pack_keep_file_checks(...)#908 - New
GIT_DIFF_andGIT_DELTA_constants #738 - Fix crash in iteration of config entries #970
- Travis: fix printing features when building Linux wheels #977
- Move
_pygit2topygit2._pygit2#978
Requirements changes:
- Now libgit2 0.99 is required
- New requirement: cached-property
Breaking changes:
In the rare case you're directly importing the low level
_pygit2, the import has changed:# Before import _pygit2 # Now from pygit2 import _pygit2
- Fix memory leak in DiffFile #943
- Fix enumerating tree entries with submodules #967
- Fix build in Mac OS #963
- Drop Python 2.7 and 3.4 support, six no longer required #941
- Add Python 3.8 support #918
- New support for
/operator to traverse trees #903 #924 - New
Branch.raw_branch_name#954 - New
Index.remove_all()#920 - New
Remote.ls_remotes(..)#935 #936 - New
Repository.lookup_reference_dwim(..)andRepository.resolve_refish(..)#922 #923 - New
Repository.odbreturns newOdbtype instance. And newOdbBackendtype. #940 #942 - New
Repository.references.compress()#961 - Optimization: Load notes lazily #958
- Fix spurious exception in config #916 #917
- Minor documentation and cosmetic changes #919 #921 #946 #950
Breaking changes:
Now the Repository has a new attribue
odbfor object database:# Before repository.read(...) repository.write(...) # Now repository.odb.read(...) repository.odb.write(...)
Now
Tree[x]returns aObjectinstance instead of aTreeEntry;Object.typereturns an integer whileTreeEntry.typereturned a string:# Before if tree[x].type == 'tree': # Now if tree[x].type == GIT_OBJ_TREE: if tree[x].type_str == 'tree':
Renamed
TreeEntry._nametoObject.raw_name:# Before tree[x]._name # Now tree[x].raw_name
Object comparison is done by id. In the rare case you need to do tree-entry comparison or sorting:
# Before tree[x] < tree[y] sorted(list(tree)) # Now pygit2.tree_entry_cmp(x, y) < 0 sorted(list(tree), key=pygit2.tree_entry_key)
- Fix crash in reflog iteration #901
- Support symbolic references in
branches.with_commit(..)#910 - Documentation updates #909
- Test updates #911
- Now works with pycparser 2.18 and above #846
- Now
Repository.write_archive(..)keeps the file mode #616 #898 - New
Patch.datareturns the raw contents of the patch as a byte string #790 #893 - New
Patch.textreturns the contents of the patch as a text string, deprecates Patch.patch #790 #893
Deprecations:
Patch.patchis deprecated, usePatch.textinstead
- Upgrade to libgit2 0.28 #878
- Add binary wheels for Linux #793 #869 #874 #875 #883
- New
pygit2.Mailmap, see documentation #804 - New
Repository.apply(...)wrapsgit_apply(..)#841 #843 - Now
Repository.merge_analysis(...)accepts an optional reference parameter #888 #891 - Now
Repository.add_worktree(...)accepts an optional reference parameter #814 #889 - Now it's possible to set SSL certificate locations #876 #879 #884 #886
- Test and documentation improvements #873 #887
Breaking changes:
- Now
worktree.pathreturns the path to the worktree directory, not to the .git file within #803 - Remove undocumented
worktree.git_path#803
- New
pygit2.LIBGIT2_VERtuple #845 #848 - New objects now support (in)equality comparison and hash #852 #853
- New references now support (in)equality comparison #860 #862
- New
pathsoptional argument inRepository.checkout()#858 #859 - Fix speed and windows package regression #849 #857 #851
- Fix deprecation warning #850
- Documentation fixes #855
- Add Python classifiers to setup.py #861
- Speeding up tests in Travis #854
Breaking changes:
- Remove deprecated Reference.get_object(), use Reference.peel() instead
- Move to pytest, drop support for Python 3.3 and cffi 0.x #824 #826 #833 #834
- New support comparing signatures for (in)equality
- New
Submodule.head_id#817 - New
Remote.prune(...)#825 - New
pygit2.reference_is_valid_name(...)#827 - New
AlreadyExistsErrorandInvalidSpecError#828 #829 - New
Reference.raw_name,Reference.raw_shorthand,Tag.raw_name,Tag.raw_messageandDiffFile.raw_path#840 - Fix decode error in commit messages and signatures #839
- Fix, raise error in
Repository.descendant_of(...)if commit doesn't exist #822 #842 - Documentation fixes #821
Breaking changes:
- Remove undocumented
Tag._message, replaced byTag.raw_message
- Add support for Python 3.7 #809
- New
Object.short_id#799 #806 #807 - New
Repository.descendant_ofandRepository.branches.with_commit#815 #816 - Fix repository initialization in
clone_repository(...)#818 - Fix several warnings and errors, commits cd896ddc and dfa536a3
- Documentation fixes and improvements #805 #808
Breaking changes:
- Now
discover_repositoryreturnsNoneif repository not found, instead of raisingKeyError#531
Other changes:
- New
DiffLine.raw_content#610 - Fix tests failing in some cases #795
- Automatize wheels upload to pypi #563
Backward incompatible changes:
Now iterating over a configuration returns
ConfigEntryobjects #778# Before for name in config: value = config[name] # Now for entry in config: name = entry.name value = entry.value
Other changes:
- Added support for worktrees #779
- New
Commit.gpg_signature#766 - New static
Diff.parse_diff(...)#774 - New optional argument
callbacksinRepository.update_submodules(...)#763 - New
KeypairFromMemorycredentials #771 - Add missing status constants #781
- Fix segfault #775
- Fix some unicode decode errors with Python 2 #767 #768
- Documentation improvements #721 #769 #770
- New
Diff.deltas#736 - Improvements to
Patch.create_from#753 #756 #759 - Fix build and tests in Windows, broken in the previous release #749 #751
- Review
Patch.patch#757 - Workaround bug #4442 in libgit2, and improve unit tests #748 #754 #758 #761
- New property
Patch.patch#739 #741 - New static method
Patch.create_from#742 #744 - New parameter
pruneinRemote.fetch#743 - Tests: skip tests that require network when there is not #737
- Tests: other improvements #740
- Documentation improvements
- New
Repository.free()#730 - Improve credentials handling for ssh cloning #718
- Documentation improvements #714 #715 #728 #733 #734 #735
- Update to libgit2 v0.26 #713
- Drop support for Python 3.2, add support for cffi 1.10 #706 #694
- New
Repository.revert_commit(...)#711 #710 - New
Branch.is_checked_out()#696 - Various fixes #706 #707 #708
- Add suport for Python 3.6
- New support for stash: repository methods
stash,stash_apply,stash_dropandstash_pop#695 - Improved support for submodules: new repository methods
init_submodulesandupdate_submodules#692 - New friendlier API for branches & references:
Repository.branchesandRepository.references#700 #701 - New support for custom backends #690
- Fix
init_repositorycrash on None input #688 #697 - Fix checkout with an orphan master branch #669 #685
- Better error messages for opening repositories #645 #698
- Upgrade to libgit2 0.25 #670
- Now Commit.tree raises an error if tree is not found #682
- New settings.mwindow_mapped_limit, cached_memory, enable_caching, cache_max_size and cache_object_limit #677
- Unit tests pass on Windows, integration with AppVeyor #641 #655 #657 #659 #660 #661 #667
- Fix when libgit2 error messages have non-ascii chars #651
- Documentation improvements #643 #653 #663
- New
Repository.listall_reference_objects()#634 - Fix
Repository.write_archive(...)#619 #621 - Reproducible builds #636
- Documentation fixes #606 #607 #609 #623
- Test updates #629
- Update to libgit2 v0.24 #594
- Support Python 3.5
- New dependency, six
- New
Repository.path_is_ignored(path)#589 - Fix error in
Repository(path)when path is a bytes string #588 #593 - Fix memory issue in
Repository.describe(...)#592 #597 #599 - Allow testing with tox #600
- New
Repository.create_blob_fromiobase(...)#490 #577 - New
Repository.describe(...)#585 - Fix
Signaturedefault encoding, UTF-8 now #581 - Fixing
pip install pygit2, should install cffi first - Unit tests, fix binary diff test #586
- Document that
Diff.patchcan beNone#587
- Unify callbacks system for remotes and clone #568
- New
TreeEntry._name#570 - Fix segfault in
Tag._message#572 - Documentation improvements #569 #574
API changes to clone:
# Before clone_repository(..., credentials, certificate) # Now callbacks = RemoteCallbacks(credentials, certificate) clone_repository(..., callbacks)
API changes to remote:
# Before
def transfer_progress(stats):
...
remote.credentials = credentials
remote.transfer_progress = transfer_progress
remote.fetch()
remote.push(specs)
# Now
class MyCallbacks(RemoteCallbacks):
def transfer_progress(self, stats):
...
callbacks = MyCallbacks(credentials)
remote.fetch(callbacks=callbacks)
remote.push(specs, callbacks=callbacks)
- Improve support for cffi 1.0+ #529 #561
- Fix
Remote.push#557 - New
TreeEntry.type#560 - New
pygit2.GIT_DIFF_SHOW_BINARY#566
- Update to libgit2 v0.23 #540
- Now
Repository.merge_base(...)returnsNoneif no merge base is found #550 - Documentation updates #547
API changes:
How to set identity (aka signature) in a reflog has changed:
# Before signature = Signature('foo', 'bar') ... reference.set_target(target, signature=signature, message=message) repo.set_head(target, signature=signature) remote.fetch(signature=signature) remote.push(signature=signature) # Now repo.set_ident('foo', 'bar') ... reference.set_target(target, message=message) repo.set_head(target) remote.push() # The current identity can be get with repo.identSome remote setters have been replaced by methods:
# Before # Now Remote.url = url Repository.remotes.set_url(name, url) Remote.push_url = url Repository.remotes.set_push_url(name, url) Remote.add_fetch(refspec) Repository.remotes.add_fetch(name, refspec) Remote.add_push(refspec) Repository.remotes.add_push(name, refspec) Remote.fetch_refspecs = [...] removed, use the config API instead Remote.push_refspecs = [...] removed, use the config API instead
Diff interface refactoring #346 (in progress):
New
iter(pygit2.Blame)New
pygit2.DiffDelta,pygit2.DiffFileandpygit.DiffLineAPI changes, translation table:
Hunk => DiffHunk Patch.old_file_path => Patch.delta.old_file.path Patch.new_file_path => Patch.delta.new_file.path Patch.old_id => Patch.delta.old_file.id Patch.new_id => Patch.delta.new_file.id Patch.status => Patch.delta.status Patch.similarity => Patch.delta.similarity Patch.is_binary => Patch.delta.is_binary Patch.additions => Patch.line_stats[1] Patch.deletions => Patch.line_stats[2]
DiffHunk.linesis now a list ofDiffLineobjects, not tuples
New features:
- New
Repository.expand_id(...)andRepository.ahead_behind(...)#448 - New
prefixparameter inRepository.write_archive#481 - New
Repository.merge_trees(...)#489 - New
Repository.cherrypick(...)#436 #492 - New support for submodules #499 #514
- New
Repository.merge_file_from_index(...)#503 - Now
Repository.diffsupports diffing two blobs #508 - New optional
fetchparameter inRemote.create#526 - New
pygit2.DiffStats#406 #525 - New
Repository.get_attr(...)#528 - New
leveloptional parameter inIndex.remove#533 - New
repr(TreeEntry)#543
Build and install improvements:
Bugs fixed:
- Fix memory issues #477 #487 #520
- Fix TreeEntry equality testing #458 #488
Repository.write_archivefix handling of symlinks #480- Fix type check in
Diff[...]#495 - Fix error when merging files with unicode content #505
Other:
- Documentation improvements and fixes #448 #491 #497 #507 #517 #518 #519 #521 #523 #527 #536
- Expose the
pygit2.GIT_REPOSITORY_INIT_*constants #483
New:
- Update to libgit2 v0.22 #459
- Add support for libgit2 feature detection
(new
pygit2.featuresandpygit2.GIT_FEATURE_*) #475 - New
Repository.remotes(RemoteCollection) #447
API Changes:
- Prototype of
clone_repositorychanged, check documentation - Removed
clone_into, useclone_repositorywith callbacks instead - Use
Repository.remotes.rename(name, new_name)instead ofRemote.rename(new_name) - Use
Repository.remotes.delete(name)instead ofRemote.delete() - Now
Remote.push(...)takes a list of refspecs instead of just one - Change
Patch.old_id,Patch.new_id,Note.annotated_id,RefLogEntry.oid_oldandRefLogEntry.oid_newto beOidobjects instead of strings #449
Other:
- Fix
init_repositorywhen passing optional parametersworkdir_path,description,template_path,initial_headororigin_url#466 #471 - Fix use-after-free when patch outlives diff #457 #461 #474
- Documentation improvements #456 #462 #465 #472 #473
- Make the GPL exception explicit in setup.py #450
- Fix credentials callback not set when pushing #431 #435 #437 #438
- Fix
Repository.diff(...)when treeish is "empty" #432 - New
Reference.peel(...)rendersReference.get_object()obsolete #434 - New, authenticate using ssh agent #424
- New
Repository.merge_commits(...)#445 - Make it easier to run when libgit2 not in a standard location #441
- Documentation: review install chapter
- Documentation: many corrections #427 #429 #439 #440 #442 #443 #444
Breaking changes:
- Now
Repository.blame(...)returnsOidinstead of string #413 - New
Reference.set_target(...)replaces theReference.targetsetter andReference.log_append(...)#414 - New
Repository.set_head(...)replaces theRepository.headsetter #414 Repository.merge(...)now uses theSAFE_CREATEstrategy by default #417
Other changes:
- New
Remote.delete()#418 #420 - New
Repository.write_archive(...)#421 - Now
Repository.checkout(...)accepts branch objects #408 - Fix refcount leak in remotes #403 #404 #419
- Various fixes to
clone_repository(...)#399 #411 #425 #426 - Fix build error in Python 3 #401
- Now
pip install pygit2installs cffi first #380 #407 - Add support for PyPy3 #422
- Documentation improvements #398 #409
- Fix regression with Python 2,
IndexEntry.pathreturns str (bytes in Python 2 and unicode in Python 3) - Get back
IndexEntry.oidfor backwards compatibility - Config, iterate over the keys (instead of the key/value pairs) #395
Diff.find_similarsupports new threshold arguments #396- Optimization, do not load the object when expanding an oid prefix #397
- Install fix #382
- Documentation improved, including #383 #385 #388
- Documentation, use the read-the-docs theme #387
- Coding style improvements #392
- New
Repository.state_cleanup()#386 - New
Index.conflicts#345 #389 - New checkout option to define the target directory #390
Backward incompatible changes:
Now the checkout strategy must be a keyword argument.
Change
Repository.checkout(refname, strategy)toRepository.checkout(refname, strategy=strategy)Idem for
checkout_head,checkout_indexandcheckout_tree
Highlights:
- Drop official support for Python 2.6, and add support for Python 3.4 #376
- Upgrade to libgit2 v0.21.0 #374
- Start using cffi #360 #361
Backward incompatible changes:
- Replace
oidbyidthrough the API to follow libgit2 conventions. - Merge API overhaul following changes in libgit2.
- New
Remote.rename(...)replacesRemote.name = ... - Now
Remote.fetch()returns aTransferProgressobject. - Now
Config.get_multivar(...)returns an iterator instead of a list.
New features:
- New
Config.snapshot()andRepository.config_snapshot() - New
Configmethods:get_bool(...),get_int(...),parse_bool(...)andparse_int(...)#357 - Blob: implement the memory buffer interface #362
- New
clone_into(...)function #368 - Now
Indexcan be used alone, without a repository #372 - Add more options to
init_repository#347 - Support
Repository.workdir = ...and support setting detached headsRepository.head = <Oid>#377
Other:
- Fix again build with VS2008 #364
- Fix
Blob.diff(...)andBlob.diff_to_buffer(...)arguments passing #366 - Fail gracefully when compiling against the wrong version of libgit2 #365
- Several documentation improvements and updates #359 #375 #378
- A number of memory issues fixed #328 #348 #353 #355 #356
- Compatibility fixes for PyPy (#338), Visual Studio 2008 (#343) and Python 3.3 (#351)
- Make the sort mode parameter in
Repository.walk(...)optional #337 - New
Object.peel(...)#342 - New
Index.add_all(...)#344 - Introduce support for libgit2 options #350
- More informative repr for
Repositoryobjects #352 - Introduce support for credentials #354
- Several documentation fixes #302 #336
- Tests, remove temporary files #341
Repository:
- New
Repository.default_signature#310
Oid:
- New
str(Oid)deprecatesOid.hex#322
Object:
- New
Object.iddeprecatesObject.oid#322 - New
TreeEntry.iddeprecatesTreeEntry.oid#322 - New
Blob.diff(...)andBlob.diff_to_buffer(...)#307 - New
Commit.tree_idandCommit.parent_ids#73 #311 - New rich comparison between tree entries #305 #313
- Now
Tree.__contains__(key)supports paths #306 #316
Index:
- Now possible to create
IndexEntry(...)#325 - Now
IndexEntry.path,IndexEntry.oidandIndexEntry.modeare writable #325 - Now
Index.add(...)accepts anIndexEntrytoo #325 - Now
Index.write_tree(...)is able to write to a different repository #325 - Fix memory leak in
IndexEntry.pathsetter #335
Config:
Remote:
- New type
Refspec#314 - New
Remote.push_url#315 - New
Remote.add_pushandRemote.add_fetch#255 #318 - New
Remote.fetch_refspecsreplacesRemote.get_fetch_refspecs()andRemote.set_fetch_refspecs(...)#319 - New
Remote.push_refspecsreplacesRemote.get_push_refspecs()andRemote.set_push_refspecs(...)#319 - New
Remote.progress,Remote.transfer_progressandRemote.update_tips#274 #324 - New type
TransferProgress#274 #324 - Fix refcount leak in
Repository.remotes#321 #332
Other: #331
- New remote ref-specs API: #290
- New
Repository.reset(...): #292, #294 - Export
GIT_DIFF_MINIMAL: #293 - New
Repository.merge(...): #295 - Fix
Repository.blameargument handling: #297 - Fix build error on Windows: #298
- Fix typo in the README file, Blog → Blob: #301
- Now
Diff.patchreturnsNoneif no patch: #232, #303 - New
Walker.simplify_first_parent(): #304
- Upgrade to libgit2 v0.20.0: #288
- New
Repository.head_is_unbornreplacesRepository.head_is_orphaned - Changed
pygit2.clone_repository(...). Droppush_url,fetch_specandpush_specparameters. Addignore_cert_errors. - New
Patch.additionsandPatch.deletions: #275 - New
Patch.is_binary: #276 - New
Reference.log_append(...): #277 - New
Blob.is_binary: #278 - New
len(Diff)shows the number of patches: #281 - Rewrite
Repository.status(): #283 - New
Reference.shorthand: #284 - New
Repository.blame(...): #285 - Now
Repository.listall_references()andRepository.listall_branches()return a list, not a tuple: #289