git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[WIP/PATCH v5 09/10] for-each-ref: introduce filter_refs()

From
Karthik Nayak <karthik.188@gmail.com>
Date
Jun 6, 2015, 07:09 UTC
Message-ID
<1433574581-23980-9-git-send-email-karthik.188@gmail.com>
In-Reply-To
<1433574581-23980-1-git-send-email-karthik.188@gmail.com>

Introduce filter_refs() which will act as an API for users to call and provide a function which will iterate over a set of refs while filtering out the required refs.

Currently this will wrap around ref_filter_handler(). Hence, ref_filter_handler is made file scope static.

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>
---
 builtin/for-each-ref.c |  2 +-
 ref-filter.c           | 12 +++++++++++-
 ref-filter.h           |  8 ++++++--
 3 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c
index e237194..2a16947 100644
--- a/builtin/for-each-ref.c
+++ b/builtin/for-each-ref.c
@@ -56,7 +56,7 @@ int cmd_for_each_ref(int argc, const char **argv, const char *prefix)
 
 	memset(&ref_cbdata, 0, sizeof(ref_cbdata));
 	ref_cbdata.filter.name_patterns = argv;
-	for_each_rawref(ref_filter_handler, &ref_cbdata);
+	filter_refs(for_each_rawref, &ref_cbdata);
 
 	ref_array_sort(sort, &ref_cbdata.array);
 
diff --git a/ref-filter.c b/ref-filter.c
index 95e72f6..c32b86f 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -843,7 +843,7 @@ 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 unsigned char *sha1, int flag, void *cb_data)
+static int ref_filter_handler(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
 {
 	struct ref_filter_cbdata *ref_cbdata = cb_data;
 	struct ref_filter *filter = &ref_cbdata->filter;
@@ -889,6 +889,16 @@ void ref_array_clear(struct ref_array *array)
 	array->nr = array->alloc = 0;
 }
 
+/*
+ * API for filtering a set of refs. The refs are provided and iterated
+ * over using the for_each_ref_fn(). The refs are stored into and filtered
+ * based on the ref_filter_cbdata structure.
+ */
+int filter_refs(int (for_each_ref_fn)(each_ref_fn, void *), struct ref_filter_cbdata *data)
+{
+	return for_each_ref_fn(ref_filter_handler, data);
+}
+
 static int cmp_ref_sorting(struct ref_sorting *s, struct ref_array_item *a, struct ref_array_item *b)
 {
 	struct atom_value *va, *vb;
diff --git a/ref-filter.h b/ref-filter.h
index 1432ff6..15e6766 100644
--- a/ref-filter.h
+++ b/ref-filter.h
@@ -46,8 +46,12 @@ struct ref_filter_cbdata {
 	struct ref_filter filter;
 };
 
-/*  Callback function for for_each_*ref(). This filters the refs based on the filters set */
-int ref_filter_handler(const char *refname, const unsigned char *sha1, int flag, void *cb_data);
+/*
+ * API for filtering a set of refs. The refs are provided and iterated
+ * over using the for_each_ref_fn(). The refs are stored into and filtered
+ * based on the ref_filter_cbdata structure.
+ */
+int filter_refs(int (for_each_ref_fn)(each_ref_fn, void *), struct ref_filter_cbdata *data);
 /*  Clear all memory allocated to ref_array */
 void ref_array_clear(struct ref_array *array);
 /*  Parse format string and sort specifiers */
-- 
2.4.2
Previous: Karthik NayakNext: Karthik Nayak
Message 23 of 27 in “create ref-filter from for-each-ref”
  1. 0/10 create ref-filter from for-each-refKarthik Nayak, Jun 6, 2015
  2. 01/10 for-each-ref: extract helper functions out of grab_single_ref()Karthik Nayak, Jun 6, 2015
  3. 02/10 for-each-ref: clean up codeKarthik Nayak, Jun 6, 2015
  4. Matthieu MoyJun 8, 2015
  5. Karthik NayakJun 8, 2015
  6. Matthieu MoyJun 8, 2015
  7. 03/10 for-each-ref: rename 'refinfo' to 'ref_array_item'Karthik Nayak, Jun 6, 2015
  8. Matthieu MoyJun 8, 2015
  9. Karthik NayakJun 8, 2015
  10. 04/10 for-each-ref: introduce new structures for better organisationKarthik Nayak, Jun 6, 2015
  11. 05/10 for-each-ref: introduce 'ref_array_clear()'Karthik Nayak, Jun 6, 2015
  12. Matthieu MoyJun 8, 2015
  13. Karthik NayakJun 8, 2015
  14. Karthik NayakJun 8, 2015
  15. Matthieu MoyJun 8, 2015
  16. Junio C HamanoJun 8, 2015
  17. Matthieu MoyJun 8, 2015
  18. Karthik NayakJun 8, 2015
  19. Matthieu MoyJun 9, 2015
  20. 06/10 for-each-ref: rename some functions and make them publicKarthik Nayak, Jun 6, 2015
  21. 07/10 ref-filter: add 'ref-filter.h'Karthik Nayak, Jun 6, 2015
  22. 08/10 ref-filter: move code from 'for-each-ref'Karthik Nayak, Jun 6, 2015
  23. 09/10 for-each-ref: introduce filter_refs()Karthik Nayak, Jun 6, 2015
  24. 10/10 ref-filter: make 'ref_array_item' use a FLEX_ARRAY for refnameKarthik Nayak, Jun 6, 2015
  25. Christian CouderJun 6, 2015
  26. Karthik NayakJun 6, 2015
  27. Karthik NayakJun 6, 2015

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.