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

Re: [PATCH v3] commit-tree: add missing --gpg-sign flag

From
MÅMartin Ågren <martin.agren@gmail.com>
Date
Jan 19, 2019, 15:45 UTC
Message-ID
<20190119154552.12189-1-martin.agren@gmail.com>
In-Reply-To
<20190119033530.4241-1-brandon1024.br@gmail.com>
Hi Brandon,
Thanks for a v3.
On Sat, 19 Jan 2019 at 04:36, Brandon Richardson <brandon1024.br@gmail.com> wrote:
> -		if (skip_prefix(arg, "-S", &sign_commit))
> +		if(!strcmp(arg, "--gpg-sign")) {
(Same nit as Junio about the missing space after "if".)
> +			sign_commit = "";
Nice. ;-)
> +			continue;
> +		}
Show 14 quoted lines
>	# commit.gpgsign is still on but this must not be signed
>	git tag ninth-unsigned $(echo 9 | git commit-tree HEAD^{tree}) &&
>	# explicit -S of course must sign.
> -	git tag tenth-signed $(echo 9 | git commit-tree -S HEAD^{tree})
> +	git tag tenth-signed $(echo 10 | git commit-tree -S HEAD^{tree}) &&
> +
> +	# --gpg-sign[=<key-id>] must sign.
> +	echo 11 >file && test_tick && git commit -S -a -m "eleventh signed" &&
> +	git tag eleventh-signed &&
> +	git commit-tree --gpg-sign -m "twelfth signed" HEAD^{tree} &&
> +	git tag twelfth-signed &&
> +    git commit-tree --gpg-sign=B7227189 -m "thirteenth signed" HEAD^{tree} &&
> +    git tag thirteenth-signed
>  '

(These last two lines are not tab-indented, but indented by four spaces. They were perhaps mangled by some copy-pasting.)

Running this test, we end up with three tags on one commit: eleventh-signed, twelfth-signed and thirteenth-signed. So as long as `git commit -S` works when we use the number 11, everything will pass, and we won't really test what we wanted to test. We will verify that `git commit-tree` doesn't choke on "--gpg-sign[=foo]", but we won't verify that it handles it correctly.

(Just recently, it was pointed out on this list that `git log --count` won't complain about "--count", but won't act on it, either. So such errors are not unheard of.)

I looked into this test in a bit more detail, and it seems to be quite hard to get right. Part of the reason is that `git commit-tree` requires a bit more careful use than `git commit`, but part of it is that the tests that we already have for `git commit-tree [-S]` right before the ones you're adding are a bit too loose, IMHO. So they're not ideal for copy-pasting... I've come up with the patch below, which you might want to use as a basis for your work.

That is, you could `git am --scissors` this patch on a fresh branch and `git commit --amend --signoff --no-edit` it (see Documentation/SubmittingPatches, "forwarding somebody else's patch"), then base your work on it, e.g., by cherry-picking your v3 commit.

I think you would want to add 2x3 lines of tests (3 for `--gpg-sign`, 3 for `--gpg-sign=...`). That would give you eleventh-signed and twelfth-signed and you wouldn't need any invocation of `git commit` (so no thirteenth-signed).

If you're not up for that, just let me know and I could instead rebase your patch on top of mine and submit both as a v4. I think this has come along nicely, and now it's really just about having a robust test.

Martin
-- >8 --
Subject: [PATCH] t7510: invoke git as part of &&-chain

If `git commit-tree HEAD^{tree}` fails on us and produces no output on stdout, we will substitute that empty string and execute `git tag ninth-unsigned`, i.e., we will tag HEAD rather than a newly created object. But we are lucky: we have a signature on HEAD, so we should eventually fail the next test, where we verify that "ninth-unsigned" is indeed unsigned.

We have a similar problem a few lines later. If `git commit-tree -S` fails with no output, we will happily tag HEAD as "tenth-signed". Here, we are not so lucky. The tag ends up on the same commit as "eighth-signed-alt", and that's a signed commit, so t7510-signed-commit will pass, despite `git commit-tree -S` failing.

Make these `git commit-tree` invocations a direct part of the &&-chain, so that we can rely less on luck and set a better example for future tests modeled after this one. Fix a 9/10 copy/paste error while at it.

Signed-off-by: Martin Ågren <martin.agren@gmail.com>
---
 t/t7510-signed-commit.sh | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/t/t7510-signed-commit.sh b/t/t7510-signed-commit.sh
index 86d3f93fa2..58f528b98f 100755
--- a/t/t7510-signed-commit.sh
+++ b/t/t7510-signed-commit.sh
@@ -49,9 +49,13 @@ test_expect_success GPG 'create signed commits' '
 	git tag eighth-signed-alt &&
 
 	# commit.gpgsign is still on but this must not be signed
-	git tag ninth-unsigned $(echo 9 | git commit-tree HEAD^{tree}) &&
+	echo 9 | git commit-tree HEAD^{tree} >oid &&
+	test_line_count = 1 oid &&
+	git tag ninth-unsigned $(cat oid) &&
 	# explicit -S of course must sign.
-	git tag tenth-signed $(echo 9 | git commit-tree -S HEAD^{tree})
+	echo 10 | git commit-tree -S HEAD^{tree} >oid &&
+	test_line_count = 1 oid &&
+	git tag tenth-signed $(cat oid)
 '
 
 test_expect_success GPG 'verify and show signatures' '
-- 
2.20.1.98.gecbdaf0899
Previous: Brandon RichardsonNext: Martin Ågren
Message 2 of 6 in “commit-tree: add missing --gpg-sign flag”
  1. commit-tree: add missing --gpg-sign flagBrandon Richardson, Jan 19, 2019
  2. Martin ÅgrenJan 19, 2019
  3. Martin ÅgrenJan 19, 2019
  4. Brandon RichardsonJan 19, 2019
  5. Martin ÅgrenJan 19, 2019
  6. Brandon RichardsonJan 19, 2019

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.