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: [WIP/PATCH v4 4/8] for-each-ref: introduce new structures for better organisation
Date: Sat, 30 May 2015 23:23:27 +0530 [thread overview]
Message-ID: <1433008411-8550-4-git-send-email-karthik.188@gmail.com> (raw)
In-Reply-To: <5569EF77.4010300@gmail.com>
Intoduce '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 making it publically 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 | 56 ++++++++++++++++++++++++++++----------------------
1 file changed, 31 insertions(+), 25 deletions(-)
diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c
index e634fd2..ef54c90 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;
@@ -85,7 +99,7 @@ static struct {
* a "*" to denote deref_tag().
*
* We parse given format string and sort specifiers, and make a list
- * of properties that we need to extract out of objects. ref_array_item
+ * of properties that we need to extract out of objects. ref_array_item
* structure will hold an array of values extracted that can be
* indexed with the "atom number", which is an index into this
* array.
@@ -830,12 +844,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;
-};
-
/*
* Given a refname, return 1 if the refname matches with one of the patterns
* while the pattern is a pathname like 'refs/tags' or 'refs/heads/master'
@@ -879,7 +887,8 @@ static struct ref_array_item *new_ref_array_item(const char *refname,
*/
static int grab_single_ref(const char *refname, const unsigned char *sha1, 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) {
@@ -887,13 +896,13 @@ static int grab_single_ref(const char *refname, const unsigned char *sha1, int f
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;
ref = new_ref_array_item(refname, sha1, 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;
}
@@ -937,10 +946,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)
@@ -1076,12 +1085,12 @@ 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;
+ memset(&ref_cbdata, 0, sizeof(ref_cbdata));
struct option opts[] = {
OPT_BIT('s', "shell", "e_style,
@@ -1119,17 +1128,14 @@ 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;
+ 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
next prev parent reply other threads:[~2015-05-30 17:54 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <5569EF77.4010300@gmail.com>
2015-05-30 17:53 ` [WIP/PATCH v4 1/8] for-each-ref: extract helper functions out of grab_single_ref() Karthik Nayak
2015-05-31 2:58 ` Eric Sunshine
2015-05-31 8:11 ` Karthik Nayak
2015-05-31 17:34 ` Junio C Hamano
2015-05-31 17:48 ` Karthik Nayak
2015-05-31 20:39 ` Matthieu Moy
2015-06-01 14:39 ` Junio C Hamano
2015-05-30 17:53 ` [WIP/PATCH v4 2/8] for-each-ref: simplify code Karthik Nayak
2015-05-30 17:53 ` [WIP/PATCH v4 3/8] for-each-ref: rename 'refinfo' to 'ref_array_item' Karthik Nayak
2015-05-31 17:37 ` Junio C Hamano
2015-05-31 17:48 ` Karthik Nayak
2015-05-30 17:53 ` Karthik Nayak [this message]
2015-05-31 3:14 ` [WIP/PATCH v4 4/8] for-each-ref: introduce new structures for better organisation Eric Sunshine
2015-05-31 8:16 ` Karthik Nayak
2015-05-30 17:53 ` [WIP/PATCH v4 5/8] for-each-ref: introduce 'ref_filter_clear_data()' Karthik Nayak
2015-05-31 7:38 ` Christian Couder
2015-05-31 8:20 ` Karthik Nayak
2015-05-30 17:53 ` [WIP/PATCH v4 6/8] for-each-ref: rename some functions and make them public Karthik Nayak
2015-05-31 3:21 ` Eric Sunshine
2015-05-31 8:16 ` Karthik Nayak
2015-05-31 8:04 ` Christian Couder
2015-05-31 8:11 ` Christian Couder
2015-05-31 9:17 ` Karthik Nayak
2015-05-31 14:03 ` Christian Couder
2015-05-31 15:30 ` Karthik Nayak
2015-06-01 6:38 ` Matthieu Moy
2015-06-01 19:28 ` Karthik Nayak
2015-05-31 17:54 ` Junio C Hamano
2015-05-31 17:48 ` Junio C Hamano
2015-05-31 19:34 ` Karthik Nayak
2015-06-01 14:53 ` Junio C Hamano
2015-06-01 19:35 ` Karthik Nayak
2015-05-30 17:53 ` [WIP/PATCH v4 7/8] ref-filter: move code from 'for-each-ref' Karthik Nayak
2015-05-30 17:53 ` [WIP/PATCH v4 8/8] ref-filter: add 'ref-filter.h' Karthik Nayak
2015-05-31 3:43 ` Eric Sunshine
2015-05-31 8:19 ` Karthik Nayak
2015-05-31 8:29 ` Eric Sunshine
2015-05-31 9:12 ` Karthik Nayak
2015-05-31 20:46 ` Matthieu Moy
2015-05-31 20:50 ` Karthik Nayak
2015-05-31 22:34 ` Christian Couder
2015-06-01 6:47 ` Matthieu Moy
2015-05-31 8:20 ` Christian Couder
2015-05-31 9:16 ` Karthik Nayak
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=1433008411-8550-4-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).