git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Karthik Nayak <karthik.188@gmail.com>
To: git@vger.kernel.org
Cc: christian.couder@gmail.com, Matthieu.Moy@grenoble-inp.fr,
	Karthik Nayak <karthik.188@gmail.com>
Subject: [PATCH v7 05/12] for-each-ref: introduce new structures for better organisation
Date: Thu, 11 Jun 2015 21:39:56 +0530	[thread overview]
Message-ID: <1434039003-10928-5-git-send-email-karthik.188@gmail.com> (raw)
In-Reply-To: <1434039003-10928-1-git-send-email-karthik.188@gmail.com>

Introduce 'ref_filter_cbdata' which will hold 'ref_filter'
(conditions to filter the refs on) and 'ref_array' (the array
of ref_array_items). Modify the code to use these new structures.

This is a preparatory patch to eventually move code from 'for-each-ref'
to 'ref-filter' and make it publicly available.

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 | 54 ++++++++++++++++++++++++++++----------------------
 1 file changed, 30 insertions(+), 24 deletions(-)

diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c
index 8c44b49..913d757 100644
--- a/builtin/for-each-ref.c
+++ b/builtin/for-each-ref.c
@@ -39,6 +39,20 @@ struct ref_array_item {
 	char *refname;
 };
 
+struct ref_array {
+	int nr, alloc;
+	struct ref_array_item **items;
+};
+
+struct ref_filter {
+	const char **name_patterns;
+};
+
+struct ref_filter_cbdata {
+	struct ref_array array;
+	struct ref_filter filter;
+};
+
 static struct {
 	const char *name;
 	cmp_type cmp_type;
@@ -844,12 +858,6 @@ static void get_value(struct ref_array_item *ref, int atom, struct atom_value **
 	*v = &ref->value[atom];
 }
 
-struct grab_ref_cbdata {
-	struct ref_array_item **grab_array;
-	const char **grab_pattern;
-	int grab_cnt;
-};
-
 /*
  * Return 1 if the refname matches with one of the patterns,
  * otherwise 0.  The patterns can be literal prefix (e.g. a
@@ -895,7 +903,8 @@ static struct ref_array_item *new_ref_array_item(const char *refname,
 static int grab_single_ref(const char *refname, const struct object_id *oid,
 			   int flag, void *cb_data)
 {
-	struct grab_ref_cbdata *cb = cb_data;
+	struct ref_filter_cbdata *ref_cbdata = cb_data;
+	struct ref_filter *filter = &ref_cbdata->filter;
 	struct ref_array_item *ref;
 
 	if (flag & REF_BAD_NAME) {
@@ -903,7 +912,7 @@ static int grab_single_ref(const char *refname, const struct object_id *oid,
 		  return 0;
 	}
 
-	if (*cb->grab_pattern && !match_name_as_path(cb->grab_pattern, refname))
+	if (*filter->name_patterns && !match_name_as_path(filter->name_patterns, refname))
 		return 0;
 
 	/*
@@ -913,8 +922,8 @@ static int grab_single_ref(const char *refname, const struct object_id *oid,
 	 */
 	ref = new_ref_array_item(refname, oid->hash, flag);
 
-	REALLOC_ARRAY(cb->grab_array, cb->grab_cnt + 1);
-	cb->grab_array[cb->grab_cnt++] = ref;
+	REALLOC_ARRAY(ref_cbdata->array.items, ref_cbdata->array.nr + 1);
+	ref_cbdata->array.items[ref_cbdata->array.nr++] = ref;
 	return 0;
 }
 
@@ -957,10 +966,10 @@ static int compare_refs(const void *a_, const void *b_)
 	return 0;
 }
 
-static void sort_refs(struct ref_sort *sort, struct ref_array_item **refs, int num_refs)
+static void sort_refs(struct ref_sort *sort, struct ref_array *array)
 {
 	ref_sort = sort;
-	qsort(refs, num_refs, sizeof(struct ref_array_item *), compare_refs);
+	qsort(array->items, array->nr, sizeof(struct ref_array_item *), compare_refs);
 }
 
 static void print_value(struct atom_value *v, int quote_style)
@@ -1096,12 +1105,11 @@ static char const * const for_each_ref_usage[] = {
 
 int cmd_for_each_ref(int argc, const char **argv, const char *prefix)
 {
-	int i, num_refs;
+	int i;
 	const char *format = "%(objectname) %(objecttype)\t%(refname)";
 	struct ref_sort *sort = NULL, **sort_tail = &sort;
 	int maxcount = 0, quote_style = 0;
-	struct ref_array_item **refs;
-	struct grab_ref_cbdata cbdata;
+	struct ref_filter_cbdata ref_cbdata;
 
 	struct option opts[] = {
 		OPT_BIT('s', "shell", &quote_style,
@@ -1139,17 +1147,15 @@ int cmd_for_each_ref(int argc, const char **argv, const char *prefix)
 	/* for warn_ambiguous_refs */
 	git_config(git_default_config, NULL);
 
-	memset(&cbdata, 0, sizeof(cbdata));
-	cbdata.grab_pattern = argv;
-	for_each_rawref(grab_single_ref, &cbdata);
-	refs = cbdata.grab_array;
-	num_refs = cbdata.grab_cnt;
+	memset(&ref_cbdata, 0, sizeof(ref_cbdata));
+	ref_cbdata.filter.name_patterns = argv;
+	for_each_rawref(grab_single_ref, &ref_cbdata);
 
-	sort_refs(sort, refs, num_refs);
+	sort_refs(sort, &ref_cbdata.array);
 
-	if (!maxcount || num_refs < maxcount)
-		maxcount = num_refs;
+	if (!maxcount || ref_cbdata.array.nr < maxcount)
+		maxcount = ref_cbdata.array.nr;
 	for (i = 0; i < maxcount; i++)
-		show_ref(refs[i], format, quote_style);
+		show_ref(ref_cbdata.array.items[i], format, quote_style);
 	return 0;
 }
-- 
2.4.2

  parent reply	other threads:[~2015-06-11 16:10 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-11 16:07 [PATCH v7 0/12] Create ref-filter from for-each-ref Karthik Nayak
2015-06-11 16:09 ` [PATCH v7 01/12] for-each-ref: extract helper functions out of grab_single_ref() Karthik Nayak
2015-06-11 16:09   ` [PATCH v7 02/12] for-each-ref: clean up code Karthik Nayak
2015-06-11 16:09   ` [PATCH v7 03/12] for-each-ref: change comment in ref_sort Karthik Nayak
2015-06-12 17:40     ` Junio C Hamano
2015-06-12 17:48       ` Karthik Nayak
2015-06-12 18:04         ` Junio C Hamano
2015-06-12 18:29           ` Karthik Nayak
2015-06-12 19:49             ` Christian Couder
2015-06-12 20:27               ` Junio C Hamano
2015-06-12 21:22                 ` karthik nayak
2015-06-11 16:09   ` [PATCH v7 04/12] for-each-ref: rename 'refinfo' to 'ref_array_item' Karthik Nayak
2015-06-11 16:09   ` Karthik Nayak [this message]
2015-06-11 17:41     ` [PATCH v7 05/12] for-each-ref: introduce new structures for better organisation Matthieu Moy
2015-06-11 17:56       ` Karthik Nayak
2015-06-11 19:13         ` Matthieu Moy
2015-06-11 19:21           ` Karthik Nayak
2015-06-11 19:47             ` Matthieu Moy
2015-06-11 16:09   ` [PATCH v7 06/12] for-each-ref: introduce 'ref_array_clear()' Karthik Nayak
2015-06-11 16:09   ` [PATCH v7 07/12] for-each-ref: rename some functions and make them public Karthik Nayak
2015-06-11 16:09   ` [PATCH v7 08/12] for-each-ref: rename variables called sort to sorting Karthik Nayak
2015-06-11 16:10   ` [PATCH v7 09/12] ref-filter: add 'ref-filter.h' Karthik Nayak
2015-06-11 16:10   ` [PATCH v7 10/12] ref-filter: move code from 'for-each-ref' Karthik Nayak
2015-06-11 16:10   ` [PATCH v7 11/12] for-each-ref: introduce filter_refs() Karthik Nayak
2015-06-11 17:00     ` Matthieu Moy
2015-06-11 17:17       ` Karthik Nayak
2015-06-12 19:38       ` Junio C Hamano
2015-06-11 17:21     ` Karthik Nayak
2015-06-11 16:10   ` [PATCH v7 12/12] ref-filter: make 'ref_array_item' use a FLEX_ARRAY for refname Karthik Nayak
2015-06-12 17:30   ` [PATCH v7 01/12] for-each-ref: extract helper functions out of grab_single_ref() Junio C Hamano
2015-06-12 17:32     ` Karthik Nayak
2015-06-11 17:03 ` [PATCH v7 0/12] Create ref-filter from for-each-ref Matthieu Moy

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1434039003-10928-5-git-send-email-karthik.188@gmail.com \
    --to=karthik.188@gmail.com \
    --cc=Matthieu.Moy@grenoble-inp.fr \
    --cc=christian.couder@gmail.com \
    --cc=git@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).