From: ZheNing Hu <adlternative@xxxxxxxxx> Add `cat_file_mode` member in struct `ref_format` and introduce the function `reject_atom()`, when `cat-file --batch` use ref-filter logic later, it can help us reject atoms in verify_ref_format() which cat-file cannot use, e.g. `%(refname)`, `%(push)`, `%(upstream)`... or the atom `%(rest)` which for-each-ref family cannot use. Helped-by: Eric Sunshine <sunshine@xxxxxxxxxxxxxx> Helped-by: Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> Helped-by: Christian Couder <christian.couder@xxxxxxxxx> Mentored-by: Christian Couder <christian.couder@xxxxxxxxx> Mentored-by: Hariom Verma <hariom18599@xxxxxxxxx> Signed-off-by: ZheNing Hu <adlternative@xxxxxxxxx> --- ref-filter.c | 25 ++++++++++++++++++++++--- ref-filter.h | 1 + 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/ref-filter.c b/ref-filter.c index 80b09fce1d5..27199ba40f5 100644 --- a/ref-filter.c +++ b/ref-filter.c @@ -1000,6 +1000,26 @@ static const char *find_next(const char *cp) return NULL; } +static int reject_atom(int cat_file_mode, enum atom_type atom_type) +{ + if (!cat_file_mode) + return atom_type == ATOM_REST; + + /* cat_file_mode */ + switch (atom_type) { + case ATOM_FLAG: + case ATOM_HEAD: + case ATOM_PUSH: + case ATOM_REFNAME: + case ATOM_SYMREF: + case ATOM_UPSTREAM: + case ATOM_WORKTREEPATH: + return 1; + default: + return 0; + } +} + /* * Make sure the format string is well formed, and parse out * the used atoms. @@ -1020,9 +1040,8 @@ int verify_ref_format(struct ref_format *format) at = parse_ref_filter_atom(format, sp + 2, ep, &err); if (at < 0) die("%s", err.buf); - - if (used_atom[at].atom_type == ATOM_REST) - die("this command reject atom %%(%.*s)", (int)(ep - sp - 2), sp + 2); + if (reject_atom(format->cat_file_mode, used_atom[at].atom_type)) + die(_("this command reject atom %%(%.*s)"), (int)(ep - sp - 2), sp + 2); if ((format->quote_style == QUOTE_PYTHON || format->quote_style == QUOTE_SHELL || diff --git a/ref-filter.h b/ref-filter.h index 44e6dc05ac2..053980a6a42 100644 --- a/ref-filter.h +++ b/ref-filter.h @@ -78,6 +78,7 @@ struct ref_format { */ const char *format; const char *rest; + int cat_file_mode; int quote_style; int use_rest; int use_color; -- gitgitgadget