[GSoC RFC PATCH 2/5] repo-info: add the --format flag

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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)





[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux