for-each-ref: introduce new structures for better organisation

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>
Reviewed-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Karthik Nayak
2015-06-14 01:07:22 +05:30
committed by Junio C Hamano
parent 5879232090
commit 215b565126

View File

@ -39,6 +39,20 @@ struct ref_array_item {
char *refname; 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 { static struct {
const char *name; const char *name;
cmp_type cmp_type; 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]; *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 one of the patterns, otherwise 0. * Return 1 if the refname matches one of the patterns, otherwise 0.
* A pattern can be path prefix (e.g. a refname "refs/heads/master" * A pattern can be path prefix (e.g. a refname "refs/heads/master"
@ -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, static int grab_single_ref(const char *refname, const struct object_id *oid,
int flag, void *cb_data) 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; struct ref_array_item *ref;
if (flag & REF_BAD_NAME) { if (flag & REF_BAD_NAME) {
@ -903,7 +912,7 @@ static int grab_single_ref(const char *refname, const struct object_id *oid,
return 0; 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; 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); ref = new_ref_array_item(refname, oid->hash, flag);
REALLOC_ARRAY(cb->grab_array, cb->grab_cnt + 1); REALLOC_ARRAY(ref_cbdata->array.items, ref_cbdata->array.nr + 1);
cb->grab_array[cb->grab_cnt++] = ref; ref_cbdata->array.items[ref_cbdata->array.nr++] = ref;
return 0; return 0;
} }
@ -957,10 +966,10 @@ static int compare_refs(const void *a_, const void *b_)
return 0; 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; 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) 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 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)"; const char *format = "%(objectname) %(objecttype)\t%(refname)";
struct ref_sort *sort = NULL, **sort_tail = &sort; struct ref_sort *sort = NULL, **sort_tail = &sort;
int maxcount = 0, quote_style = 0; int maxcount = 0, quote_style = 0;
struct ref_array_item **refs; struct ref_filter_cbdata ref_cbdata;
struct grab_ref_cbdata cbdata;
struct option opts[] = { struct option opts[] = {
OPT_BIT('s', "shell", &quote_style, 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 */ /* for warn_ambiguous_refs */
git_config(git_default_config, NULL); git_config(git_default_config, NULL);
memset(&cbdata, 0, sizeof(cbdata)); memset(&ref_cbdata, 0, sizeof(ref_cbdata));
cbdata.grab_pattern = argv; ref_cbdata.filter.name_patterns = argv;
for_each_rawref(grab_single_ref, &cbdata); for_each_rawref(grab_single_ref, &ref_cbdata);
refs = cbdata.grab_array;
num_refs = cbdata.grab_cnt;
sort_refs(sort, refs, num_refs); sort_refs(sort, &ref_cbdata.array);
if (!maxcount || num_refs < maxcount) if (!maxcount || ref_cbdata.array.nr < maxcount)
maxcount = num_refs; maxcount = ref_cbdata.array.nr;
for (i = 0; i < maxcount; i++) 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; return 0;
} }