diff --git a/Documentation/git-repo.adoc b/Documentation/git-repo.adoc index 7d70270dfa..4471816cc8 100644 --- a/Documentation/git-repo.adoc +++ b/Documentation/git-repo.adoc @@ -8,8 +8,9 @@ git-repo - Retrieve information about the repository SYNOPSIS -------- [synopsis] -git repo info [--format=(keyvalue|nul) | -z] [--all | ...] -git repo structure [--format=(table|keyvalue|nul) | -z] +git repo info [--format=(default|keyvalue|nul) | -z] [--all | ...] +git repo info --keys [--format=(default|nul) | -z] +git repo structure [--format=(default|table|keyvalue|nul) | -z] DESCRIPTION ----------- @@ -19,7 +20,7 @@ THIS COMMAND IS EXPERIMENTAL. THE BEHAVIOR MAY CHANGE. COMMANDS -------- -`info [--format=(keyvalue|nul) | -z] [--all | ...]`:: +`info [--format=(default|keyvalue|nul) | -z] [--all | ...]`:: Retrieve metadata-related information about the current repository. Only the requested data will be returned based on their keys (see "INFO KEYS" section below). @@ -30,11 +31,14 @@ requested. The `--all` flag requests the values for all the available keys. The output format can be chosen through the flag `--format`. Two formats are supported: + +`default`::: + synonym for `keyvalue`. + `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. + `core.quotePath` (see linkgit:git-config[1]). `nul`::: similar to `keyvalue`, but using a newline character as the delimiter @@ -44,7 +48,17 @@ supported: + `-z` is an alias for `--format=nul`. -`structure [--format=(table|keyvalue|nul) | -z]`:: +`info --keys [--format=(default|nul) | -z]`:: + List all the available keys, one per line. The output format can be chosen + through the flag `--format`. The following formats are supported: ++ +`default`::: + output the keys one per line. + +`nul`::: + similar to `default`, but using a NUL character after each value. + +`structure [--format=(default|table|keyvalue|nul) | -z]`:: Retrieve statistics about the current repository structure. The following kinds of information are reported: + @@ -56,10 +70,12 @@ supported: The output format can be chosen through the flag `--format`. Three formats are supported: + +`default`::: + synonym for `table`. + `table`::: Outputs repository stats in a human-friendly table. This format may - change and is not intended for machine parsing. This is the default - format. + change and is not intended for machine parsing. `keyvalue`::: Each line of output contains a key-value pair for a repository stat. diff --git a/builtin/repo.c b/builtin/repo.c index 0ea045abc1..bc10b2da0b 100644 --- a/builtin/repo.c +++ b/builtin/repo.c @@ -17,14 +17,16 @@ #include "utf8.h" static const char *const repo_usage[] = { - "git repo info [--format=(keyvalue|nul) | -z] [--all | ...]", - "git repo structure [--format=(table|keyvalue|nul) | -z]", + "git repo info [--format=(default|keyvalue|nul) | -z] [--all | ...]", + "git repo info --keys [--format=(default|nul) | -z]", + "git repo structure [--format=(default|table|keyvalue|nul) | -z]", NULL }; typedef int get_value_fn(struct repository *repo, struct strbuf *buf); enum output_format { + FORMAT_DEFAULT, FORMAT_TABLE, FORMAT_KEYVALUE, FORMAT_NUL_TERMINATED, @@ -148,6 +150,29 @@ static int print_all_fields(struct repository *repo, return 0; } +static int print_keys(enum output_format format) +{ + char sep; + + switch (format) { + case FORMAT_DEFAULT: + sep = '\n'; + break; + case FORMAT_NUL_TERMINATED: + sep = '\0'; + break; + default: + die(_("--keys can only be used with --format=default or --format=nul")); + } + + for (size_t i = 0; i < ARRAY_SIZE(repo_info_fields); i++) { + const struct field *field = &repo_info_fields[i]; + printf("%s%c", field->key, sep); + } + + return 0; +} + static int parse_format_cb(const struct option *opt, const char *arg, int unset UNUSED) { @@ -161,6 +186,8 @@ static int parse_format_cb(const struct option *opt, *format = FORMAT_KEYVALUE; else if (!strcmp(arg, "table")) *format = FORMAT_TABLE; + else if (!strcmp(arg, "default")) + *format = FORMAT_DEFAULT; else die(_("invalid format '%s'"), arg); @@ -170,8 +197,9 @@ static int parse_format_cb(const struct option *opt, static int cmd_repo_info(int argc, const char **argv, const char *prefix, struct repository *repo) { - enum output_format format = FORMAT_KEYVALUE; + enum output_format format = FORMAT_DEFAULT; int all_keys = 0; + int show_keys = 0; struct option options[] = { OPT_CALLBACK_F(0, "format", &format, N_("format"), N_("output format"), @@ -181,10 +209,21 @@ static int cmd_repo_info(int argc, const char **argv, const char *prefix, PARSE_OPT_NONEG | PARSE_OPT_NOARG, parse_format_cb), OPT_BOOL(0, "all", &all_keys, N_("print all keys/values")), + OPT_BOOL(0, "keys", &show_keys, N_("show keys")), OPT_END() }; argc = parse_options(argc, argv, prefix, options, repo_usage, 0); + + if (show_keys && (all_keys || argc)) + die(_("--keys cannot be used with a or --all")); + + if (show_keys) + return print_keys(format); + + if (format == FORMAT_DEFAULT) + format = FORMAT_KEYVALUE; + if (format != FORMAT_KEYVALUE && format != FORMAT_NUL_TERMINATED) die(_("unsupported output format")); @@ -638,7 +677,7 @@ static int cmd_repo_structure(int argc, const char **argv, const char *prefix, struct stats_table table = { .rows = STRING_LIST_INIT_DUP, }; - enum output_format format = FORMAT_TABLE; + enum output_format format = FORMAT_DEFAULT; struct repo_structure stats = { 0 }; struct rev_info revs; int show_progress = -1; @@ -658,6 +697,9 @@ static int cmd_repo_structure(int argc, const char **argv, const char *prefix, if (argc) usage(_("too many arguments")); + if (format == FORMAT_DEFAULT) + format = FORMAT_TABLE; + repo_init_revisions(repo, &revs, prefix); if (show_progress < 0) diff --git a/t/t1900-repo.sh b/t/t1900-repo.sh index 51d55f11a5..14533b95a0 100755 --- a/t/t1900-repo.sh +++ b/t/t1900-repo.sh @@ -4,15 +4,6 @@ test_description='test git repo-info' . ./test-lib.sh -# git-repo-info keys. It must contain the same keys listed in the const -# repo_info_fields, in lexicographical order. -REPO_INFO_KEYS=' - layout.bare - layout.shallow - object.format - references.format -' - # Test whether a key-value pair is correctly returned # # Usage: test_repo_info