summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarlos Martín Nieto <cmn@dwim.me>2014-02-01 15:29:16 +0100
committerCarlos Martín Nieto <cmn@dwim.me>2014-02-05 12:16:44 +0100
commitaf81720236f05f72cfe763208143b5dacb2f99a2 (patch)
treeee17105a7d2357a6e40832ff6348d70314f70509 /src
parentd465e4e980333b3e7437801fc375b595fb3adf1f (diff)
downloadlibgit2-af81720236f05f72cfe763208143b5dacb2f99a2.tar.gz
revwalk: remove usage of foreach
Diffstat (limited to 'src')
-rw-r--r--src/revwalk.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/src/revwalk.c b/src/revwalk.c
index 63d78fe64..628057fcd 100644
--- a/src/revwalk.c
+++ b/src/revwalk.c
@@ -180,17 +180,12 @@ struct push_cb_data {
int hide;
};
-static int push_glob_cb(const char *refname, void *data_)
-{
- struct push_cb_data *data = (struct push_cb_data *)data_;
- return push_ref(data->walk, refname, data->hide, true);
-}
-
static int push_glob(git_revwalk *walk, const char *glob, int hide)
{
int error = 0;
git_buf buf = GIT_BUF_INIT;
- struct push_cb_data data;
+ git_reference *ref;
+ git_reference_iterator *iter;
size_t wildcard;
assert(walk && glob);
@@ -208,12 +203,20 @@ static int push_glob(git_revwalk *walk, const char *glob, int hide)
if (!glob[wildcard])
git_buf_put(&buf, "/*", 2);
- data.walk = walk;
- data.hide = hide;
+ if ((error = git_reference_iterator_glob_new(&iter, walk->repo, buf.ptr)) < 0)
+ goto out;
- error = git_reference_foreach_glob(
- walk->repo, git_buf_cstr(&buf), push_glob_cb, &data);
+ while ((error = git_reference_next(&ref, iter)) == 0) {
+ error = push_ref(walk, git_reference_name(ref), hide, true);
+ git_reference_free(ref);
+ if (error < 0)
+ break;
+ }
+ git_reference_iterator_free(iter);
+ if (error == GIT_ITEROVER)
+ error = 0;
+out:
git_buf_free(&buf);
return error;
}