libgit2 v0.12.0 "absolutely no reason"

Hey, welcome to yet another minor libgit2 release. Sorry for the delay from
the last one. As you'll see the changelog is quite extensive -- hopefully from
now on we'll stick to more frequent minor releases.

Together with the usual bugfixes, here's a list of the new key features:

* Distfiles

	This version comes with proper distfiles as requested in #131. These are
	available in the Downloads section of the GitHub project.

* Error handling

	A new error handling API has been implemented that allows the library to
	return detailed error messages together with the generic error codes. We
	hope this will be a great when wrapping and integrating the library

	New external method to get the last detailed error message:

		+ git_lasterror(void)

	The old `git_strerror` still exists, but will be deprecated in the future
	as soon as every method in the library returns a valid error message.

	The task of writing error messages for every method is quite daunting.
	We appreciate pull requests with more error messages. Check the new error
	handling documentation in the following commit:

	https://github.com/libgit2/libgit2/commit/fa59f18d0ddbbb98d45e33934fb0efc3e2bf1557

* Redis backend

	We now have a Redis backend courtesy of Dmitry Kovega. Just like the
	SQLite backend, this allows the library to store Git objects in a Redis
	key-value store.

	The backend requires the `hiredis` library. Use `--with-redis` when
	building libgit2 to enable building the backend if `hiredis` is available.

* Commits

	New methods to access tree and parent data as a raw OID value
	instead of forcing a repository lookup

		+ git_commit_tree_oid(git_commit *commit)
		+ git_commit_parent_oid(git_commit *commit, unsigned int n)

* Index

	The `git_index_add` method has been split into 4 different calls
	which allow for appending and replacing in-memory entries and on-disk
	files to the index.

		+ git_index_add(git_index *index, const char *path, int stage)
		+ git_index_add2(git_index *index, const git_index_entry *source_entry)
		+ git_index_append(git_index *index, const char *path, int stage)
		+ git_index_append2(git_index *index, const git_index_entry *source_entry)

	Index entries can now also be efficiently removed from the index:

		+ git_index_remove(git_index *index, int position)

* References

	Methods to force the creation and renaming of references, even if those already
	exist on the repository.

		+ git_reference_create_symbolic_f(git_reference **ref_out, git_repository *repo,
				const char *name, const char *target)
		+ git_reference_create_oid_f(git_reference **ref_out, git_repository *repo,
				const char *name, const git_oid *id)
		+ git_reference_rename_f(git_reference *ref, const char *new_name)

* Repository

	New auxiliary methods with repository information

		+ git_repository_is_empty(git_repository *repo)
		+ git_repository_path(git_repository *repo)
		+ git_repository_workdir(git_repository *repo)

* Signatures

	New method to create a signature with the current date/time

		+ git_signature_now(const char *name, const char *email)

* Tags

	Several wrappers to automate tag creation.

		+ git_tag_create_frombuffer(git_oid *oid, git_repository *repo,
				const char *buffer)
		+ git_tag_create_f(git_oid *oid, git_repository *repo,
				const char *tag_name, const git_oid *target,
				git_otype target_type, const git_signature *tagger,
				const char *message);
		+ git_tag_create_fo(git_oid *oid, git_repository *repo,
				const char *tag_name, const git_object *target,
				const git_signature *tagger, const char *message)

	New functionality to delete and list tags in a repository without
	having to resort to the `references` API.

		+ git_tag_delete(git_repository *repo, const char *tag_name)

		+ git_tag_list(git_strarray *tag_names, git_repository *repo)

* Trees

	All instances of `git_tree_entry` are now returned and handled
	as constant, to remind the user that these opaque types are not
	supposed to be manually free'd.

	The `git_tree_entry_2object` method now takes a `git_repository`
	argument which defines in which repository the resolved object
	should be looked up. (It is expected to be the same repository
	that contains the parent `git_tree` for the entry).

		+ git_tree_entry_2object(git_object **object_out, git_repository *repo,
				const git_tree_entry *entry)

	New opaque type `git_treebuilder` with functionality to create and
	write trees on memory

		+ git_treebuilder_create(git_treebuilder **builder_p, const git_tree *source)
		+ git_treebuilder_clear(git_treebuilder *bld)
		+ git_treebuilder_free(git_treebuilder *bld)
		+ git_treebuilder_get(git_treebuilder *bld, const char *filename)
		+ git_treebuilder_insert(git_tree_entry **entry_out, git_treebuilder *bld,
				const char *filename, const git_oid *id, unsigned int attributes)
		+ git_treebuilder_remove(git_treebuilder *bld, const char *filename)
		+ git_treebuilder_filter(git_treebuilder *bld,
				int (*filter)(const git_tree_entry *, void *), void *payload)
		+ git_treebuilder_write(git_oid *oid, git_repository *repo, git_treebuilder *bld)

	New method to write an index file as a tree to the ODB.

		+ git_tree_create_fromindex(git_oid *oid, git_index *index)

Thanks to the usual guility parties that make this this happen, to
all the new contributors who are starting to submit pull requests, and
to the bindings developers who have to keep up with our shit.

Feedback and questions welcome on libgit2@librelist.org

Signed-off-by: Vicent Marti <tanoku@gmail.com>
1 file changed
tree: 6297a9f9e91274bfb6067454dd14778e91e79ec1
  1. deps/
  2. include/
  3. src/
  4. tests/
  5. .gitattributes
  6. .gitignore
  7. .HEADER
  8. api.doxygen
  9. CMakeLists.txt
  10. CONVENTIONS
  11. COPYING
  12. git.git-authors
  13. libgit2.pc.in
  14. README.md
  15. waf
  16. wscript
README.md

libgit2 - the Git linkable library

libgit2 is a portable, pure C implementation of the Git core methods provided as a re-entrant linkable library with a solid API, allowing you to write native speed custom Git applications in any language with bindings.

libgit2 is licensed under a very permissive license (GPLv2 with a special Linking Exception). This basically means that you can link it (unmodified) with any kind of software without having to release its source code.

What It Can Do

libgit2 is already very usable.

  • SHA conversions, formatting and shortening
  • object reading (loose and packed)
  • object writing (loose)
  • commit, tag, tree and blob parsing and write-back
  • tree traversal
  • revision walking
  • index file (staging area) manipulation
  • custom ODB backends
  • reference management (including packed references)
  • ...and more

Building libgit2 - External dependencies

libgit2 builds cleanly on most platforms without any external dependencies. Under Unix-like systems, like Linux, *BSD and Mac OS X, libgit2 expects pthreads to be available; they should be installed by default on all systems. Under Windows, libgit2 uses the native Windows API for threading.

Additionally, he following libraries may be used as replacement for built-in functionality:

libgit2 can be built using the SHA1 implementation of LibSSL-Crypto, instead of the built-in custom implementations. Performance wise, they are quite similar.

Building libgit2 - Using waf

Waf is a minimalist build system which only requires a Python 2.5+ interpreter to run. This is the default build system for libgit2.

To build libgit2 using waf, first configure the build system by running:

$ ./waf configure

Then build the library, either in its shared (libgit2.so) or static form (libgit2.a):

$ ./waf build-static
$ ./waf build-shared

You can then run the full test suite with:

$ ./waf test

And finally you can install the library with (you may need to sudo):

$ sudo ./waf install

The waf build system for libgit2 accepts the following flags:

--debug
	build the library with debug symbols.
	Defaults to off.

--sha1=[builtin|ppc|openssl]
	use the builtin SHA1 functions, the optimized PPC versions
	or the SHA1 functions from LibCrypto (OpenSSL).
	Defaults to 'builtin'.

--msvc=[7.1|8.0|9.0|10.0]
	Force a specific version of the MSVC compiler, if more than
	one version is installed.

--arch=[ia64|x64|x86|x86_amd64|x86_ia64]
	Force a specific architecture for compilers that support it.

--with-sqlite
	Enable sqlite support.

You can run ./waf --help to see a full list of install options and targets.

Building libgit2 - Using CMake

The libgit2 library can also be built using CMake 2.6+ (http://www.cmake.org) on all platforms.

On most systems you can build the library using the following commands

$ mkdir build && cd build
$ cmake ..
$ cmake --build .

Alternatively you can point the CMake GUI tool to the CMakeLists.txt file and generate platform specific build project or IDE workspace.

To install the library you can specify the install prefix by setting:

$ cmake .. -DCMAKE_INSTALL_PREFIX=/install/prefix
$ cmake --build . --target install

For more advanced use or questions about CMake please read http://www.cmake.org/Wiki/CMake_FAQ.

Language Bindings

Here are the bindings to libgit2 that are currently available:

If you start another language binding to libgit2, please let us know so we can add it to the list.

How Can I Contribute

Fork libgit2/libgit2 on GitHub, add your improvement, push it to a branch in your fork named for the topic, send a pull request.

You can also file bugs or feature requests under the libgit2 project on GitHub, or join us on the mailing list by sending an email to:

libgit2@librelist.com

License

libgit2 is under GPL2 with linking exemption. This means you can link to the library with any program, commercial, open source or other. However, you cannot modify libgit2 and distribute it without supplying the source.

See the COPYING file for the full license text.