Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
info: --raw now export a valid json for multiple packages
Baptiste Daroussin committed 2 months ago
commit 99f104c33cb4753cc384e6482cd5c885eeacb121
parent bfd8a58
3 files changed +102 -2
modified src/info.c
@@ -91,6 +91,8 @@ exec_info(int argc, char **argv)
	bool pkg_exists = false;
	bool origin_search = false;
	bool e_flag = false;
+
	bool json_array = false;
+
	bool json_first = true;
#ifdef HAVE_CAPSICUM
	cap_rights_t rights;
#endif
@@ -323,6 +325,12 @@ exec_info(int argc, char **argv)
		return (EXIT_FAILURE);
	}

+
	if ((opt & INFO_RAW) &&
+
	    (opt & (INFO_RAW_JSON | INFO_RAW_JSON_COMPACT))) {
+
		json_array = true;
+
		printf("[");
+
	}
+

	i = 0;
	do {
		gotone = false;
@@ -496,8 +504,14 @@ exec_info(int argc, char **argv)
			}
			if (pkg_exists)
				retcode = EXIT_SUCCESS;
-
			else
+
			else {
+
				if (json_array) {
+
					if (!json_first)
+
						printf(",");
+
					json_first = false;
+
				}
				print_info(db, pkg, opt);
+
			}
		}
		if (ret != EPKG_END) {
			retcode = EXIT_FAILURE;
@@ -514,6 +528,9 @@ exec_info(int argc, char **argv)
		i++;
	} while (i < argc);

+
	if (json_array)
+
		printf("]\n");
+

cleanup:
	pkg_free(pkg);

modified tests/Makefile.autosetup
@@ -74,7 +74,8 @@ TESTS_SH= \
	frontend/backup_lib.sh \
	frontend/abi.sh \
	frontend/http.sh \
-
	frontend/triggers.sh
+
	frontend/triggers.sh \
+
	frontend/info.sh

#
# These files are mostly simple binaries obtained from
added tests/frontend/info.sh
@@ -0,0 +1,82 @@
+
#! /usr/bin/env atf-sh
+

+
. $(atf_get_srcdir)/test_environment.sh
+

+
tests_init \
+
	raw_json_single \
+
	raw_json_multiple \
+
	raw_json_compact_multiple \
+
	raw_json_all
+

+
raw_json_single_body() {
+
	atf_require python3 "Requires python3 to run this test"
+
	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkgA" "pkgA" "1.0" "/"
+
	touch a
+
	echo ${TMPDIR}/a > plist
+
	atf_check pkg create -M pkgA.ucl -p plist
+
	atf_check -o ignore pkg add pkgA-1.0.pkg
+
	# Single package raw JSON should be valid JSON (array with one element)
+
	atf_check -o save:out.json pkg info --raw --raw-format json pkgA
+
	atf_check -o ignore -e empty python3 -m json.tool out.json
+
}
+

+
raw_json_multiple_body() {
+
	atf_require python3 "Requires python3 to run this test"
+
	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkgA" "pkgA" "1.0" "/"
+
	touch a
+
	echo ${TMPDIR}/a > plist
+
	atf_check pkg create -M pkgA.ucl -p plist
+
	atf_check -o ignore pkg add pkgA-1.0.pkg
+

+
	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkgB" "pkgB" "2.0" "/"
+
	touch b
+
	echo ${TMPDIR}/b > plist
+
	atf_check pkg create -M pkgB.ucl -p plist
+
	atf_check -o ignore pkg add pkgB-2.0.pkg
+

+
	# Two packages raw JSON must be a valid JSON array
+
	atf_check -o save:out.json pkg info --raw --raw-format json pkgA pkgB
+
	atf_check -o ignore -e empty python3 -m json.tool out.json
+
	# Verify it is a JSON array with 2 elements
+
	atf_check -o inline:"2\n" python3 -c "import json; print(len(json.load(open('out.json'))))"
+
}
+

+
raw_json_compact_multiple_body() {
+
	atf_require python3 "Requires python3 to run this test"
+
	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkgA" "pkgA" "1.0" "/"
+
	touch a
+
	echo ${TMPDIR}/a > plist
+
	atf_check pkg create -M pkgA.ucl -p plist
+
	atf_check -o ignore pkg add pkgA-1.0.pkg
+

+
	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkgB" "pkgB" "2.0" "/"
+
	touch b
+
	echo ${TMPDIR}/b > plist
+
	atf_check pkg create -M pkgB.ucl -p plist
+
	atf_check -o ignore pkg add pkgB-2.0.pkg
+

+
	# json-compact with multiple packages must also be valid JSON
+
	atf_check -o save:out.json pkg info --raw --raw-format json-compact pkgA pkgB
+
	atf_check -o ignore -e empty python3 -m json.tool out.json
+
	atf_check -o inline:"2\n" python3 -c "import json; print(len(json.load(open('out.json'))))"
+
}
+

+
raw_json_all_body() {
+
	atf_require python3 "Requires python3 to run this test"
+
	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkgA" "pkgA" "1.0" "/"
+
	touch a
+
	echo ${TMPDIR}/a > plist
+
	atf_check pkg create -M pkgA.ucl -p plist
+
	atf_check -o ignore pkg add pkgA-1.0.pkg
+

+
	atf_check -s exit:0 sh ${RESOURCEDIR}/test_subr.sh new_pkg "pkgB" "pkgB" "2.0" "/"
+
	touch b
+
	echo ${TMPDIR}/b > plist
+
	atf_check pkg create -M pkgB.ucl -p plist
+
	atf_check -o ignore pkg add pkgB-2.0.pkg
+

+
	# -a with raw JSON must be a valid JSON array
+
	atf_check -o save:out.json pkg info -a --raw --raw-format json
+
	atf_check -o ignore -e empty python3 -m json.tool out.json
+
	atf_check -o inline:"2\n" python3 -c "import json; print(len(json.load(open('out.json'))))"
+
}