Rename 'refinfo' to 'ref_array_item' and 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. Re-order the fields in 'ref_array_item' so that refname can be eventually converted to a FLEX_ARRAY. Introduce 'ref_filter_clear_data' to clear all allocated memory. 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@xxxxxxxxx> Mentored-by: Matthieu Moy <matthieu.moy@xxxxxxxxxxxxxxx> Signed-off-by: Karthik Nayak <karthik.188@xxxxxxxxx> --- builtin/for-each-ref.c | 103 +++++++++++++++++++++++++++++-------------------- 1 file changed, 61 insertions(+), 42 deletions(-) diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c index 919d45e..d9fd512 100644 --- a/builtin/for-each-ref.c +++ b/builtin/for-each-ref.c @@ -31,12 +31,26 @@ struct ref_sort { unsigned reverse : 1; }; -struct refinfo { - char *refname; +struct ref_array_item { unsigned char objectname[20]; int flag; const char *symref; struct atom_value *value; + 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 { @@ -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. refinfo + * 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. @@ -622,7 +636,7 @@ static inline char *copy_advance(char *dst, const char *src) /* * Parse the object referred by ref, and grab needed value. */ -static void populate_value(struct refinfo *ref) +static void populate_value(struct ref_array_item *ref) { void *buf; struct object *obj; @@ -821,7 +835,7 @@ static void populate_value(struct refinfo *ref) * Given a ref, return the value for the atom. This lazily gets value * out of the object by calling populate value. */ -static void get_value(struct refinfo *ref, int atom, struct atom_value **v) +static void get_value(struct ref_array_item *ref, int atom, struct atom_value **v) { if (!ref->value) { populate_value(ref); @@ -830,12 +844,6 @@ static void get_value(struct refinfo *ref, int atom, struct atom_value **v) *v = &ref->value[atom]; } -struct grab_ref_cbdata { - struct refinfo **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' @@ -860,12 +868,12 @@ static int match_name_as_path(const char **pattern, const char *refname) return 0; } -/* Allocate space for a new refinfo and copy the objectname and flag to it */ -static struct refinfo *new_refinfo(const char *refname, - const unsigned char *objectname, - int flag) +/* Allocate space for a new ref_array_item and copy the objectname and flag to it */ +static struct ref_array_item *new_ref_array_item(const char *refname, + const unsigned char *objectname, + int flag) { - struct refinfo *ref = xcalloc(1, sizeof(struct refinfo)); + struct ref_array_item *ref = xcalloc(1, sizeof(struct ref_array_item)); ref->refname = xstrdup(refname); hashcpy(ref->objectname, objectname); ref->flag = flag; @@ -879,26 +887,39 @@ static struct refinfo *new_refinfo(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 refinfo *ref; + 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) { - warning("ignoring ref with broken name %s", refname); - return 0; + warning("ignoring ref with broken name %s", refname); + 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_refinfo(refname, sha1, flag); + 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; } -static int cmp_ref_sort(struct ref_sort *s, struct refinfo *a, struct refinfo *b) +/* Free all memory allocated for ref_filter_cbdata */ +void ref_filter_clear_data(struct ref_filter_cbdata *ref_cbdata) +{ + int i; + + for (i = 0; i < ref_cbdata->array.nr; i++) + free(ref_cbdata->array.items[i]); + free(ref_cbdata->array.items); + ref_cbdata->array.items = NULL; + ref_cbdata->array.nr = ref_cbdata->array.alloc = 0; +} + +static int cmp_ref_sort(struct ref_sort *s, struct ref_array_item *a, struct ref_array_item *b) { struct atom_value *va, *vb; int cmp; @@ -925,8 +946,8 @@ static int cmp_ref_sort(struct ref_sort *s, struct refinfo *a, struct refinfo *b static struct ref_sort *ref_sort; static int compare_refs(const void *a_, const void *b_) { - struct refinfo *a = *((struct refinfo **)a_); - struct refinfo *b = *((struct refinfo **)b_); + struct ref_array_item *a = *((struct ref_array_item **)a_); + struct ref_array_item *b = *((struct ref_array_item **)b_); struct ref_sort *s; for (s = ref_sort; s; s = s->next) { @@ -937,10 +958,10 @@ static int compare_refs(const void *a_, const void *b_) return 0; } -static void sort_refs(struct ref_sort *sort, struct refinfo **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 refinfo *), 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) @@ -1007,7 +1028,7 @@ static void emit(const char *cp, const char *ep) } } -static void show_ref(struct refinfo *info, const char *format, int quote_style) +static void show_ref(struct ref_array_item *info, const char *format, int quote_style) { const char *cp, *sp, *ep; @@ -1076,12 +1097,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 refinfo **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 +1140,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; + 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); + ref_filter_clear_data(&ref_cbdata); return 0; } -- 2.4.1 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html