diff options
| author | Lucas Seiki Oshiro <lucasseikioshiro@gmail.com> | 2025-08-16 19:46:03 -0300 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2025-08-17 09:13:41 -0700 |
| commit | a81224d12818e94a2e3c257ee2e5b0f3169da12b (patch) | |
| tree | 29a6a23f4ab3c71fe94d8daaf37cc504b5b795ba /builtin | |
| parent | e52cd654c9b21a98817578b8fd668da99053ee2b (diff) | |
| download | git-a81224d12818e94a2e3c257ee2e5b0f3169da12b.tar.gz | |
repo: add the --format flag
Add the --format flag to git-repo-info. By using this flag, the users
can choose the format for obtaining the data they requested.
Given that this command can be used for generating input for other
applications and for being read by end users, it requires at least two
formats: one for being read by humans and other for being read by
machines. Some other Git commands also have two output formats, notably
git-config which was the inspiration for the two formats that were
chosen here:
- keyvalue, where the retrieved data is printed one per line, using =
for delimiting the key and the value. This is the default format,
targeted for end users.
- nul, where the retrieved data is separated by NUL characters, using
the newline character for delimiting the key and the value. This
format is targeted for being read by machines.
Helped-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Helped-by: Junio C Hamano <gitster@pobox.com>
Helped-by: Justin Tobler <jltobler@gmail.com>
Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Mentored-by: Karthik Nayak <karthik.188@gmail.com>
Mentored-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Lucas Seiki Oshiro <lucasseikioshiro@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin')
| -rw-r--r-- | builtin/repo.c | 46 |
1 files changed, 40 insertions, 6 deletions
diff --git a/builtin/repo.c b/builtin/repo.c index 3c9140593b..8c6e7f42ab 100644 --- a/builtin/repo.c +++ b/builtin/repo.c @@ -9,12 +9,17 @@ #include "shallow.h" static const char *const repo_usage[] = { - "git repo info [<key>...]", + "git repo info [--format=(keyvalue|nul)] [<key>...]", NULL }; typedef int get_value_fn(struct repository *repo, struct strbuf *buf); +enum output_format { + FORMAT_KEYVALUE, + FORMAT_NUL_TERMINATED, +}; + struct field { const char *key; get_value_fn *get_value; @@ -65,7 +70,9 @@ static get_value_fn *get_value_fn_for_key(const char *key) return found ? found->get_value : NULL; } -static int print_fields(int argc, const char **argv, struct repository *repo) +static int print_fields(int argc, const char **argv, + struct repository *repo, + enum output_format format) { int ret = 0; struct strbuf valbuf = STRBUF_INIT; @@ -86,8 +93,18 @@ static int print_fields(int argc, const char **argv, struct repository *repo) strbuf_reset("buf); get_value(repo, &valbuf); - quote_c_style(valbuf.buf, "buf, NULL, 0); - printf("%s=%s\n", key, quotbuf.buf); + + switch (format) { + case FORMAT_KEYVALUE: + quote_c_style(valbuf.buf, "buf, 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); + } } strbuf_release(&valbuf); @@ -95,10 +112,27 @@ static int print_fields(int argc, const char **argv, struct repository *repo) return ret; } -static int repo_info(int argc, const char **argv, const char *prefix UNUSED, +static int repo_info(int argc, const char **argv, const char *prefix, struct repository *repo) { - return print_fields(argc - 1, argv + 1, repo); + const char *format_str = "keyvalue"; + enum output_format format; + struct option options[] = { + OPT_STRING(0, "format", &format_str, N_("format"), + N_("output format")), + OPT_END() + }; + + argc = parse_options(argc, argv, prefix, options, repo_usage, 0); + + if (!strcmp(format_str, "keyvalue")) + format = FORMAT_KEYVALUE; + else if (!strcmp(format_str, "nul")) + format = FORMAT_NUL_TERMINATED; + else + die(_("invalid format '%s'"), format_str); + + return print_fields(argc, argv, repo, format); } int cmd_repo(int argc, const char **argv, const char *prefix, |
