So far libgit2 didn't support reference logs (reflog). Add a new
git_reflog_* API for basic reading and writing of reflogs:
* git_reflog_read
* git_reflog_write
* git_reflog_free
Signed-off-by: schu <schu-github@schulog.org>
It removes all entries with equal path except last added.
On large indexes git_index_append() + git_index_uniq() before writing is
*much* faster, than git_index_add().
Signed-off-by: Kirill A. Shutemov <kirill@shutemov.name>
A bunch of redundant methods have been removed from the external API.
- All the reference/tag creation methods with `_f` are gone. The force
flag is now passed as an argument to the normal create methods.
- All the different commit creation methods are gone; commit creation
now always requires a `git_commit` pointer for parents and a `git_tree`
pointer for tree, to ensure that corrupted commits cannot be generated.
- All the different tag creation methods are gone; tag creation now
always requires a `git_object` pointer to ensure that tags are not
created to inexisting objects.
Remove the unused repo and private pointers and make the direction a
flag, as it can only have two states. Change the connect signature to
use an int instead of git_net_direction and remove that enum.
Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>
Rather than an 'private' pointer, make the private structures inherit
from the generic git_transport struct. This way, we only have to worry
about one memory allocation instead of two. The structures are so
simple that this may even make the code use less memory overall.
Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>
This makes it easier to send a requqest for an URL. It assumes there
is a socket where the string should go out to.
Make git_pkt_gen_proto accept a command parameter, which defaults to
git-upload-pack
Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>
Add a parameter to git_pkt_parse_line to tell it how much data you
have in your buffer. If the buffer is too short, it returns an error
saying so. Adapt the git transport to use this and fix the offset
calculation.
Add the GIT_ESHORTBUFFER error code.
This are the types I intend to use for pkt-line parsing and (later)
creation. git_pkt serves as a base pointer type and once you know what
type it is you can use the real one (command, tip list, etc.)
Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>
If the strings match, git__fnmatch returns GIT_SUCCESS and
GIT_ENOMATCH on failure to match.
MSVC fixes: Added a test for _MSC_VER and (in that case) defined
HAVE_STRING_H to 1 so it doesn't try to include <strings.h> which
doesn't exist in the MSVC world. Moved the function declarations to
use the modern inline ones so MSVC doesn't have a fit. Added casts
everywhere so MSVC doesn't crap its pants.
Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>
Move them to their own functions to avoid duplication and to make it
easier to ignore missing configuration.
Not finding 'fetch' is considered fatal, though this might not be
correct behaviour (push-only remotes?)
Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>
On this rascalicious minor release of libgit2:
- We've dropped support for Waf. All the build process is now managed
through CMake for all platforms.
- We've removed the custom backends from the repository. You can now
find a collection of Custom backends on their own repo, under the
libgit2 org. Including MySQL and Memcache backends, courtesy of the
beardful Brian Lopez.
- We are rocking a new documentation system, Docurium, courtesy of the
insightful Scott Chacon. Check out the details for each single method
in our external API and the way they've evolved through the history
of the library:
http://libgit2.github.com/libgit2/
This will certainly come in handy if you are developing bindings for
the library.
- You can now check the linked version of the library from your
application or bindings, using `git_libgit2_version`.
- We have a gazillion new features, courtesy of our invaluable
collaborators, including:
* Support for Config files!
* Support for prefix-only reads on the ODB
* Repository discovery
* Support for the Unmerged Entries index extension
* Better Windows support
* 30.000 bug fixes (actual number may be lower)
Thanks as always to everyone who makes this project possible.
Here's the full list of all external API changes:
- git_index_open_bare
- git_index_open_inrepo
- git_odb_backend_sqlite
- git_oid_mkraw
- git_oid_mkstr
- git_reference_listcb
- git_repository_workdir
= git_index_get
= git_repository_path
= git_tree_entry_byindex
+ git_blob_lookup_prefix
+ git_commit_lookup_prefix
+ git_config_add_file
+ git_config_add_file_ondisk
+ git_config_file__ondisk
+ git_config_find_global
+ git_config_foreach
+ git_config_free
+ git_config_get_bool
+ git_config_get_int
+ git_config_get_long
+ git_config_get_string
+ git_config_new
+ git_config_open_global
+ git_config_open_ondisk
+ git_config_set_bool
+ git_config_set_int
+ git_config_set_long
+ git_config_set_string
+ git_index_entry_stage
+ git_index_entrycount_unmerged
+ git_index_get_unmerged_byindex
+ git_index_get_unmerged_bypath
+ git_index_open
+ git_object_lookup_prefix
+ git_odb_read_prefix
+ git_oid_fromraw
+ git_oid_fromstr
+ git_oid_ncmp
+ git_reference_foreach
+ git_repository_config
+ git_repository_discover
+ git_repository_is_bare
+ git_tag_lookup_prefix
+ git_tree_entry_type
+ git_tree_lookup_prefix
This function puts the global and repository configurations in one
git_config object and gives it to the user.
Signed-off-by: Carlos Martín Nieto <cmn@elego.de>
It's not clear how git_config and git_config_file relate to one
another. Be more explicit about their relationship in the function
documentation.
Signed-off-by: Carlos Martín Nieto <cmn@elego.de>
As suggested by carlosmn, git_oid_ncmp would probably
be a better name than git_oid_match, for it does the same
as git_oid_cmp but only up to a certain amount of hex digits.
Feature Added: Search an unmerged entry by path (git_index_get_unmerged
renamed to git_index_get_unmerged_bypath) or by index (git_index_get_unmerged_byindex).
Implemented find_unique_short_oid for pack backend, based on git sha1 lookup method;
finding an object given its full oid is just a particular case of searching
the unique object matching an oid prefix (short oid).
Added git_odb_read_unique_short_oid, which iterates over all the backends to
find and read the unique object matching the given oid prefix.
Added a git_object_lookup_short_oid method to find the unique object in
the repository matching a given oid prefix : it generalizes git_object_lookup
which now does nothing but calls git_object_lookup_short_oid.
"git_config_backend" have been renamed to "git_config_file", which
implements a generic interface to access a configuration file -- be it
either on disk, from a DB or whatever mumbojumbo.
I think this makes more sense.
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:
fa59f18d0d
* 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>
Configuration options can come from different sources. Currently,
there is only support for reading them from a flat file, but it might
make sense to read it from a database at some point.
Move the parsing code into src/config_file.c and create an include
file include/git2/config_backend.h to allow for other backends to be
developed.
Signed-off-by: Carlos Martín Nieto <cmn@elego.de>
The GIT_EXPORT macro is used to declare a function to be externally
accessible to other libraries. This commit uses GIT_EXPORT to declare
the git_lasterror() function as externally exported. I verified with
depends.exe that the function is available to external callers (i.e.
in the exports table of the PE file).
Ok, this is the real deal. Hopefully. Here's how it's going to work:
- One main method, called `git__throw`, that sets the error
code and error message when an error happens.
This method must be called in every single place where an error
code was being returned previously, setting an error message
instead.
Example, instead of:
return GIT_EOBJCORRUPTED;
Use:
return git__throw(GIT_EOBJCORRUPTED,
"The object is missing a finalizing line feed");
And instead of:
[...] {
error = GIT_EOBJCORRUPTED;
goto cleanup;
}
Use:
[...] {
error = git__throw(GIT_EOBJCORRUPTED, "What an error!");
goto cleanup;
}
The **only** exception to this are the allocation methods, which
return NULL on failure but already set the message manually.
/* only place where an error code can be returned directly,
because the error message has already been set by the wrapper */
if (foo == NULL)
return GIT_ENOMEM;
- One secondary method, called `git__rethrow`, which can be used to
fine-grain an error message and build an error stack.
Example, instead of:
if ((error = foobar(baz)) < GIT_SUCCESS)
return error;
You can now do:
if ((error = foobar(baz)) < GIT_SUCCESS)
return git__rethrow(error, "Failed to do a major operation");
The return of the `git_lasterror` method will be a string in the
shape of:
"Failed to do a major operation. (Failed to do an internal
operation)"
E.g.
"Failed to open the index. (Not enough permissions to access
'/path/to/index')."
NOTE: do not abuse this method. Try to write all `git__throw`
messages in a descriptive manner, to avoid having to rethrow them to
clarify their meaning.
This method should only be used in the places where the original
error message set by a subroutine is not specific enough.
It is encouraged to continue using this style as much possible to
enforce error propagation:
if ((error = foobar(baz)) < GIT_SUCCESS)
return error; /* `foobar` has set an error message, and
we are just propagating it */
The error handling revamp will take place in two phases:
- Phase 1: Replace all pieces of code that return direct error codes
with calls to `git__throw`. This can be done semi-automatically
using `ack` to locate all the error codes that must be replaced.
- Phase 2: Add some `git__rethrow` calls in those cases where the
original error messages are not specific enough.
Phase 1 is the main goal. A minor libgit2 release will be shipped once
Phase 1 is ready, and the work will start on gradually improving the
error handling mechanism by refining specific error messages.
OTHER NOTES:
- When writing error messages, please refrain from using weasel
words. They add verbosity to the message without giving any real
information. (<3 Emeric)
E.g.
"The reference file appears to be missing a carriage return"
Nope.
"The reference file is missing a carriage return"
Yes.
- When calling `git__throw`, please try to use more generic error
codes so we can eventually reduce the list of error codes to
something more reasonable. Feel free to add new, more generic error
codes if these are going to replace several of the old ones.
E.g.
return GIT_EREFCORRUPTED;
Can be turned into:
return git__throw(GIT_EOBJCORRUPTED,
"The reference is corrupted");