- Fix a number of reference leaks
- Review custom object backends
Breaking changes:
- In custom backends the callbacks have been renamed from
read
toread_cb
,write
towrite_cb
, and so on.
- New optional
proxy
argument inRemote
methods #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.sh
script
Breaking changes:
- Remove deprecated
GIT_CREDTYPE_XXX
contants, useGIT_CREDENTIAL_XXX
instead. - Remove deprecated
Patch.patch
getter, usePatch.text
instead.
- New
PackBuilder
class andRepository.pack(...)
#1048 - New
Config.delete_multivar(...)
#1056 - New
Repository.is_shallow
#1058 - New optional
message
argument 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(...)
raiseTypeError
instead ofAttributeError
when arguments are of unexpected type
- Upgrade to libgit2 1.1, new
GIT_BLAME_IGNORE_WHITESPACE
constant #1040 - Add wheels for Python 3.9 #1038
- Drop support for PyPy3 7.2
- New optional
flags
argument 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
flags
andfile_flags
arguments inRepository.merge_commits
andRepository.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_PARENT
andGIT_BLAME_USE_MAILMAP
constants #1031 - New
IndexEntry
supportsrepr()
,str()
,==
and!=
#1009 - New
Object
supportsrepr()
#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_prunable
commit fed0c19c - Unit tests #800 #1015
- Documentation #705
- Fix segfault in
Object.raw_name
when 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_XXX
contants, useGIT_CREDENTIAL_XXX
instead.
- 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
index
optional 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.patchid
getter #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
_pygit2
topygit2._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.odb
returns newOdb
type instance. And newOdbBackend
type. #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
odb
for object database:# Before repository.read(...) repository.write(...) # Now repository.odb.read(...) repository.odb.write(...)
Now
Tree[x]
returns aObject
instance instead of aTreeEntry
;Object.type
returns an integer whileTreeEntry.type
returned a string:# Before if tree[x].type == 'tree': # Now if tree[x].type == GIT_OBJ_TREE: if tree[x].type_str == 'tree':
Renamed
TreeEntry._name
toObject.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.data
returns the raw contents of the patch as a byte string #790 #893 - New
Patch.text
returns the contents of the patch as a text string, deprecates Patch.patch #790 #893
Deprecations:
Patch.patch
is deprecated, usePatch.text
instead
- 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.path
returns the path to the worktree directory, not to the .git file within #803 - Remove undocumented
worktree.git_path
#803
- New
pygit2.LIBGIT2_VER
tuple #845 #848 - New objects now support (in)equality comparison and hash #852 #853
- New references now support (in)equality comparison #860 #862
- New
paths
optional 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
AlreadyExistsError
andInvalidSpecError
#828 #829 - New
Reference.raw_name
,Reference.raw_shorthand
,Tag.raw_name
,Tag.raw_message
andDiffFile.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_of
andRepository.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_repository
returnsNone
if 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
ConfigEntry
objects #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
callbacks
inRepository.update_submodules(...)
#763 - New
KeypairFromMemory
credentials #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
prune
inRemote.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_drop
andstash_pop
#695 - Improved support for submodules: new repository methods
init_submodules
andupdate_submodules
#692 - New friendlier API for branches & references:
Repository.branches
andRepository.references
#700 #701 - New support for custom backends #690
- Fix
init_repository
crash 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
Signature
default encoding, UTF-8 now #581 - Fixing
pip install pygit2
, should install cffi first - Unit tests, fix binary diff test #586
- Document that
Diff.patch
can 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(...)
returnsNone
if 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.ident
Some 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.DiffFile
andpygit.DiffLine
API 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.lines
is now a list ofDiffLine
objects, not tuples
New features:
- New
Repository.expand_id(...)
andRepository.ahead_behind(...)
#448 - New
prefix
parameter 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.diff
supports diffing two blobs #508 - New optional
fetch
parameter inRemote.create
#526 - New
pygit2.DiffStats
#406 #525 - New
Repository.get_attr(...)
#528 - New
level
optional 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_archive
fix 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.features
andpygit2.GIT_FEATURE_*
) #475 - New
Repository.remotes
(RemoteCollection
) #447
API Changes:
- Prototype of
clone_repository
changed, check documentation - Removed
clone_into
, useclone_repository
with 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_old
andRefLogEntry.oid_new
to beOid
objects instead of strings #449
Other:
- Fix
init_repository
when passing optional parametersworkdir_path
,description
,template_path
,initial_head
ororigin_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(...)
returnsOid
instead of string #413 - New
Reference.set_target(...)
replaces theReference.target
setter andReference.log_append(...)
#414 - New
Repository.set_head(...)
replaces theRepository.head
setter #414 Repository.merge(...)
now uses theSAFE_CREATE
strategy 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 pygit2
installs cffi first #380 #407 - Add support for PyPy3 #422
- Documentation improvements #398 #409
- Fix regression with Python 2,
IndexEntry.path
returns str (bytes in Python 2 and unicode in Python 3) - Get back
IndexEntry.oid
for backwards compatibility - Config, iterate over the keys (instead of the key/value pairs) #395
Diff.find_similar
supports 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_index
andcheckout_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
oid
byid
through the API to follow libgit2 conventions. - Merge API overhaul following changes in libgit2.
- New
Remote.rename(...)
replacesRemote.name = ...
- Now
Remote.fetch()
returns aTransferProgress
object. - Now
Config.get_multivar(...)
returns an iterator instead of a list.
New features:
- New
Config.snapshot()
andRepository.config_snapshot()
- New
Config
methods:get_bool(...)
,get_int(...)
,parse_bool(...)
andparse_int(...)
#357 - Blob: implement the memory buffer interface #362
- New
clone_into(...)
function #368 - Now
Index
can 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
Repository
objects #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.id
deprecatesObject.oid
#322 - New
TreeEntry.id
deprecatesTreeEntry.oid
#322 - New
Blob.diff(...)
andBlob.diff_to_buffer(...)
#307 - New
Commit.tree_id
andCommit.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.oid
andIndexEntry.mode
are writable #325 - Now
Index.add(...)
accepts anIndexEntry
too #325 - Now
Index.write_tree(...)
is able to write to a different repository #325 - Fix memory leak in
IndexEntry.path
setter #335
Config:
Remote:
- New type
Refspec
#314 - New
Remote.push_url
#315 - New
Remote.add_push
andRemote.add_fetch
#255 #318 - New
Remote.fetch_refspecs
replacesRemote.get_fetch_refspecs()
andRemote.set_fetch_refspecs(...)
#319 - New
Remote.push_refspecs
replacesRemote.get_push_refspecs()
andRemote.set_push_refspecs(...)
#319 - New
Remote.progress
,Remote.transfer_progress
andRemote.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.blame
argument handling: #297 - Fix build error on Windows: #298
- Fix typo in the README file, Blog → Blob: #301
- Now
Diff.patch
returnsNone
if no patch: #232, #303 - New
Walker.simplify_first_parent()
: #304
- Upgrade to libgit2 v0.20.0: #288
- New
Repository.head_is_unborn
replacesRepository.head_is_orphaned
- Changed
pygit2.clone_repository(...)
. Droppush_url
,fetch_spec
andpush_spec
parameters. Addignore_cert_errors
. - New
Patch.additions
andPatch.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