Add the --format flag to the repo-info command, allowing the user to choose betwen the 'json' and 'plaintext' formats as output. Also add a flag --allow-empty, which will force the output data to be empty when no field is requested. Mentored-by: Karthik Nayak <karthik.188@xxxxxxxxx> Mentored-by Patrick Steinhardt <ps@xxxxxx> Signed-off-by: Lucas Seiki Oshiro <lucasseikioshiro@xxxxxxxxx> --- builtin/repo-info.c | 79 ++++++++++++++++++++++++++++++++++++++++++-- t/meson.build | 1 + t/t1518-repo-info.sh | 49 +++++++++++++++++++++++++++ 3 files changed, 127 insertions(+), 2 deletions(-) create mode 100755 t/t1518-repo-info.sh diff --git a/builtin/repo-info.c b/builtin/repo-info.c index 4615b988d8..4d539a17fb 100644 --- a/builtin/repo-info.c +++ b/builtin/repo-info.c @@ -1,22 +1,97 @@ #include "builtin.h" +#include "hash.h" +#include "json-writer.h" #include "parse-options.h" +#include "refs.h" + +enum output_format { + FORMAT_PLAINTEXT, + FORMAT_JSON +}; + +struct repo_info { + struct repository *repo; + enum output_format format; +}; + +static void repo_info_init(struct repo_info *repo_info, + struct repository *repo, + char *format, + int allow_empty UNUSED, + int argc UNUSED, + const char **argv UNUSED + ) { + repo_info->repo = repo; + + if (format == NULL || !strcmp(format, "json")) + repo_info->format = FORMAT_JSON; + else if (!strcmp(format, "plaintext")) + repo_info->format = FORMAT_PLAINTEXT; + else + die("invalid format %s", format); +} + +static void repo_info_print_plaintext(struct repo_info *repo_info UNUSED) { +} + +static void repo_info_print_json(struct repo_info *repo_info UNUSED) +{ + struct json_writer jw; + + jw_init(&jw); + + jw_object_begin(&jw, 1); + jw_end(&jw); + + puts(jw.json.buf); + jw_release(&jw); +} + +static void repo_info_print(struct repo_info *repo_info) +{ + enum output_format format = repo_info->format; + + switch (format) { + case FORMAT_PLAINTEXT: + repo_info_print_plaintext(repo_info); + break; + case FORMAT_JSON: + repo_info_print_json(repo_info); + break; + } +} int cmd_repo_info( int argc, const char **argv, const char *prefix, - struct repository *repo UNUSED + struct repository *repo ) { const char *const repo_info_usage[] = { "git repo-info", NULL }; + struct repo_info repo_info; + char *format = NULL; + int allow_empty = 0; struct option options[] = { + OPT_STRING(0, + "format", + &format, + N_("format"), + N_("output format")), + OPT_BOOL(0, + "allow-empty", + &allow_empty, + "when set, it will use an empty set of fields if no field is requested"), OPT_END() }; - argc = parse_options(argc, argv, prefix, options, repo_info_usage, 0); + argc = parse_options(argc, argv, prefix, options, repo_info_usage, + PARSE_OPT_KEEP_UNKNOWN_OPT); + repo_info_init(&repo_info, repo, format, allow_empty, argc, argv); + repo_info_print(&repo_info); return 0; } diff --git a/t/meson.build b/t/meson.build index 50e89e764a..c24e197c60 100644 --- a/t/meson.build +++ b/t/meson.build @@ -241,6 +241,7 @@ integration_tests = [ 't1514-rev-parse-push.sh', 't1515-rev-parse-outside-repo.sh', 't1517-outside-repo.sh', + 't1518-repo-info.sh', 't1600-index.sh', 't1601-index-bogus.sh', 't1700-split-index.sh', diff --git a/t/t1518-repo-info.sh b/t/t1518-repo-info.sh new file mode 100755 index 0000000000..2e1a6f0c34 --- /dev/null +++ b/t/t1518-repo-info.sh @@ -0,0 +1,49 @@ +#!/bin/sh + +test_description='test git repo-info' +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME + +. ./test-lib.sh + +parse_json () { + tr '\n' ' ' | "$PERL_PATH" "$TEST_DIRECTORY/t0019/parse_json.perl" +} + +test_repo_info () { + label=$1 + init_args=$2 + key=$3 + expected_value=$4 + + test_expect_success "json: $label" " + test_when_finished 'rm -rf repo' && + git init $init_args repo && + cd repo && + echo '$expected_value' >expect && + git repo-info '$key'| parse_json >output && + grep -F 'row[0].$key' output | cut -d ' ' -f 2 >actual && + test_cmp expect actual + " + + test_expect_success "plaintext: $label" " + test_when_finished 'rm -rf repo' && + git init $init_args repo && + cd repo && + echo '$expected_value' >expect && + git repo-info --format=plaintext '$key' >actual && + test_cmp expect actual + " +} + +test_expect_success 'json: returns empty output with allow-empty' ' + git repo-info --allow-empty --format=json >output && + test_line_count = 2 output +' + +test_expect_success 'plaintext: returns empty output with allow-empty' ' + git repo-info --allow-empty --format=plaintext >output && + test_line_count = 0 output +' + +test_done -- 2.39.5 (Apple Git-154)