aboutsummaryrefslogtreecommitdiffstats
path: root/builtin/repo.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2025-11-30 18:31:39 -0800
committerJunio C Hamano <gitster@pobox.com>2025-11-30 18:31:39 -0800
commit0fec747d599c9f8b8304c97f501bf3022b99f5c8 (patch)
tree96d3291135f897f61018b4cf5613926f05a83dc1 /builtin/repo.c
parentb31ab939fe8e3cbe8be48dddd1c6ac0265991f45 (diff)
parent155caac7d1fa981b21192c598cf9bbffdb5aea12 (diff)
downloadgit-0fec747d599c9f8b8304c97f501bf3022b99f5c8.tar.gz
Merge branch 'lo/repo-info-all'
"git repo info" learned "--all" option. * lo/repo-info-all: repo: add --all to git-repo-info repo: factor out field printing to dedicated function
Diffstat (limited to 'builtin/repo.c')
-rw-r--r--builtin/repo.c63
1 files changed, 45 insertions, 18 deletions
diff --git a/builtin/repo.c b/builtin/repo.c
index 40cda71d50..2a653bd3ea 100644
--- a/builtin/repo.c
+++ b/builtin/repo.c
@@ -15,7 +15,7 @@
#include "utf8.h"
static const char *const repo_usage[] = {
- "git repo info [--format=(keyvalue|nul)] [-z] [<key>...]",
+ "git repo info [--format=(keyvalue|nul)] [-z] [--all | <key>...]",
"git repo structure [--format=(table|keyvalue|nul)]",
NULL
};
@@ -85,13 +85,29 @@ static get_value_fn *get_value_fn_for_key(const char *key)
return found ? found->get_value : NULL;
}
+static void print_field(enum output_format format, const char *key,
+ const char *value)
+{
+ switch (format) {
+ case FORMAT_KEYVALUE:
+ printf("%s=", key);
+ quote_c_style(value, NULL, stdout, 0);
+ putchar('\n');
+ break;
+ case FORMAT_NUL_TERMINATED:
+ printf("%s\n%s%c", key, value, '\0');
+ break;
+ default:
+ BUG("not a valid output format: %d", format);
+ }
+}
+
static int print_fields(int argc, const char **argv,
struct repository *repo,
enum output_format format)
{
int ret = 0;
struct strbuf valbuf = STRBUF_INIT;
- struct strbuf quotbuf = STRBUF_INIT;
for (int i = 0; i < argc; i++) {
get_value_fn *get_value;
@@ -105,28 +121,31 @@ static int print_fields(int argc, const char **argv,
}
strbuf_reset(&valbuf);
- strbuf_reset(&quotbuf);
-
get_value(repo, &valbuf);
-
- switch (format) {
- case FORMAT_KEYVALUE:
- quote_c_style(valbuf.buf, &quotbuf, NULL, 0);
- printf("%s=%s\n", key, quotbuf.buf);
- break;
- case FORMAT_NUL_TERMINATED:
- printf("%s\n%s%c", key, valbuf.buf, '\0');
- break;
- default:
- BUG("not a valid output format: %d", format);
- }
+ print_field(format, key, valbuf.buf);
}
strbuf_release(&valbuf);
- strbuf_release(&quotbuf);
return ret;
}
+static int print_all_fields(struct repository *repo,
+ enum output_format format)
+{
+ struct strbuf valbuf = STRBUF_INIT;
+
+ for (size_t i = 0; i < ARRAY_SIZE(repo_info_fields); i++) {
+ const struct field *field = &repo_info_fields[i];
+
+ strbuf_reset(&valbuf);
+ field->get_value(repo, &valbuf);
+ print_field(format, field->key, valbuf.buf);
+ }
+
+ strbuf_release(&valbuf);
+ return 0;
+}
+
static int parse_format_cb(const struct option *opt,
const char *arg, int unset UNUSED)
{
@@ -150,6 +169,7 @@ static int cmd_repo_info(int argc, const char **argv, const char *prefix,
struct repository *repo)
{
enum output_format format = FORMAT_KEYVALUE;
+ int all_keys = 0;
struct option options[] = {
OPT_CALLBACK_F(0, "format", &format, N_("format"),
N_("output format"),
@@ -158,6 +178,7 @@ static int cmd_repo_info(int argc, const char **argv, const char *prefix,
N_("synonym for --format=nul"),
PARSE_OPT_NONEG | PARSE_OPT_NOARG,
parse_format_cb),
+ OPT_BOOL(0, "all", &all_keys, N_("print all keys/values")),
OPT_END()
};
@@ -165,7 +186,13 @@ static int cmd_repo_info(int argc, const char **argv, const char *prefix,
if (format != FORMAT_KEYVALUE && format != FORMAT_NUL_TERMINATED)
die(_("unsupported output format"));
- return print_fields(argc, argv, repo, format);
+ if (all_keys && argc)
+ die(_("--all and <key> cannot be used together"));
+
+ if (all_keys)
+ return print_all_fields(repo, format);
+ else
+ return print_fields(argc, argv, repo, format);
}
struct ref_stats {