git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v3 4/5] tests: turn GPG, GPGSM and RFC1991 into lazy prereqs

From
Johannes Schindelin via GitGitGadget <gitgitgadget@gmail.com>
Date
Mar 26, 2020, 15:35 UTC
Message-ID
<f69f97e24ba8fc931e7c86931756e1a176348f3c.1585236929.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.728.v3.git.git.1585236929.gitgitgadget@gmail.com>
From: Johannes Schindelin <johannes.schindelin@gmx.de>

The code to set those prereqs is executed completely outside of any `test_eval_` block. As a consequence, its output had to be suppressed so that it does not clutter the output of a regular test script run.

Unfortunately, the output *stays* suppressed even when the `--verbose` option is in effect.

This hid important output when debugging why the GPG prereq was not enabled in the Windows part of our CI builds.

In preparation for fixing that, let's move all of this code into lazy prereqs.

The only slightly tricky part is the global environment variable `GNUPGHOME`. Originally, it was configured only when we verified that there is a `gpg` in the `PATH` that we can use. This is now no longer possible, as lazy prereqs are evaluated in a subshell that changes the working directory to a temporary one. Therefore, we simply _always_ set that environment variable: it does not hurt anything because it does not indicate the presence of a working GPG.

Side note: it was quite tempting to use a hack that is possible because we do not validate what is passed to `test_lazy_prereq` (and it is therefore possible to "break out" of the lazy_prereq subshell:

	test_lazy_prereq GPG '...) && GNUPGHOME=... && (...'

However, this is rather tricksy hobbitses code, and the current patch is _much_ easier to understand.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 t/lib-gpg.sh | 102 ++++++++++++++++++++++++++++-----------------------
 1 file changed, 57 insertions(+), 45 deletions(-)
diff --git a/t/lib-gpg.sh b/t/lib-gpg.sh
index 4ead1268351..7a78c562e8d 100755
--- a/t/lib-gpg.sh
+++ b/t/lib-gpg.sh
@@ -1,12 +1,25 @@
-gpg_version=$(gpg --version 2>&1)
-if test $? != 127
-then
+# We always set GNUPGHOME, even if no usable GPG was found, as
+#
+# - It does not hurt, and
+#
+# - we cannot set global environment variables in lazy prereqs because they are
+#   executed in an eval'ed subshell that changes the working directory to a
+#   temporary one.
+
+GNUPGHOME="$PWD/gpghome"
+export GNUPGHOME
+
+test_lazy_prereq GPG '
+	gpg_version=$(gpg --version 2>&1)
+	test $? != 127 || exit 1
+
 	# As said here: http://www.gnupg.org/documentation/faqs.html#q6.19
-	# the gpg version 1.0.6 didn't parse trust packets correctly, so for
+	# the gpg version 1.0.6 did not parse trust packets correctly, so for
 	# that version, creation of signed tags using the generated key fails.
 	case "$gpg_version" in
-	'gpg (GnuPG) 1.0.6'*)
+	"gpg (GnuPG) 1.0.6"*)
 		say "Your version of gpg (1.0.6) is too buggy for testing"
+		exit 1
 		;;
 	*)
 		# Available key info:
@@ -25,55 +38,54 @@ then
 		# To export ownertrust:
 		#	gpg --homedir /tmp/gpghome --export-ownertrust \
 		#		> lib-gpg/ownertrust
-		mkdir ./gpghome &&
-		chmod 0700 ./gpghome &&
-		GNUPGHOME="$PWD/gpghome" &&
-		export GNUPGHOME &&
+		mkdir "$GNUPGHOME" &&
+		chmod 0700 "$GNUPGHOME" &&
 		(gpgconf --kill gpg-agent >/dev/null 2>&1 || : ) &&
 		gpg --homedir "${GNUPGHOME}" 2>/dev/null --import \
 			"$TEST_DIRECTORY"/lib-gpg/keyring.gpg &&
 		gpg --homedir "${GNUPGHOME}" 2>/dev/null --import-ownertrust \
 			"$TEST_DIRECTORY"/lib-gpg/ownertrust &&
 		gpg --homedir "${GNUPGHOME}" </dev/null >/dev/null 2>&1 \
-			--sign -u committer@example.com &&
-		test_set_prereq GPG &&
-		# Available key info:
-		# * see t/lib-gpg/gpgsm-gen-key.in
-		# To generate new certificate:
-		#  * no passphrase
-		#	gpgsm --homedir /tmp/gpghome/ \
-		#		-o /tmp/gpgsm.crt.user \
-		#		--generate-key \
-		#		--batch t/lib-gpg/gpgsm-gen-key.in
-		# To import certificate:
-		#	gpgsm --homedir /tmp/gpghome/ \
-		#		--import /tmp/gpgsm.crt.user
-		# To export into a .p12 we can later import:
-		#	gpgsm --homedir /tmp/gpghome/ \
-		#		-o t/lib-gpg/gpgsm_cert.p12 \
-		#		--export-secret-key-p12 "committer@example.com"
-		echo | gpgsm --homedir "${GNUPGHOME}" 2>/dev/null \
-			--passphrase-fd 0 --pinentry-mode loopback \
-			--import "$TEST_DIRECTORY"/lib-gpg/gpgsm_cert.p12 &&
-
-		gpgsm --homedir "${GNUPGHOME}" 2>/dev/null -K |
-		grep fingerprint: |
-		cut -d" " -f4 |
-		tr -d '\n' >"${GNUPGHOME}/trustlist.txt" &&
-
-		echo " S relax" >>"${GNUPGHOME}/trustlist.txt" &&
-		echo hello | gpgsm --homedir "${GNUPGHOME}" >/dev/null \
-			-u committer@example.com -o /dev/null --sign - 2>&1 &&
-		test_set_prereq GPGSM
+			--sign -u committer@example.com
 		;;
 	esac
-fi
+'
+
+test_lazy_prereq GPGSM '
+	test_have_prereq GPG &&
+	# Available key info:
+	# * see t/lib-gpg/gpgsm-gen-key.in
+	# To generate new certificate:
+	#  * no passphrase
+	#	gpgsm --homedir /tmp/gpghome/ \
+	#		-o /tmp/gpgsm.crt.user \
+	#		--generate-key \
+	#		--batch t/lib-gpg/gpgsm-gen-key.in
+	# To import certificate:
+	#	gpgsm --homedir /tmp/gpghome/ \
+	#		--import /tmp/gpgsm.crt.user
+	# To export into a .p12 we can later import:
+	#	gpgsm --homedir /tmp/gpghome/ \
+	#		-o t/lib-gpg/gpgsm_cert.p12 \
+	#		--export-secret-key-p12 "committer@example.com"
+       echo | gpgsm --homedir "${GNUPGHOME}" 2>/dev/null \
+	       --passphrase-fd 0 --pinentry-mode loopback \
+	       --import "$TEST_DIRECTORY"/lib-gpg/gpgsm_cert.p12 &&
+
+       gpgsm --homedir "${GNUPGHOME}" 2>/dev/null -K |
+       grep fingerprint: |
+       cut -d" " -f4 |
+	tr -d "\\n" >"${GNUPGHOME}/trustlist.txt" &&
+
+       echo " S relax" >>"${GNUPGHOME}/trustlist.txt" &&
+       echo hello | gpgsm --homedir "${GNUPGHOME}" >/dev/null \
+	       -u committer@example.com -o /dev/null --sign - 2>&1
+'
 
-if test_have_prereq GPG &&
-    echo | gpg --homedir "${GNUPGHOME}" -b --rfc1991 >/dev/null 2>&1
-then
-	test_set_prereq RFC1991
-fi
+test_lazy_prereq RFC1991 '
+	test_have_prereq GPG &&
+	echo | gpg --homedir "${GNUPGHOME}" -b --rfc1991 >/dev/null 2>&1
+'
 
 sanitize_pgp() {
 	perl -ne '
-- 
gitgitgadget
Previous: Johannes Schindelin via GitGitGadgetNext: Johannes Schindelin via GitGitGadget
Message 52 of 55 in “Enable GPG in the Windows part of the CI/PR builds”
  1. 0/2 Enable GPG in the Windows part of the CI/PR buildsJohannes Schindelin via GitGitGadget, Mar 23, 2020
  2. 2/2 tests(gpg): increase verbosity to allow debuggingJohannes Schindelin via GitGitGadget, Mar 23, 2020
  3. Jeff KingMar 23, 2020
  4. Jeff KingMar 23, 2020
  5. Junio C HamanoMar 23, 2020
  6. Jeff KingMar 23, 2020
  7. Junio C HamanoMar 23, 2020
  8. Jeff KingMar 23, 2020
  9. Johannes SchindelinMar 24, 2020
  10. Jeff KingMar 24, 2020
  11. Johannes SchindelinMar 24, 2020
  12. Jeff KingMar 24, 2020
  13. 1/2 tests(gpg): allow the gpg-agent to start on WindowsJohannes Schindelin via GitGitGadget, Mar 23, 2020
  14. Junio C HamanoMar 23, 2020
  15. Johannes SchindelinMar 24, 2020
  16. Junio C HamanoMar 24, 2020
  17. Johannes SchindelinMar 24, 2020
  18. Junio C HamanoMar 24, 2020
  19. 0/5 Enable GPG in the Windows part of the CI/PR buildsJohannes Schindelin via GitGitGadget, Mar 25, 2020
  20. 1/5 tests(gpg): allow the gpg-agent to start on WindowsJohannes Schindelin via GitGitGadget, Mar 25, 2020
  21. 2/5 t/lib-gpg.sh: stop pretending to be a stand-alone scriptJohannes Schindelin via GitGitGadget, Mar 25, 2020
  22. Jeff KingMar 26, 2020
  23. Johannes SchindelinMar 26, 2020
  24. Junio C HamanoMar 26, 2020
  25. 3/5 tests: turn GPG, GPGSM and RFC1991 into lazy prereqsJohannes Schindelin via GitGitGadget, Mar 25, 2020
  26. Junio C HamanoMar 25, 2020
  27. Jeff KingMar 26, 2020
  28. Johannes SchindelinMar 26, 2020
  29. Jeff KingMar 27, 2020
  30. Junio C HamanoMar 27, 2020
  31. Eric SunshineMar 27, 2020
  32. Junio C HamanoMar 27, 2020
  33. Jeff KingMar 28, 2020
  34. Jeff KingMar 28, 2020
  35. t/README: suggest how to leave test early with failureJunio C Hamano, Mar 28, 2020
  36. Eric SunshineMar 29, 2020
  37. Jeff KingMar 29, 2020
  38. Johannes SchindelinMar 30, 2020
  39. Jeff KingMar 31, 2020
  40. 4/5 tests: do not let lazy prereqs inside `test_expect_*` turn off tracingJohannes Schindelin via GitGitGadget, Mar 25, 2020
  41. Junio C HamanoMar 25, 2020
  42. Johannes SchindelinMar 26, 2020
  43. Jeff KingMar 26, 2020
  44. Johannes SchindelinMar 26, 2020
  45. 5/5 tests: increase the verbosity of the GPG-related prereqsJohannes Schindelin via GitGitGadget, Mar 25, 2020
  46. Jeff KingMar 26, 2020
  47. Johannes SchindelinMar 26, 2020
  48. 0/5 Enable GPG in the Windows part of the CI/PR buildsJohannes Schindelin via GitGitGadget, Mar 26, 2020
  49. 2/5 t/lib-gpg.sh: stop pretending to be a stand-alone scriptJohannes Schindelin via GitGitGadget, Mar 26, 2020
  50. 1/5 tests(gpg): allow the gpg-agent to start on WindowsJohannes Schindelin via GitGitGadget, Mar 26, 2020
  51. 3/5 tests: do not let lazy prereqs inside `test_expect_*` turn off tracingJohannes Schindelin via GitGitGadget, Mar 26, 2020
  52. 4/5 tests: turn GPG, GPGSM and RFC1991 into lazy prereqsJohannes Schindelin via GitGitGadget, Mar 26, 2020
  53. 5/5 tests: increase the verbosity of the GPG-related prereqsJohannes Schindelin via GitGitGadget, Mar 26, 2020
  54. Jeff KingMar 27, 2020
  55. Junio C HamanoMar 27, 2020

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.