diff options
| -rw-r--r-- | Documentation/git-repo.adoc | 40 | ||||
| -rw-r--r-- | builtin/repo.c | 46 | ||||
| -rwxr-xr-x | t/t1900-repo.sh | 18 |
3 files changed, 88 insertions, 16 deletions
diff --git a/Documentation/git-repo.adoc b/Documentation/git-repo.adoc index 01b7f9c95e..2870828d93 100644 --- a/Documentation/git-repo.adoc +++ b/Documentation/git-repo.adoc @@ -8,7 +8,7 @@ git-repo - Retrieve information about the repository SYNOPSIS -------- [synopsis] -git repo info [<key>...] +git repo info [--format=(keyvalue|nul)] [<key>...] DESCRIPTION ----------- @@ -18,7 +18,7 @@ THIS COMMAND IS EXPERIMENTAL. THE BEHAVIOR MAY CHANGE. COMMANDS -------- -`info [<key>...]`:: +`info [--format=(keyvalue|nul)] [<key>...]`:: Retrieve metadata-related information about the current repository. Only the requested data will be returned based on their keys (see "INFO KEYS" section below). @@ -26,14 +26,23 @@ COMMANDS The values are returned in the same order in which their respective keys were requested. + -The output format consists of key-value pairs one per line using the `=` -character as the delimiter between the key and the value. Values containing -"unusual" characters are quoted as explained for the configuration variable -`core.quotePath` (see linkgit:git-config[1]). +The output format can be chosen through the flag `--format`. Two formats are +supported: ++ +`keyvalue`::: + output key-value pairs one per line using the `=` character as + the delimiter between the key and the value. Values containing "unusual" + characters are quoted as explained for the configuration variable + `core.quotePath` (see linkgit:git-config[1]). This is the default. + +`nul`::: + similar to `keyvalue`, but using a newline character as the delimiter + between the key and the value and using a NUL character after each value. + This format is better suited for being parsed by another applications than + `keyvalue`. Unlike in the `keyvalue` format, the values are never quoted. INFO KEYS --------- - In order to obtain a set of values from `git repo info`, you should provide the keys that identify them. Here's a list of the available keys and the values that they return: @@ -49,6 +58,23 @@ values that they return: + include::ref-storage-format.adoc[] +EXAMPLES +-------- + +* Retrieves the reference format of the current repository: ++ +------------ +git repo info references.format +------------ ++ + +* Retrieves whether the current repository is bare and whether it is shallow +using the `nul` format: ++ +------------ +git repo info --format=nul layout.bare layout.shallow +------------ + SEE ALSO -------- linkgit:git-rev-parse[1] 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, diff --git a/t/t1900-repo.sh b/t/t1900-repo.sh index 6a9cbf3d47..a69c715357 100755 --- a/t/t1900-repo.sh +++ b/t/t1900-repo.sh @@ -25,11 +25,17 @@ test_repo_info () { eval "$init_command $repo_name" ' - test_expect_success "$label" ' - echo "$key=$expected_value" >expect && - git -C $repo_name repo info "$key" >actual && + test_expect_success "keyvalue: $label" ' + echo "$key=$expected_value" > expect && + git -C "$repo_name" repo info "$key" >actual && test_cmp expect actual ' + + test_expect_success "nul: $label" ' + printf "%s\n%s\0" "$key" "$expected_value" >expect && + git -C "$repo_name" repo info --format=nul "$key" >actual && + test_cmp_bin expect actual + ' } test_repo_info 'ref format files is retrieved correctly' \ @@ -80,4 +86,10 @@ test_expect_success 'git-repo-info outputs data even if there is an invalid fiel test_cmp expect actual ' +test_expect_success 'git-repo-info aborts when requesting an invalid format' ' + echo "fatal: invalid format ${SQ}foo${SQ}" >expect && + test_must_fail git repo info --format=foo 2>actual && + test_cmp expect actual +' + test_done |
