On Mon, Jul 14, 2025 at 08:52:29PM -0300, Lucas Seiki Oshiro wrote: > diff --git a/builtin/repo.c b/builtin/repo.c > index a1787a3cc5..dcda0d6d61 100644 > --- a/builtin/repo.c > +++ b/builtin/repo.c > @@ -1,11 +1,95 @@ > #include "builtin.h" > #include "parse-options.h" > +#include "strbuf.h" > +#include "refs.h" > > -static int repo_info(int argc UNUSED, > - const char **argv UNUSED, > +typedef void add_field_fn(struct strbuf *buf, struct repository *repo); > + > +struct field { > + const char *key; > + add_field_fn *add_field_callback; > +}; > + > +static void add_string(struct strbuf *buf, > + const char *key, const char *value) > +{ > + strbuf_addf(buf, "%s\n%s%c", key, value, '\0'); > +} > + > +static void add_references_format(struct strbuf *buf, > + struct repository *repo) > +{ > + add_string(buf, "references.format", > + ref_storage_format_to_name(repo->ref_storage_format)); > +} > + > +// repo_info_fields keys should be in lexicographical order Style: we don't use '//' comments. > +static const struct field repo_info_fields[] = { > + {"references.format", add_references_format}, Style: we tend to have a space between curly braces and their inner content. > +static void print_fields(int argc, const char **argv, struct repository *repo) { Style: the opening brace for functions should be on their own line. > + const char *last = ""; > + struct strbuf buf; > + strbuf_init(&buf, 256); > + > + QSORT(argv, argc, qsort_strcmp); > + > + for (int i = 0; i < argc; i++) { > + add_field_fn *callback; > + const char *key = argv[i]; > + > + if (!strcmp(key, last)) > + continue; > + > + callback = get_append_callback(key); > + > + if (!callback) { > + error("key %s not found", key); > + strbuf_release(&buf); > + exit(1); > + } > + > + callback(&buf, repo); > + last = key; > + } > + > + fwrite(buf.buf, 1, buf.len, stdout); > + strbuf_release(&buf); Is there any reason why the callback appends to a buffer instead of printing the data immediately? Patrick