summaryrefslogtreecommitdiff
path: root/src/refs.c
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@microsoft.com>2013-05-11 02:42:49 -0700
committerEdward Thomson <ethomson@microsoft.com>2013-05-11 02:42:49 -0700
commitb6cc559a78a073f2aadd179fe40c09be7318c898 (patch)
treec40a7806c16eb133794427aa2e1ca25e86ce1d74 /src/refs.c
parent4a65aead2ce2003902f4b54b331af33af7340b58 (diff)
parentc58cac12c24fbb127cf1928bec20decb007a75e8 (diff)
downloadlibgit2-b6cc559a78a073f2aadd179fe40c09be7318c898.tar.gz
Merge pull request #1385 from carlosmn/refs-iter
Introduce a refs iterator
Diffstat (limited to 'src/refs.c')
-rw-r--r--src/refs.c84
1 files changed, 69 insertions, 15 deletions
diff --git a/src/refs.c b/src/refs.c
index 684c54cd1..9c6c5c623 100644
--- a/src/refs.c
+++ b/src/refs.c
@@ -139,7 +139,7 @@ static int reference_path_available(
data.available = 1;
error = git_reference_foreach(
- repo, GIT_REF_LISTALL, _reference_available_cb, (void *)&data);
+ repo, _reference_available_cb, (void *)&data);
if (error < 0)
return error;
@@ -619,14 +619,59 @@ int git_reference_resolve(git_reference **ref_out, const git_reference *ref)
int git_reference_foreach(
git_repository *repo,
- unsigned int list_flags,
git_reference_foreach_cb callback,
void *payload)
{
+ git_reference_iterator *iter;
+ const char *name;
+ int error;
+
+ if (git_reference_iterator_new(&iter, repo) < 0)
+ return -1;
+
+ while ((error = git_reference_next(&name, iter)) == 0) {
+ if (callback(name, payload)) {
+ error = GIT_EUSER;
+ goto out;
+ }
+ }
+
+ if (error == GIT_ITEROVER)
+ error = 0;
+
+out:
+ git_reference_iterator_free(iter);
+ return error;
+}
+
+int git_reference_iterator_new(git_reference_iterator **out, git_repository *repo)
+{
+ git_refdb *refdb;
+
+ if (git_repository_refdb__weakptr(&refdb, repo) < 0)
+ return -1;
+
+ return git_refdb_iterator(out, refdb);
+}
+
+int git_reference_iterator_glob_new(git_reference_iterator **out, git_repository *repo, const char *glob)
+{
git_refdb *refdb;
- git_repository_refdb__weakptr(&refdb, repo);
- return git_refdb_foreach(refdb, list_flags, callback, payload);
+ if (git_repository_refdb__weakptr(&refdb, repo) < 0)
+ return -1;
+
+ return git_refdb_iterator_glob(out, refdb, glob);
+}
+
+int git_reference_next(const char **out, git_reference_iterator *iter)
+{
+ return git_refdb_next(out, iter);
+}
+
+void git_reference_iterator_free(git_reference_iterator *iter)
+{
+ git_refdb_iterator_free(iter);
}
static int cb__reflist_add(const char *ref, void *data)
@@ -636,8 +681,7 @@ static int cb__reflist_add(const char *ref, void *data)
int git_reference_list(
git_strarray *array,
- git_repository *repo,
- unsigned int list_flags)
+ git_repository *repo)
{
git_vector ref_list;
@@ -650,7 +694,7 @@ int git_reference_list(
return -1;
if (git_reference_foreach(
- repo, list_flags, &cb__reflist_add, (void *)&ref_list) < 0) {
+ repo, &cb__reflist_add, (void *)&ref_list) < 0) {
git_vector_free(&ref_list);
return -1;
}
@@ -950,19 +994,29 @@ int git_reference__update_terminal(
int git_reference_foreach_glob(
git_repository *repo,
const char *glob,
- unsigned int list_flags,
- int (*callback)(
- const char *reference_name,
- void *payload),
+ git_reference_foreach_cb callback,
void *payload)
{
- git_refdb *refdb;
+ git_reference_iterator *iter;
+ const char *name;
+ int error;
- assert(repo && glob && callback);
+ if (git_reference_iterator_glob_new(&iter, repo, glob) < 0)
+ return -1;
- git_repository_refdb__weakptr(&refdb, repo);
+ while ((error = git_reference_next(&name, iter)) == 0) {
+ if (callback(name, payload)) {
+ error = GIT_EUSER;
+ goto out;
+ }
+ }
- return git_refdb_foreach_glob(refdb, glob, list_flags, callback, payload);
+ if (error == GIT_ITEROVER)
+ error = 0;
+
+out:
+ git_reference_iterator_free(iter);
+ return error;
}
int git_reference_has_log(