summaryrefslogtreecommitdiff
path: root/builtin/for-each-ref.c
diff options
context:
space:
mode:
authorKarthik Nayak <karthik.188@gmail.com>2015-06-13 19:37:28 (GMT)
committerJunio C Hamano <gitster@pobox.com>2015-08-03 17:24:07 (GMT)
commit14de7fba3462aa8051bc63260fc6407aa51b8f68 (patch)
tree79e98f99403fa32307c567bbf6ebb1ad55df5736 /builtin/for-each-ref.c
parentc95b758587021a0ee1a27836e7d4ce3f7d634f36 (diff)
downloadgit-14de7fba3462aa8051bc63260fc6407aa51b8f68.zip
git-14de7fba3462aa8051bc63260fc6407aa51b8f68.tar.gz
git-14de7fba3462aa8051bc63260fc6407aa51b8f68.tar.bz2
for-each-ref: introduce filter_refs()
Introduce filter_refs() which will act as an API for filtering a set of refs. Based on the type of refs the user has requested, we iterate through those refs and apply filters as per the given ref_filter structure and finally store the filtered refs in the ref_array structure. Currently this will wrap around ref_filter_handler(). Hence, ref_filter_handler is made file scope static. As users of this API will no longer send a ref_filter_cbdata structure directly, we make the elements of ref_filter_cbdata pointers. We can now use the information given by the users to obtain our own ref_filter_cbdata structure. Changes are made to support the change in ref_filter_cbdata structure. Make 'for-each-ref' use this API. Helped-by: Junio C Hamano <gitster@pobox.com> Mentored-by: Christian Couder <christian.couder@gmail.com> Mentored-by: Matthieu Moy <matthieu.moy@grenoble-inp.fr> Signed-off-by: Karthik Nayak <karthik.188@gmail.com> Reviewed-by: Matthieu Moy <Matthieu.Moy@imag.fr> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin/for-each-ref.c')
-rw-r--r--builtin/for-each-ref.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c
index 637fc4a..7919206 100644
--- a/builtin/for-each-ref.c
+++ b/builtin/for-each-ref.c
@@ -16,7 +16,8 @@ int cmd_for_each_ref(int argc, const char **argv, const char *prefix)
const char *format = "%(objectname) %(objecttype)\t%(refname)";
struct ref_sorting *sorting = NULL, **sorting_tail = &sorting;
int maxcount = 0, quote_style = 0;
- struct ref_filter_cbdata ref_cbdata;
+ struct ref_array array;
+ struct ref_filter filter;
struct option opts[] = {
OPT_BIT('s', "shell", &quote_style,
@@ -54,16 +55,16 @@ int cmd_for_each_ref(int argc, const char **argv, const char *prefix)
/* for warn_ambiguous_refs */
git_config(git_default_config, NULL);
- memset(&ref_cbdata, 0, sizeof(ref_cbdata));
- ref_cbdata.filter.name_patterns = argv;
- for_each_rawref(ref_filter_handler, &ref_cbdata);
+ memset(&array, 0, sizeof(array));
+ memset(&filter, 0, sizeof(filter));
+ filter.name_patterns = argv;
+ filter_refs(&array, &filter, FILTER_REFS_ALL | FILTER_REFS_INCLUDE_BROKEN);
+ ref_array_sort(sorting, &array);
- ref_array_sort(sorting, &ref_cbdata.array);
-
- if (!maxcount || ref_cbdata.array.nr < maxcount)
- maxcount = ref_cbdata.array.nr;
+ if (!maxcount || array.nr < maxcount)
+ maxcount = array.nr;
for (i = 0; i < maxcount; i++)
- show_ref_array_item(ref_cbdata.array.items[i], format, quote_style);
- ref_array_clear(&ref_cbdata.array);
+ show_ref_array_item(array.items[i], format, quote_style);
+ ref_array_clear(&array);
return 0;
}