ref-filter.h: add max_count and omit_empty to ref_format

Add an internal 'array_opts' struct to 'struct ref_format' containing
formatting options that pertain to the formatting of an entire ref array:
'max_count' and 'omit_empty'. These values are specified by the '--count'
and '--omit-empty' options, respectively, to 'for-each-ref'/'tag'/'branch'.
Storing these values in the 'ref_format' will simplify the consolidation of
ref array formatting logic across builtins in later patches.

Signed-off-by: Victoria Dye <vdye@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Victoria Dye 2023-11-14 19:53:50 +00:00 committed by Junio C Hamano
parent 56d26ade97
commit 9d4fcfe1ff
4 changed files with 20 additions and 16 deletions

View File

@ -45,7 +45,6 @@ static const char *head;
static struct object_id head_oid; static struct object_id head_oid;
static int recurse_submodules = 0; static int recurse_submodules = 0;
static int submodule_propagate_branches = 0; static int submodule_propagate_branches = 0;
static int omit_empty = 0;


static int branch_use_color = -1; static int branch_use_color = -1;
static char branch_colors[][COLOR_MAXLEN] = { static char branch_colors[][COLOR_MAXLEN] = {
@ -480,7 +479,7 @@ static void print_ref_list(struct ref_filter *filter, struct ref_sorting *sortin
string_list_append(output, out.buf); string_list_append(output, out.buf);
} else { } else {
fwrite(out.buf, 1, out.len, stdout); fwrite(out.buf, 1, out.len, stdout);
if (out.len || !omit_empty) if (out.len || !format->array_opts.omit_empty)
putchar('\n'); putchar('\n');
} }
} }
@ -737,7 +736,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
OPT_BIT('D', NULL, &delete, N_("delete branch (even if not merged)"), 2), OPT_BIT('D', NULL, &delete, N_("delete branch (even if not merged)"), 2),
OPT_BIT('m', "move", &rename, N_("move/rename a branch and its reflog"), 1), OPT_BIT('m', "move", &rename, N_("move/rename a branch and its reflog"), 1),
OPT_BIT('M', NULL, &rename, N_("move/rename a branch, even if target exists"), 2), OPT_BIT('M', NULL, &rename, N_("move/rename a branch, even if target exists"), 2),
OPT_BOOL(0, "omit-empty", &omit_empty, OPT_BOOL(0, "omit-empty", &format.array_opts.omit_empty,
N_("do not output a newline after empty formatted refs")), N_("do not output a newline after empty formatted refs")),
OPT_BIT('c', "copy", &copy, N_("copy a branch and its reflog"), 1), OPT_BIT('c', "copy", &copy, N_("copy a branch and its reflog"), 1),
OPT_BIT('C', NULL, &copy, N_("copy a branch, even if target exists"), 2), OPT_BIT('C', NULL, &copy, N_("copy a branch, even if target exists"), 2),

View File

@ -19,10 +19,10 @@ static char const * const for_each_ref_usage[] = {


int cmd_for_each_ref(int argc, const char **argv, const char *prefix) int cmd_for_each_ref(int argc, const char **argv, const char *prefix)
{ {
int i; int i, total;
struct ref_sorting *sorting; struct ref_sorting *sorting;
struct string_list sorting_options = STRING_LIST_INIT_DUP; struct string_list sorting_options = STRING_LIST_INIT_DUP;
int maxcount = 0, icase = 0, omit_empty = 0; int icase = 0;
struct ref_array array; struct ref_array array;
struct ref_filter filter = REF_FILTER_INIT; struct ref_filter filter = REF_FILTER_INIT;
struct ref_format format = REF_FORMAT_INIT; struct ref_format format = REF_FORMAT_INIT;
@ -40,11 +40,11 @@ int cmd_for_each_ref(int argc, const char **argv, const char *prefix)
N_("quote placeholders suitably for python"), QUOTE_PYTHON), N_("quote placeholders suitably for python"), QUOTE_PYTHON),
OPT_BIT(0 , "tcl", &format.quote_style, OPT_BIT(0 , "tcl", &format.quote_style,
N_("quote placeholders suitably for Tcl"), QUOTE_TCL), N_("quote placeholders suitably for Tcl"), QUOTE_TCL),
OPT_BOOL(0, "omit-empty", &omit_empty, OPT_BOOL(0, "omit-empty", &format.array_opts.omit_empty,
N_("do not output a newline after empty formatted refs")), N_("do not output a newline after empty formatted refs")),


OPT_GROUP(""), OPT_GROUP(""),
OPT_INTEGER( 0 , "count", &maxcount, N_("show only <n> matched refs")), OPT_INTEGER( 0 , "count", &format.array_opts.max_count, N_("show only <n> matched refs")),
OPT_STRING( 0 , "format", &format.format, N_("format"), N_("format to use for the output")), OPT_STRING( 0 , "format", &format.format, N_("format"), N_("format to use for the output")),
OPT__COLOR(&format.use_color, N_("respect format colors")), OPT__COLOR(&format.use_color, N_("respect format colors")),
OPT_REF_FILTER_EXCLUDE(&filter), OPT_REF_FILTER_EXCLUDE(&filter),
@ -71,8 +71,8 @@ int cmd_for_each_ref(int argc, const char **argv, const char *prefix)
string_list_append(&sorting_options, "refname"); string_list_append(&sorting_options, "refname");


parse_options(argc, argv, prefix, opts, for_each_ref_usage, 0); parse_options(argc, argv, prefix, opts, for_each_ref_usage, 0);
if (maxcount < 0) { if (format.array_opts.max_count < 0) {
error("invalid --count argument: `%d'", maxcount); error("invalid --count argument: `%d'", format.array_opts.max_count);
usage_with_options(for_each_ref_usage, opts); usage_with_options(for_each_ref_usage, opts);
} }
if (HAS_MULTI_BITS(format.quote_style)) { if (HAS_MULTI_BITS(format.quote_style)) {
@ -109,15 +109,16 @@ int cmd_for_each_ref(int argc, const char **argv, const char *prefix)


ref_array_sort(sorting, &array); ref_array_sort(sorting, &array);


if (!maxcount || array.nr < maxcount) total = format.array_opts.max_count;
maxcount = array.nr; if (!total || array.nr < total)
for (i = 0; i < maxcount; i++) { total = array.nr;
for (i = 0; i < total; i++) {
strbuf_reset(&err); strbuf_reset(&err);
strbuf_reset(&output); strbuf_reset(&output);
if (format_ref_array_item(array.items[i], &format, &output, &err)) if (format_ref_array_item(array.items[i], &format, &output, &err))
die("%s", err.buf); die("%s", err.buf);
fwrite(output.buf, 1, output.len, stdout); fwrite(output.buf, 1, output.len, stdout);
if (output.len || !omit_empty) if (output.len || !format.array_opts.omit_empty)
putchar('\n'); putchar('\n');
} }



View File

@ -44,7 +44,6 @@ static const char * const git_tag_usage[] = {
static unsigned int colopts; static unsigned int colopts;
static int force_sign_annotate; static int force_sign_annotate;
static int config_sign_tag = -1; /* unspecified */ static int config_sign_tag = -1; /* unspecified */
static int omit_empty = 0;


static int list_tags(struct ref_filter *filter, struct ref_sorting *sorting, static int list_tags(struct ref_filter *filter, struct ref_sorting *sorting,
struct ref_format *format) struct ref_format *format)
@ -83,7 +82,7 @@ static int list_tags(struct ref_filter *filter, struct ref_sorting *sorting,
if (format_ref_array_item(array.items[i], format, &output, &err)) if (format_ref_array_item(array.items[i], format, &output, &err))
die("%s", err.buf); die("%s", err.buf);
fwrite(output.buf, 1, output.len, stdout); fwrite(output.buf, 1, output.len, stdout);
if (output.len || !omit_empty) if (output.len || !format->array_opts.omit_empty)
putchar('\n'); putchar('\n');
} }


@ -481,7 +480,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
OPT_WITHOUT(&filter.no_commit, N_("print only tags that don't contain the commit")), OPT_WITHOUT(&filter.no_commit, N_("print only tags that don't contain the commit")),
OPT_MERGED(&filter, N_("print only tags that are merged")), OPT_MERGED(&filter, N_("print only tags that are merged")),
OPT_NO_MERGED(&filter, N_("print only tags that are not merged")), OPT_NO_MERGED(&filter, N_("print only tags that are not merged")),
OPT_BOOL(0, "omit-empty", &omit_empty, OPT_BOOL(0, "omit-empty", &format.array_opts.omit_empty,
N_("do not output a newline after empty formatted refs")), N_("do not output a newline after empty formatted refs")),
OPT_REF_SORT(&sorting_options), OPT_REF_SORT(&sorting_options),
{ {

View File

@ -92,6 +92,11 @@ struct ref_format {


/* List of bases for ahead-behind counts. */ /* List of bases for ahead-behind counts. */
struct string_list bases; struct string_list bases;

struct {
int max_count;
int omit_empty;
} array_opts;
}; };


#define REF_FILTER_INIT { \ #define REF_FILTER_INIT { \