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 6db57e3533806..3a49b55a1cc2e 100644 --- a/builtin/cat-file.c +++ b/builtin/cat-file.c @@ -382,8 +382,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)"; @@ -395,8 +394,6 @@ static int batch_objects(struct batch_options *opt) memset(&data, 0, sizeof(data)); opt->format.cat_file_data = &data; verify_ref_format(&opt->format); - if (opt->cmdmode) - data.split_on_whitespace = 1; if (opt->all_objects) { struct object_info empty = OBJECT_INFO_INIT; @@ -435,9 +432,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_atom_used(&opt->format, "rest"); 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 34a54db168265..4adeea6aad0da 100644 --- a/ref-filter.c +++ b/ref-filter.c @@ -493,8 +493,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 (cat_file_info && !strcmp(valid_atom[i].name, "rest")) - cat_file_info->split_on_whitespace = 1; return at; } @@ -730,6 +728,21 @@ static const char *find_next(const char *cp) return NULL; } +/* Search for atom in given format. */ +int is_atom_used(const struct ref_format *format, const char *atom) +{ + 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 == strlen(atom) && !memcmp(sp, atom, 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 5c6e019998716..fffc443726e28 100644 --- a/ref-filter.h +++ b/ref-filter.h @@ -86,13 +86,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 @@ -186,4 +179,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 in given format. */ +int is_atom_used(const struct ref_format *format, const char *atom); + #endif /* REF_FILTER_H */ -- https://github.com/git/git/pull/452