diff options
author | Karthik Nayak <karthik.188@gmail.com> | 2015-06-14 01:07:28 +0530 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2015-08-03 10:24:07 -0700 |
commit | 14de7fba3462aa8051bc63260fc6407aa51b8f68 (patch) | |
tree | 79e98f99403fa32307c567bbf6ebb1ad55df5736 /ref-filter.c | |
parent | ref-filter: move code from 'for-each-ref' (diff) | |
download | tgif-14de7fba3462aa8051bc63260fc6407aa51b8f68.tar.xz |
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 'ref-filter.c')
-rw-r--r-- | ref-filter.c | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/ref-filter.c b/ref-filter.c index cfc0e8a892..7b39303810 100644 --- a/ref-filter.c +++ b/ref-filter.c @@ -859,10 +859,10 @@ static struct ref_array_item *new_ref_array_item(const char *refname, * A call-back given to for_each_ref(). Filter refs and keep them for * later object processing. */ -int ref_filter_handler(const char *refname, const struct object_id *oid, int flag, void *cb_data) +static int ref_filter_handler(const char *refname, const struct object_id *oid, int flag, void *cb_data) { struct ref_filter_cbdata *ref_cbdata = cb_data; - struct ref_filter *filter = &ref_cbdata->filter; + struct ref_filter *filter = ref_cbdata->filter; struct ref_array_item *ref; if (flag & REF_BAD_NAME) { @@ -880,8 +880,8 @@ int ref_filter_handler(const char *refname, const struct object_id *oid, int fla */ ref = new_ref_array_item(refname, oid->hash, flag); - REALLOC_ARRAY(ref_cbdata->array.items, ref_cbdata->array.nr + 1); - ref_cbdata->array.items[ref_cbdata->array.nr++] = ref; + REALLOC_ARRAY(ref_cbdata->array->items, ref_cbdata->array->nr + 1); + ref_cbdata->array->items[ref_cbdata->array->nr++] = ref; return 0; } @@ -905,6 +905,28 @@ void ref_array_clear(struct ref_array *array) array->nr = array->alloc = 0; } +/* + * 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. + */ +int filter_refs(struct ref_array *array, struct ref_filter *filter, unsigned int type) +{ + struct ref_filter_cbdata ref_cbdata; + + ref_cbdata.array = array; + ref_cbdata.filter = filter; + + if (type & (FILTER_REFS_ALL | FILTER_REFS_INCLUDE_BROKEN)) + return for_each_rawref(ref_filter_handler, &ref_cbdata); + else if (type & FILTER_REFS_ALL) + return for_each_ref(ref_filter_handler, &ref_cbdata); + else + die("filter_refs: invalid type"); + return 0; +} + static int cmp_ref_sorting(struct ref_sorting *s, struct ref_array_item *a, struct ref_array_item *b) { struct atom_value *va, *vb; |