Delete all items related to split_on_whitespace from ref-filter and add new function for handling the logic. Now cat-file could invoke that function to implementing its logic. Signed-off-by: Olga Telezhnaia <olyatelezhnaya@xxxxxxxxx> Mentored-by: Christian Couder <christian.couder@xxxxxxxxx> Mentored by: Jeff King <peff@xxxxxxxx> --- builtin/cat-file.c | 8 +++----- ref-filter.c | 17 +++++++++++++++-- ref-filter.h | 10 +++------- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/builtin/cat-file.c b/builtin/cat-file.c index 8f34d085962ed..601a87d9b5f7c 100644 --- a/builtin/cat-file.c +++ b/builtin/cat-file.c @@ -381,8 +381,7 @@ static int batch_objects(struct batch_options *opt) { struct strbuf buf = STRBUF_INIT; struct expand_data data; - int save_warning; - int retval = 0; + int save_warning, is_rest, retval = 0; if (!opt->format.format) opt->format.format = "%(objectname) %(objecttype) %(objectsize)"; @@ -396,8 +395,6 @@ static int batch_objects(struct batch_options *opt) opt->format.cat_file_data = &data; opt->format.is_cat = 1; verify_ref_format(&opt->format); - if (opt->cmdmode) - data.split_on_whitespace = 1; if (opt->all_objects) { struct object_info empty = OBJECT_INFO_INIT; @@ -436,9 +433,10 @@ static int batch_objects(struct batch_options *opt) */ save_warning = warn_on_object_refname_ambiguity; warn_on_object_refname_ambiguity = 0; + is_rest = opt->cmdmode || is_rest_atom_used(&opt->format); while (strbuf_getline(&buf, stdin) != EOF) { - if (data.split_on_whitespace) { + if (is_rest) { /* * Split at first whitespace, tying off the beginning * of the string and saving the remainder (or NULL) in diff --git a/ref-filter.c b/ref-filter.c index 3b61e790e90d1..51da76dc21136 100644 --- a/ref-filter.c +++ b/ref-filter.c @@ -494,8 +494,6 @@ static int parse_ref_filter_atom(const struct ref_format *format, need_tagged = 1; if (!strcmp(valid_atom[i].name, "symref")) need_symref = 1; - if (is_cat && !strcmp(valid_atom[i].name, "rest")) - cat_file_info->split_on_whitespace = 1; return at; } @@ -731,6 +729,21 @@ static const char *find_next(const char *cp) return NULL; } +/* Search for atom "rest" in given format. */ +int is_rest_atom_used(const struct ref_format *format) +{ + const char *cp, *sp; + for (cp = format->format; *cp && (sp = find_next(cp)); ) { + const char *ep = strchr(sp, ')'); + int atom_len = ep - sp - 2; + sp += 2; + if (atom_len == 4 && !memcmp(sp, "rest", atom_len)) + return 1; + cp = ep + 1; + } + return 0; +} + /* * Make sure the format string is well formed, and parse out * the used atoms. diff --git a/ref-filter.h b/ref-filter.h index c848370bed84a..276de387f3bd0 100644 --- a/ref-filter.h +++ b/ref-filter.h @@ -87,13 +87,6 @@ struct expand_data { const char *rest; struct object_id delta_base_oid; - /* - * Whether to split the input on whitespace before feeding it to - * get_sha1; this is decided during the mark_query phase based on - * whether we have a %(rest) token in our format. - */ - int split_on_whitespace; - /* * After a mark_query run, this object_info is set up to be * passed to sha1_object_info_extended. It will point to the data @@ -182,4 +175,7 @@ void pretty_print_ref(const char *name, const unsigned char *sha1, /* Fill the values of request and prepare all data for final string creation */ int populate_value(struct ref_array_item *ref); +/* Search for atom "rest" in given format. */ +int is_rest_atom_used(const struct ref_format *format); + #endif /* REF_FILTER_H */ -- https://github.com/git/git/pull/452