diff options
author | Carlos Martín Nieto <cmn@dwim.me> | 2013-03-02 19:31:03 +0100 |
---|---|---|
committer | Carlos Martín Nieto <cmn@dwim.me> | 2013-05-11 11:20:37 +0200 |
commit | 4def7035cac133607256fd91352ce54ac4548a7c (patch) | |
tree | 6956733c0ef644f9f2a6bea1e603e3fcb72fd954 /include | |
parent | b641c00eebb3c60e8719c0dfc55dde91ca30a5d2 (diff) | |
download | libgit2-4def7035cac133607256fd91352ce54ac4548a7c.tar.gz |
refs: introduce an iterator
This allows us to get a list of reference names in a loop instead of callbacks.
Diffstat (limited to 'include')
-rw-r--r-- | include/git2/refs.h | 25 | ||||
-rw-r--r-- | include/git2/sys/refdb_backend.h | 35 | ||||
-rw-r--r-- | include/git2/types.h | 4 |
3 files changed, 64 insertions, 0 deletions
diff --git a/include/git2/refs.h b/include/git2/refs.h index e1d425352..48ecc96e0 100644 --- a/include/git2/refs.h +++ b/include/git2/refs.h @@ -347,6 +347,31 @@ GIT_EXTERN(void) git_reference_free(git_reference *ref); GIT_EXTERN(int) git_reference_cmp(git_reference *ref1, git_reference *ref2); /** + * Create an iterator for the repo's references + * + * @param out pointer in which to store the iterator + * @param repo the repository + * @return 0 or an error code + */ +GIT_EXTERN(int) git_reference_iterator_new(git_reference_iterator **out, git_repository *repo); + +/** + * Get the next reference name + * + * @param out pointer in which to store the string + * @param iter the iterator + * @param 0, GIT_ITEROVER if there are no more; or an error code + */ +GIT_EXTERN(int) git_reference_next(const char **out, git_reference_iterator *iter); + +/** + * Free the iterator and its associated resources + * + * @param iter the iterator to free + */ +GIT_EXTERN(void) git_reference_iterator_free(git_reference_iterator *iter); + +/** * Perform a callback on each reference in the repository whose name * matches the given pattern. * diff --git a/include/git2/sys/refdb_backend.h b/include/git2/sys/refdb_backend.h index d5f599fec..4c882b5cd 100644 --- a/include/git2/sys/refdb_backend.h +++ b/include/git2/sys/refdb_backend.h @@ -20,6 +20,22 @@ */ GIT_BEGIN_DECL + +/** + * Every backend's iterator must have a pointer to itself as the first + * element, so the API can talk to it. You'd define your iterator as + * + * struct my_iterator { + * git_reference_iterator parent; + * ... + * } + * + * and assing `iter->parent.backend` to your `git_refdb_backend`. + */ +struct git_reference_iterator { + git_refdb_backend *backend; +}; + /** An instance for a custom backend */ struct git_refdb_backend { unsigned int version; @@ -66,6 +82,25 @@ struct git_refdb_backend { void *payload); /** + * Allocate an iterator object for the backend + */ + int (*iterator)( + git_reference_iterator **iter, + struct git_refdb_backend *backend); + + /** + * Return the current value and advance the iterator. + */ + int (*next)( + const char **name, + git_reference_iterator *iter); + + /** + * Free the iterator + */ + void (*iterator_free)( + git_reference_iterator *iter); + /* * Writes the given reference to the refdb. A refdb implementation * must provide this function. */ diff --git a/include/git2/types.h b/include/git2/types.h index aca9ed927..43751d3b0 100644 --- a/include/git2/types.h +++ b/include/git2/types.h @@ -165,6 +165,10 @@ typedef struct git_signature { /** In-memory representation of a reference. */ typedef struct git_reference git_reference; +/** Iterator for references */ +typedef struct git_reference_iterator git_reference_iterator; + + /** Basic type of any Git reference. */ typedef enum { GIT_REF_INVALID = 0, /** Invalid reference */ |