From 4def7035cac133607256fd91352ce54ac4548a7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Sat, 2 Mar 2013 19:31:03 +0100 Subject: refs: introduce an iterator This allows us to get a list of reference names in a loop instead of callbacks. --- src/refs.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'src/refs.c') diff --git a/src/refs.c b/src/refs.c index b85a2e828..547bd570c 100644 --- a/src/refs.c +++ b/src/refs.c @@ -568,6 +568,26 @@ int git_reference_foreach( return git_refdb_foreach(refdb, list_flags, callback, payload); } +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_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) { return git_vector_insert((git_vector *)data, git__strdup(ref)); -- cgit v1.2.1 From 95727245fd4f08aa77d1077901976ab3bd7472e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Sat, 4 May 2013 16:03:17 +0200 Subject: refs: implement _foreach with the iterator --- src/refs.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) (limited to 'src/refs.c') diff --git a/src/refs.c b/src/refs.c index 547bd570c..4ee6235cf 100644 --- a/src/refs.c +++ b/src/refs.c @@ -562,10 +562,28 @@ int git_reference_foreach( git_reference_foreach_cb callback, void *payload) { - git_refdb *refdb; - git_repository_refdb__weakptr(&refdb, repo); + git_reference_iterator *iter; + const char *name; + int error; + + GIT_UNUSED(list_flags); + + if (git_reference_iterator_new(&iter, repo) < 0) + return -1; - return git_refdb_foreach(refdb, list_flags, callback, payload); + 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) -- cgit v1.2.1 From 2b562c3a1edf0f521bdb7adf23e524d5a8389b15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Sat, 4 May 2013 16:32:58 +0200 Subject: refs: remove the OID/SYMBOLIC filtering Nobody should ever be using anything other than ALL at this level, so remove the option altogether. As part of this, git_reference_foreach_glob is now implemented in the frontend using an iterator. Backends will later regain the ability of doing the glob filtering in the backend. --- src/refs.c | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) (limited to 'src/refs.c') diff --git a/src/refs.c b/src/refs.c index 4ee6235cf..a7be117ad 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; @@ -558,7 +558,6 @@ 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) { @@ -566,8 +565,6 @@ int git_reference_foreach( const char *name; int error; - GIT_UNUSED(list_flags); - if (git_reference_iterator_new(&iter, repo) < 0) return -1; @@ -613,8 +610,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; @@ -627,7 +623,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; } @@ -925,19 +921,32 @@ 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; + + if (git_reference_iterator_new(&iter, repo) < 0) + return -1; + + while ((error = git_reference_next(&name, iter)) == 0) { + if (p_fnmatch(glob, name, 0)) + continue; - assert(repo && glob && callback); + if (callback(name, payload)) { + error = GIT_EUSER; + goto out; + } + } - git_repository_refdb__weakptr(&refdb, repo); + if (error == GIT_ITEROVER) + error = 0; - return git_refdb_foreach_glob(refdb, glob, list_flags, callback, payload); +out: + git_reference_iterator_free(iter); + return error; } int git_reference_has_log( -- cgit v1.2.1 From c58cac12c24fbb127cf1928bec20decb007a75e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Sat, 4 May 2013 18:06:14 +0200 Subject: Introduce a glob-filtering iterator If the backend doesn't provide support for it, the matching is done in refdb on top of a normal iterator. --- src/refs.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'src/refs.c') diff --git a/src/refs.c b/src/refs.c index a7be117ad..fc6652fec 100644 --- a/src/refs.c +++ b/src/refs.c @@ -593,6 +593,16 @@ int git_reference_iterator_new(git_reference_iterator **out, git_repository *rep 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; + + 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); @@ -928,13 +938,10 @@ int git_reference_foreach_glob( const char *name; int error; - if (git_reference_iterator_new(&iter, repo) < 0) + if (git_reference_iterator_glob_new(&iter, repo, glob) < 0) return -1; while ((error = git_reference_next(&name, iter)) == 0) { - if (p_fnmatch(glob, name, 0)) - continue; - if (callback(name, payload)) { error = GIT_EUSER; goto out; -- cgit v1.2.1