[PATCH 3/8] [GSOC] ref-filter: add ref_format to ref_array_item
From: ZheNing Hu via GitGitGadget <hidden>
Date: 2021-08-25 09:09:00
Subsystem:
the rest · Maintainer:
Linus Torvalds
From: ZheNing Hu <redacted> Since we expect to move some global options to ref_format, we may want check these global options in some functions like populate_value(), but the problem is that these functions cannot use ref_format, which means we may need a deep call chain to pass ref_format to them, this will be a bit cumbersome. We can use another method: Add the ref_format member to ref_array_item. Since we have successfully eliminated dummy ref_format, this can ensure that the same ref_array can use the same ref_format, so we pass ref_format through the call chain when ref_array_item is initialized, we also add ref_format member to ref_cbdata. This will help us move the global options to ref_format later. Mentored-by: Christian Couder [off-list ref] Mentored-by: Hariom Verma [off-list ref] Signed-off-by: ZheNing Hu <redacted> --- builtin/branch.c | 5 +++-- builtin/for-each-ref.c | 4 ++-- builtin/ls-remote.c | 2 +- builtin/tag.c | 4 ++-- ref-filter.c | 24 ++++++++++++++---------- ref-filter.h | 7 ++++--- 6 files changed, 26 insertions(+), 20 deletions(-)
diff --git a/builtin/branch.c b/builtin/branch.c
index 3b21c2b54b9..4c6e7ef5f10 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c@@ -427,7 +427,7 @@ static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sortin memset(&array, 0, sizeof(array)); - filter_refs(&array, filter, filter->kind | FILTER_REFS_INCLUDE_BROKEN); + filter_refs(&array, filter, format, filter->kind | FILTER_REFS_INCLUDE_BROKEN); if (filter->verbose) maxwidth = calc_maxwidth(&array, strlen(remote_prefix));
@@ -444,7 +444,8 @@ static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sortin for (i = 0; i < array.nr; i++) { strbuf_reset(&err); strbuf_reset(&out); - if (format_ref_array_item(array.items[i], format, &out, &err)) + array.items[i]->format = format; + if (format_ref_array_item(array.items[i], &out, &err)) die("%s", err.buf); if (column_active(colopts)) { assert(!filter->verbose && "--column and --verbose are incompatible");
diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c
index 8948b7bcd32..4a71caca929 100644
--- a/builtin/for-each-ref.c
+++ b/builtin/for-each-ref.c@@ -79,7 +79,7 @@ int cmd_for_each_ref(int argc, const char **argv, const char *prefix) filter.name_patterns = argv; filter.match_as_path = 1; - filter_refs(&array, &filter, FILTER_REFS_ALL | FILTER_REFS_INCLUDE_BROKEN); + filter_refs(&array, &filter, &format, FILTER_REFS_ALL | FILTER_REFS_INCLUDE_BROKEN); ref_array_sort(&sorting, &array); if (!maxcount || array.nr < maxcount)
@@ -87,7 +87,7 @@ int cmd_for_each_ref(int argc, const char **argv, const char *prefix) for (i = 0; i < maxcount; i++) { strbuf_reset(&err); strbuf_reset(&output); - if (format_ref_array_item(array.items[i], &format, &output, &err)) + if (format_ref_array_item(array.items[i], &output, &err)) die("%s", err.buf); fwrite(output.buf, 1, output.len, stdout); putchar('\n');
diff --git a/builtin/ls-remote.c b/builtin/ls-remote.c
index 7fac069a29d..2dd19a8583d 100644
--- a/builtin/ls-remote.c
+++ b/builtin/ls-remote.c@@ -133,7 +133,7 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix) continue; if (!tail_match(pattern, ref->name)) continue; - item = ref_array_push(&ref_array, ref->name, &ref->old_oid); + item = ref_array_push(&ref_array, ref->name, &ref->old_oid, &dummy); item->symref = xstrdup_or_null(ref->symref); }
diff --git a/builtin/tag.c b/builtin/tag.c
index a0d4aa775e3..9a66c4d37a5 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c@@ -62,13 +62,13 @@ static int list_tags(struct ref_filter *filter, struct ref_sorting *sorting, if (verify_ref_format(format)) die(_("unable to parse format string")); filter->with_commit_tag_algo = 1; - filter_refs(&array, filter, FILTER_REFS_TAGS); + filter_refs(&array, filter, format, FILTER_REFS_TAGS); ref_array_sort(sorting, &array); for (i = 0; i < array.nr; i++) { strbuf_reset(&output); strbuf_reset(&err); - if (format_ref_array_item(array.items[i], format, &output, &err)) + if (format_ref_array_item(array.items[i], &output, &err)) die("%s", err.buf); fwrite(output.buf, 1, output.len, stdout); putchar('\n');
diff --git a/ref-filter.c b/ref-filter.c
index 88a3e06eea9..f4fa3102da6 100644
--- a/ref-filter.c
+++ b/ref-filter.c@@ -2167,22 +2167,24 @@ static const struct object_id *match_points_at(struct oid_array *points_at, * Callers can then fill in other struct members at their leisure. */ static struct ref_array_item *new_ref_array_item(const char *refname, - const struct object_id *oid) + const struct object_id *oid, + struct ref_format *format) { struct ref_array_item *ref; FLEX_ALLOC_STR(ref, refname, refname); oidcpy(&ref->objectname, oid); ref->rest = NULL; - + ref->format = format; return ref; } struct ref_array_item *ref_array_push(struct ref_array *array, const char *refname, - const struct object_id *oid) + const struct object_id *oid, + struct ref_format *format) { - struct ref_array_item *ref = new_ref_array_item(refname, oid); + struct ref_array_item *ref = new_ref_array_item(refname, oid, format); ALLOC_GROW(array->items, array->nr + 1, array->alloc); array->items[array->nr++] = ref;
@@ -2226,6 +2228,7 @@ static int filter_ref_kind(struct ref_filter *filter, const char *refname) struct ref_filter_cbdata { struct ref_array *array; struct ref_filter *filter; + struct ref_format *format; struct contains_cache contains_cache; struct contains_cache no_contains_cache; };
@@ -2238,6 +2241,7 @@ static int ref_filter_handler(const char *refname, const struct object_id *oid, { struct ref_filter_cbdata *ref_cbdata = cb_data; struct ref_filter *filter = ref_cbdata->filter; + struct ref_format *format = ref_cbdata->format; struct ref_array_item *ref; struct commit *commit = NULL; unsigned int kind;
@@ -2288,7 +2292,7 @@ static int ref_filter_handler(const char *refname, const struct object_id *oid, * to do its job and the resulting list may yet to be pruned * by maxcount logic. */ - ref = ref_array_push(ref_cbdata->array, refname, oid); + ref = ref_array_push(ref_cbdata->array, refname, oid, format); ref->commit = commit; ref->flag = flag; ref->kind = kind;
@@ -2401,7 +2405,7 @@ static void reach_filter(struct ref_array *array, * as per the given ref_filter structure and finally store the * filtered refs in the ref_array structure. */ -int filter_refs(struct ref_array *array, struct ref_filter *filter, unsigned int type) +int filter_refs(struct ref_array *array, struct ref_filter *filter, struct ref_format *format, unsigned int type) { struct ref_filter_cbdata ref_cbdata; int ret = 0;
@@ -2409,7 +2413,7 @@ int filter_refs(struct ref_array *array, struct ref_filter *filter, unsigned int ref_cbdata.array = array; ref_cbdata.filter = filter; - + ref_cbdata.format = format; if (type & FILTER_REFS_INCLUDE_BROKEN) broken = 1; filter->kind = type & FILTER_REFS_KIND_MASK;
@@ -2592,12 +2596,12 @@ static void append_literal(const char *cp, const char *ep, struct ref_formatting } int format_ref_array_item(struct ref_array_item *info, - struct ref_format *format, struct strbuf *final_buf, struct strbuf *error_buf) { const char *cp, *sp, *ep; struct ref_formatting_state state = REF_FORMATTING_STATE_INIT; + struct ref_format *format = info->format; state.quote_style = format->quote_style; push_stack_element(&state.stack);
@@ -2644,9 +2648,9 @@ void pretty_print_ref(const char *name, const struct object_id *oid, struct strbuf output = STRBUF_INIT; struct strbuf err = STRBUF_INIT; - ref_item = new_ref_array_item(name, oid); + ref_item = new_ref_array_item(name, oid, format); ref_item->kind = ref_kind_from_refname(name); - if (format_ref_array_item(ref_item, format, &output, &err)) + if (format_ref_array_item(ref_item, &output, &err)) die("%s", err.buf); fwrite(output.buf, 1, output.len, stdout); putchar('\n');
diff --git a/ref-filter.h b/ref-filter.h
index 8f602583788..e95c055fb86 100644
--- a/ref-filter.h
+++ b/ref-filter.h@@ -45,6 +45,7 @@ struct ref_array_item { const char *symref; struct commit *commit; struct atom_value *value; + struct ref_format *format; char refname[FLEX_ARRAY]; };
@@ -109,7 +110,7 @@ struct ref_format { * as per the given ref_filter structure and finally store the * filtered refs in the ref_array structure. */ -int filter_refs(struct ref_array *array, struct ref_filter *filter, unsigned int type); +int filter_refs(struct ref_array *array, struct ref_filter *filter, struct ref_format *format, unsigned int type); /* Clear all memory allocated to ref_array */ void ref_array_clear(struct ref_array *array); /* Used to verify if the given format is correct and to parse out the used atoms */
@@ -120,7 +121,6 @@ void ref_array_sort(struct ref_sorting *sort, struct ref_array *array); void ref_sorting_set_sort_flags_all(struct ref_sorting *sorting, unsigned int mask, int on); /* Based on the given format and quote_style, fill the strbuf */ int format_ref_array_item(struct ref_array_item *info, - struct ref_format *format, struct strbuf *final_buf, struct strbuf *error_buf); /* Parse a single sort specifier and add it to the list */
@@ -153,6 +153,7 @@ void pretty_print_ref(const char *name, const struct object_id *oid, */ struct ref_array_item *ref_array_push(struct ref_array *array, const char *refname, - const struct object_id *oid); + const struct object_id *oid, + struct ref_format *format); #endif /* REF_FILTER_H */
--
gitgitgadget