git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] contrib/subtree: Add -S/--gpg-sign option
@ 2025-05-28 13:01 Patrik Weiskircher
  2025-05-28 13:01 ` [PATCH 1/2] " Patrik Weiskircher
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Patrik Weiskircher @ 2025-05-28 13:01 UTC (permalink / raw)
  To: git; +Cc: apenwarr, Patrik Weiskircher

Hi!

We use git subtree a lot to manage our dependencies, but recently started
requiring signed commits. This patch adds support for signing commits to
git subtree.

This is my first submission to the Git project - you don't have to be gentle,
but please let me know if I can improve anything.

Thanks!
Patrik

Patrik Weiskircher (2):
  contrib/subtree: Add -S/--gpg-sign option
  contrib/subtree: Add tests for -S/--gpg-sign

 contrib/subtree/git-subtree.adoc   |  20 +++--
 contrib/subtree/git-subtree.sh     |  50 +++++++++----
 contrib/subtree/t/t7900-subtree.sh | 113 +++++++++++++++++++++++++++++
 3 files changed, 164 insertions(+), 19 deletions(-)

-- 
2.49.0


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 1/2] contrib/subtree: Add -S/--gpg-sign option
  2025-05-28 13:01 [PATCH 0/2] contrib/subtree: Add -S/--gpg-sign option Patrik Weiskircher
@ 2025-05-28 13:01 ` Patrik Weiskircher
  2025-05-29 23:45   ` Junio C Hamano
  2025-05-28 13:01 ` [PATCH 2/2] contrib/subtree: Add tests for -S/--gpg-sign Patrik Weiskircher
  2025-05-29 23:15 ` [PATCH 0/2] contrib/subtree: Add -S/--gpg-sign option Junio C Hamano
  2 siblings, 1 reply; 8+ messages in thread
From: Patrik Weiskircher @ 2025-05-28 13:01 UTC (permalink / raw)
  To: git; +Cc: apenwarr, Patrik Weiskircher

If set, forwards the options to commit-tree and merge.

Signed-off-by: Patrik Weiskircher <patrik@pspdfkit.com>
---
 contrib/subtree/git-subtree.adoc | 20 +++++++++----
 contrib/subtree/git-subtree.sh   | 50 +++++++++++++++++++++++---------
 2 files changed, 51 insertions(+), 19 deletions(-)

diff --git a/contrib/subtree/git-subtree.adoc b/contrib/subtree/git-subtree.adoc
index 004abf415b..f550be1a86 100644
--- a/contrib/subtree/git-subtree.adoc
+++ b/contrib/subtree/git-subtree.adoc
@@ -9,14 +9,14 @@ git-subtree - Merge subtrees together and split repository into subtrees
 SYNOPSIS
 --------
 [verse]
-'git subtree' [<options>] -P <prefix> add <local-commit>
-'git subtree' [<options>] -P <prefix> add <repository> <remote-ref>
-'git subtree' [<options>] -P <prefix> merge <local-commit> [<repository>]
-'git subtree' [<options>] -P <prefix> split [<local-commit>]
+'git subtree' [<options>] -P <prefix> [-S[<keyid>]] add <local-commit>
+'git subtree' [<options>] -P <prefix> [-S[<keyid>]] add <repository> <remote-ref>
+'git subtree' [<options>] -P <prefix> [-S[<keyid>]] merge <local-commit> [<repository>]
+'git subtree' [<options>] -P <prefix> [-S[<keyid>]] split [<local-commit>]
 
 [verse]
-'git subtree' [<options>] -P <prefix> pull <repository> <remote-ref>
-'git subtree' [<options>] -P <prefix> push <repository> <refspec>
+'git subtree' [<options>] -P <prefix> [-S[<keyid>]] pull <repository> <remote-ref>
+'git subtree' [<options>] -P <prefix> [-S[<keyid>]] push <repository> <refspec>
 
 DESCRIPTION
 -----------
@@ -149,6 +149,14 @@ OPTIONS FOR ALL COMMANDS
 	want to manipulate.  This option is mandatory
 	for all commands.
 
+-S[<keyid>]::
+--gpg-sign[=<keyid>]::
+--no-gpg-sign::
+	GPG-sign commits. The `keyid` argument is optional and
+	defaults to the committer identity; if specified, it must be
+	stuck to the option without a space. `--no-gpg-sign` is useful to
+	countermand a `--gpg-sign` option given earlier on the command line.
+
 OPTIONS FOR 'add' AND 'merge' (ALSO: 'pull', 'split --rejoin', AND 'push --rejoin')
 -----------------------------------------------------------------------------------
 These options for 'add' and 'merge' may also be given to 'pull' (which
diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh
index 15ae86db1b..b98a708c10 100755
--- a/contrib/subtree/git-subtree.sh
+++ b/contrib/subtree/git-subtree.sh
@@ -26,12 +26,12 @@ then
 fi
 
 OPTS_SPEC="\
-git subtree add   --prefix=<prefix> <commit>
-git subtree add   --prefix=<prefix> <repository> <ref>
-git subtree merge --prefix=<prefix> <commit>
-git subtree split --prefix=<prefix> [<commit>]
-git subtree pull  --prefix=<prefix> <repository> <ref>
-git subtree push  --prefix=<prefix> <repository> <refspec>
+git subtree add   --prefix=<prefix> [-S[<keyid>]] <commit>
+git subtree add   --prefix=<prefix> [-S[<keyid>]] <repository> <ref>
+git subtree merge --prefix=<prefix> [-S[<keyid>]] <commit>
+git subtree split --prefix=<prefix> [-S[<keyid>]] [<commit>]
+git subtree pull  --prefix=<prefix> [-S[<keyid>]] <repository> <ref>
+git subtree push  --prefix=<prefix> [-S[<keyid>]] <repository> <refspec>
 --
 h,help!       show the help
 q,quiet!      quiet
@@ -46,6 +46,7 @@ rejoin        merge the new branch back into HEAD
  options for 'add' and 'merge' (also: 'pull', 'split --rejoin', and 'push --rejoin')
 squash        merge subtree changes as a single commit
 m,message!=   use the given message as the commit message for the merge commit
+S,gpg-sign?key-id   GPG-sign commits. The keyid argument is optional and defaults to the committer identity; if specified, it must be stuck to the option without a space.
 "
 
 indent=0
@@ -102,6 +103,20 @@ assert () {
 	fi
 }
 
+# Usage: gpg_sign_opt
+# Returns the GPG signing option for git commit-tree
+gpg_sign_opt () {
+	if test "${arg_gpg_sign+set}" = "set"
+	then
+		if test -n "$arg_gpg_sign"
+		then
+			printf " -S%s" "$arg_gpg_sign"
+		else
+			printf " -S"
+		fi
+	fi
+}
+
 # Usage: die_incompatible_opt OPTION COMMAND
 die_incompatible_opt () {
 	assert test "$#" = 2
@@ -240,6 +255,15 @@ main () {
 			test -n "$allow_addmerge" || die_incompatible_opt "$opt" "$arg_command"
 			arg_addmerge_squash=
 			;;
+		-S)
+			if test $# -gt 0 && test "${1#-}" = "$1"
+			then
+				arg_gpg_sign="$1"
+				shift
+			else
+				arg_gpg_sign=""
+			fi
+			;;
 		--)
 			break
 			;;
@@ -537,7 +561,7 @@ copy_commit () {
 			printf "%s" "$arg_split_annotate"
 			cat
 		) |
-		git commit-tree "$2" $3  # reads the rest of stdin
+		git commit-tree "$2" $(gpg_sign_opt) $3  # reads the rest of stdin
 	) || die "fatal: can't copy commit $1"
 }
 
@@ -683,10 +707,10 @@ new_squash_commit () {
 	if test -n "$old"
 	then
 		squash_msg "$dir" "$oldsub" "$newsub" |
-		git commit-tree "$tree" -p "$old" || exit $?
+		git commit-tree "$tree" $(gpg_sign_opt) -p "$old" || exit $?
 	else
 		squash_msg "$dir" "" "$newsub" |
-		git commit-tree "$tree" || exit $?
+		git commit-tree "$tree" $(gpg_sign_opt) || exit $?
 	fi
 }
 
@@ -925,11 +949,11 @@ cmd_add_commit () {
 	then
 		rev=$(new_squash_commit "" "" "$rev") || exit $?
 		commit=$(add_squashed_msg "$rev" "$dir" |
-			git commit-tree "$tree" $headp -p "$rev") || exit $?
+			git commit-tree "$tree" $(gpg_sign_opt) $headp -p "$rev") || exit $?
 	else
 		revp=$(peel_committish "$rev") || exit $?
 		commit=$(add_msg "$dir" $headrev "$rev" |
-			git commit-tree "$tree" $headp -p "$revp") || exit $?
+			git commit-tree "$tree" $(gpg_sign_opt) $headp -p "$revp") || exit $?
 	fi
 	git reset "$commit" || exit $?
 
@@ -1080,9 +1104,9 @@ cmd_merge () {
 	if test -n "$arg_addmerge_message"
 	then
 		git merge --no-ff -Xsubtree="$arg_prefix" \
-			--message="$arg_addmerge_message" "$rev"
+			--message="$arg_addmerge_message" $(gpg_sign_opt) "$rev"
 	else
-		git merge --no-ff -Xsubtree="$arg_prefix" $rev
+		git merge --no-ff -Xsubtree="$arg_prefix" $(gpg_sign_opt) "$rev"
 	fi
 }
 
-- 
2.49.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/2] contrib/subtree: Add tests for -S/--gpg-sign
  2025-05-28 13:01 [PATCH 0/2] contrib/subtree: Add -S/--gpg-sign option Patrik Weiskircher
  2025-05-28 13:01 ` [PATCH 1/2] " Patrik Weiskircher
@ 2025-05-28 13:01 ` Patrik Weiskircher
  2025-05-29 23:15 ` [PATCH 0/2] contrib/subtree: Add -S/--gpg-sign option Junio C Hamano
  2 siblings, 0 replies; 8+ messages in thread
From: Patrik Weiskircher @ 2025-05-28 13:01 UTC (permalink / raw)
  To: git; +Cc: apenwarr, Patrik Weiskircher

Make sure it works correctly.

Signed-off-by: Patrik Weiskircher <patrik@pspdfkit.com>
---
 contrib/subtree/t/t7900-subtree.sh | 113 +++++++++++++++++++++++++++++
 1 file changed, 113 insertions(+)

diff --git a/contrib/subtree/t/t7900-subtree.sh b/contrib/subtree/t/t7900-subtree.sh
index 3c6103f6d2..3edbb33af4 100755
--- a/contrib/subtree/t/t7900-subtree.sh
+++ b/contrib/subtree/t/t7900-subtree.sh
@@ -11,6 +11,7 @@ and push subcommands of git subtree.
 
 TEST_DIRECTORY=$(pwd)/../../../t
 . "$TEST_DIRECTORY"/test-lib.sh
+. "$TEST_DIRECTORY"/lib-gpg.sh
 
 # Use our own wrapper around test-lib.sh's test_create_repo, in order
 # to set log.date=relative.  `git subtree` parses the output of `git
@@ -1563,4 +1564,116 @@ test_expect_success 'subtree descendant check' '
 	)
 '
 
+test_expect_success GPG 'add subproj with GPG signing using -S flag' '
+	subtree_test_create_repo "$test_count" &&
+	subtree_test_create_repo "$test_count/sub proj" &&
+	test_create_commit "$test_count" main1 &&
+	test_create_commit "$test_count/sub proj" sub1 &&
+	(
+		cd "$test_count" &&
+		git fetch ./"sub proj" HEAD &&
+		git subtree add --prefix="sub dir" -S FETCH_HEAD &&
+		git verify-commit HEAD &&
+		test "$(last_commit_subject)" = "Add '\''sub dir/'\'' from commit '\''$(git rev-parse FETCH_HEAD)'\''"
+	)
+'
+
+test_expect_success GPG 'add subproj with GPG signing using --gpg-sign flag' '
+	subtree_test_create_repo "$test_count" &&
+	subtree_test_create_repo "$test_count/sub proj" &&
+	test_create_commit "$test_count" main1 &&
+	test_create_commit "$test_count/sub proj" sub1 &&
+	(
+		cd "$test_count" &&
+		git fetch ./"sub proj" HEAD &&
+		git subtree add --prefix="sub dir" --gpg-sign FETCH_HEAD &&
+		git verify-commit HEAD &&
+		test "$(last_commit_subject)" = "Add '\''sub dir/'\'' from commit '\''$(git rev-parse FETCH_HEAD)'\''"
+	)
+'
+
+test_expect_success GPG 'add subproj with GPG signing using specific key ID' '
+	subtree_test_create_repo "$test_count" &&
+	subtree_test_create_repo "$test_count/sub proj" &&
+	test_create_commit "$test_count" main1 &&
+	test_create_commit "$test_count/sub proj" sub1 &&
+	(
+		cd "$test_count" &&
+		git fetch ./"sub proj" HEAD &&
+		git subtree add --prefix="sub dir" -S"$GIT_COMMITTER_EMAIL" FETCH_HEAD &&
+		git verify-commit HEAD &&
+		test "$(last_commit_subject)" = "Add '\''sub dir/'\'' from commit '\''$(git rev-parse FETCH_HEAD)'\''"
+	)
+'
+
+test_expect_success GPG 'merge with GPG signing' '
+	subtree_test_create_repo "$test_count" &&
+	subtree_test_create_repo "$test_count/sub proj" &&
+	test_create_commit "$test_count" main1 &&
+	test_create_commit "$test_count/sub proj" sub1 &&
+	(
+		cd "$test_count" &&
+		git fetch ./"sub proj" HEAD &&
+		git subtree add --prefix="sub dir" FETCH_HEAD
+	) &&
+	test_create_commit "$test_count/sub proj" sub2 &&
+	(
+		cd "$test_count" &&
+		git fetch ./"sub proj" HEAD &&
+		git subtree merge --prefix="sub dir" -S FETCH_HEAD &&
+		git verify-commit HEAD
+	)
+'
+
+test_expect_success GPG 'split with GPG signing and --rejoin' '
+	subtree_test_create_repo "$test_count" &&
+	subtree_test_create_repo "$test_count/sub proj" &&
+	test_create_commit "$test_count" main1 &&
+	test_create_commit "$test_count/sub proj" sub1 &&
+	(
+		cd "$test_count" &&
+		git fetch ./"sub proj" HEAD &&
+		git subtree add --prefix="sub dir" FETCH_HEAD
+	) &&
+	test_create_commit "$test_count" "sub dir/main-sub1" &&
+	(
+		cd "$test_count" &&
+		git subtree split --prefix="sub dir" --rejoin -S &&
+		git verify-commit HEAD
+	)
+'
+
+test_expect_success GPG 'add with --squash and GPG signing' '
+	subtree_test_create_repo "$test_count" &&
+	subtree_test_create_repo "$test_count/sub proj" &&
+	test_create_commit "$test_count" main1 &&
+	test_create_commit "$test_count/sub proj" sub1 &&
+	(
+		cd "$test_count" &&
+		git fetch ./"sub proj" HEAD &&
+		git subtree add --prefix="sub dir" --squash -S FETCH_HEAD &&
+		git verify-commit HEAD &&
+		# With --squash, the commit subject should reference the squash commit (first parent of merge)
+		squash_commit=$(git rev-parse HEAD^2) &&
+		test "$(last_commit_subject)" = "Merge commit '\''$squash_commit'\'' as '\''sub dir'\''"
+	)
+'
+
+test_expect_success GPG 'pull with GPG signing' '
+	subtree_test_create_repo "$test_count" &&
+	subtree_test_create_repo "$test_count/sub proj" &&
+	test_create_commit "$test_count" main1 &&
+	test_create_commit "$test_count/sub proj" sub1 &&
+	(
+		cd "$test_count" &&
+		git subtree add --prefix="sub dir" ./"sub proj" HEAD
+	) &&
+	test_create_commit "$test_count/sub proj" sub2 &&
+	(
+		cd "$test_count" &&
+		git subtree pull --prefix="sub dir" -S ./"sub proj" HEAD &&
+		git verify-commit HEAD
+	)
+'
+
 test_done
-- 
2.49.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH 0/2] contrib/subtree: Add -S/--gpg-sign option
  2025-05-28 13:01 [PATCH 0/2] contrib/subtree: Add -S/--gpg-sign option Patrik Weiskircher
  2025-05-28 13:01 ` [PATCH 1/2] " Patrik Weiskircher
  2025-05-28 13:01 ` [PATCH 2/2] contrib/subtree: Add tests for -S/--gpg-sign Patrik Weiskircher
@ 2025-05-29 23:15 ` Junio C Hamano
  2025-05-30 14:33   ` Patrik Weiskircher
  2 siblings, 1 reply; 8+ messages in thread
From: Junio C Hamano @ 2025-05-29 23:15 UTC (permalink / raw)
  To: Patrik Weiskircher; +Cc: git, apenwarr

Patrik Weiskircher <patrik@pspdfkit.com> writes:

> Hi!
>
> We use git subtree a lot to manage our dependencies, but recently started
> requiring signed commits. This patch adds support for signing commits to
> git subtree.
>
> This is my first submission to the Git project - you don't have to be gentle,
> but please let me know if I can improve anything.

A few things ;-) starting from the log message where you didn't
quite add why we would want to do these changes.

Also, I think these two should be combined into a single patch.  We
add a feature and make sure the feature works correctly and we also
make sure that the feature does not misfire when the user does not
ask it to trigger, all in the same commit.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 1/2] contrib/subtree: Add -S/--gpg-sign option
  2025-05-28 13:01 ` [PATCH 1/2] " Patrik Weiskircher
@ 2025-05-29 23:45   ` Junio C Hamano
  0 siblings, 0 replies; 8+ messages in thread
From: Junio C Hamano @ 2025-05-29 23:45 UTC (permalink / raw)
  To: Patrik Weiskircher; +Cc: git, apenwarr

Patrik Weiskircher <patrik@pspdfkit.com> writes:

> +# Usage: gpg_sign_opt
> +# Returns the GPG signing option for git commit-tree
> +gpg_sign_opt () {
> +	if test "${arg_gpg_sign+set}" = "set"
> +	then
> +		if test -n "$arg_gpg_sign"
> +		then
> +			printf " -S%s" "$arg_gpg_sign"
> +		else
> +			printf " -S"
> +		fi
> +	fi
> +}

I wonder if this misbehaves if the user has arg_gpg_sign defined in
their environment.  I guess that this contrib script is written
loosely in that regard, as none of the other arg_* variables are
cleared upon script start-up, so let's let it pass.

Also, why is this a separate function that needs to be used via
$(command substitution)?  Wouldn't it be more natural to have
something like

	if test "${arg_gpg_sign+set}" = set
	then
		arg_gpg_sign=-S$arg_gpg_sign
	else
		arg_gpg_sign=
	fi

after the option parsing loop and have the caller just interpolate
it as $arg_gpg_sign (without surrounding double quotes)?

Or you can define arg_gpg_sign to be

 * unset, if the user did not give any -S option
 * -S<string>, if the user gave <string> as its value
 * -S, if the user only gave -S without value

directly inside the option parsing loop, so there is no such
clean-up needed, perhaps?

Near the start of "main" function, there is an early pre-parse loop
that iterates over all the arguments and is aware of which option
takes its own value, i.e.

		case "$opt" in
			--annotate|-b|-P|-m|--onto)
				shift
				;;
			--rejoin)
				arg_split_rejoin=1
				;;

If you are adding "-S" as taking its own value separately, don't you
need to add it to that part of the code, next to -b, -P, and their
friends?

>  die_incompatible_opt () {
>  	assert test "$#" = 2
> @@ -240,6 +255,15 @@ main () {
>  			test -n "$allow_addmerge" || die_incompatible_opt "$opt" "$arg_command"
>  			arg_addmerge_squash=
>  			;;
> +		-S)
> +			if test $# -gt 0 && test "${1#-}" = "$1"
> +			then
> +				arg_gpg_sign="$1"
> +				shift
> +			else
> +				arg_gpg_sign=""
> +			fi
> +			;;

The comparison between "${1#-}" and "$1" is "does the next argument
start with a dash?", iow, you attempt to parse this

	git subtree -S -P prefix add HEAD

as "-S" with empty arg_gpg_sign, instead of slurping "-P" as its
argument.  Which is nice, but is that enough to parse this

	git subtree -S add HEAD

correctly?

> +'git subtree' [<options>] -P <prefix> [-S[<keyid>]] add <local-commit>
> +'git subtree' [<options>] -P <prefix> [-S[<keyid>]] add <repository> <remote-ref>
> +'git subtree' [<options>] -P <prefix> [-S[<keyid>]] merge <local-commit> [<repository>]
> +'git subtree' [<options>] -P <prefix> [-S[<keyid>]] split [<local-commit>]

These synopsis elements suggest that <keyid> should be given in the
"stuck" form as the value for the "-S" option, and if that were the
case, your option parser would look more like


		-S*)
			arg_gpg_sign=${opt#-S}
			;;

which is much simpler and more robust.  If you go that route, you
would probably want to retrofit -P and other options to also allow
their value in the "stuck" form as well as their traditional
"separate" form, which would also be annoying, so I do not know if
it is worth it.

Or just use "arg_gpg_sign=$opt" here, if you are following an
earlier suggestion to get rid of the gpg_sign_opt helper function
that does not seem to be doing anything useful.  And then ...

> @@ -537,7 +561,7 @@ copy_commit () {
>  			printf "%s" "$arg_split_annotate"
>  			cat
>  		) |
> -		git commit-tree "$2" $3  # reads the rest of stdin
> +		git commit-tree "$2" $(gpg_sign_opt) $3  # reads the rest of stdin

... here, you'd just say

		git commit-tree "$2" $gpg_sign_opt $3  # reads the rest of stdin

instead.  If your <key-id> has $IFS whitespace, this will break, but
your gpg_sign_out function does not help with that issue anyway
(you'd need to rewrite this and other callers to use eval if you
really wanted to treat $IFS whitespace in values properly, but
looking at the existing code in this script, I do not see any
careful string handling to do so, so it may be more appropriate and
punt, saying "no, key IDs with whitespaces in them are not
supported").


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 0/2] contrib/subtree: Add -S/--gpg-sign option
  2025-05-29 23:15 ` [PATCH 0/2] contrib/subtree: Add -S/--gpg-sign option Junio C Hamano
@ 2025-05-30 14:33   ` Patrik Weiskircher
  2025-05-30 20:55     ` Junio C Hamano
  0 siblings, 1 reply; 8+ messages in thread
From: Patrik Weiskircher @ 2025-05-30 14:33 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, apenwarr

On Thu, May 29, 2025 at 7:15 PM Junio C Hamano <gitster@pobox.com> wrote:
>
> Patrik Weiskircher <patrik@pspdfkit.com> writes:
>
> > Hi!
> >
> > We use git subtree a lot to manage our dependencies, but recently started
> > requiring signed commits. This patch adds support for signing commits to
> > git subtree.
> >
> > This is my first submission to the Git project - you don't have to be gentle,
> > but please let me know if I can improve anything.

Apologies, Junio. I replied only to you and with HTML emails. I'm very
new here and I'm very much used to different workflows. I'll be
better. Please disregard my previous emails.

>
> A few things ;-) starting from the log message where you didn't
> quite add why we would want to do these changes.
>
> Also, I think these two should be combined into a single patch.  We
> add a feature and make sure the feature works correctly and we also
> make sure that the feature does not misfire when the user does not
> ask it to trigger, all in the same commit.

I looked at your review, and I agree with everything you said. My
patch wasn't very well thought out.

I'm also at a crossroads here. I'm not sure if the optional argument
parsing will work out nicely in bash. Let me explain:

git-subtree uses `git rev-parse --parseopt`. This *does* have support
for optional arguments, but highly recommends using `--stuck-long`,
otherwise unambiguously parsing arguments becomes impossible.

This is true. There's no way to differentiate between the optional
argument or the next positional parameter. Therefore, I would have to
use `--stuck-long`.

This in itself isn't overly difficult. There's only a couple of
parameters in the script that that would affect. The problem I have
with it is that I don't see a single user of `--stuck-long` in the
whole repo. I don't necessarily want to become the first one. Seems
like something destined to be cleaned up at some point.

This means my options become:
1. use --stuck-long or
2. make -S not take any parameter or
3. make -S require a parameter

I'm not happy with any of these options, but considering I really
would like to make this work, I would probably go with 1.

Any opinions on this?

Thanks!
Patrik

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 0/2] contrib/subtree: Add -S/--gpg-sign option
  2025-05-30 14:33   ` Patrik Weiskircher
@ 2025-05-30 20:55     ` Junio C Hamano
  2025-06-02 13:12       ` Patrik Weiskircher
  0 siblings, 1 reply; 8+ messages in thread
From: Junio C Hamano @ 2025-05-30 20:55 UTC (permalink / raw)
  To: Patrik Weiskircher; +Cc: git, apenwarr

Patrik Weiskircher <patrik.weiskircher@nutrient.io> writes:

> This means my options become:
> 1. use --stuck-long or
> 2. make -S not take any parameter or
> 3. make -S require a parameter

4. accept "-S[<key-id>]" in stuck form, and --gpg-sign[=<key-id>]

which is a variant of #1 may be an option?

Thanks.


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 0/2] contrib/subtree: Add -S/--gpg-sign option
  2025-05-30 20:55     ` Junio C Hamano
@ 2025-06-02 13:12       ` Patrik Weiskircher
  0 siblings, 0 replies; 8+ messages in thread
From: Patrik Weiskircher @ 2025-06-02 13:12 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, apenwarr

On Fri, May 30, 2025 at 4:55 PM Junio C Hamano <gitster@pobox.com> wrote:
>
> Patrik Weiskircher <patrik.weiskircher@nutrient.io> writes:
>
> > This means my options become:
> > 1. use --stuck-long or
> > 2. make -S not take any parameter or
> > 3. make -S require a parameter
>
> 4. accept "-S[<key-id>]" in stuck form, and --gpg-sign[=<key-id>]
>
> which is a variant of #1 may be an option?

Not with git rev-parse, unfortunately. Either `-Sabc` or
`--gpg-sign=abc` would get transformed into `-S 'abc'` after
rev-parse, where we run into the ambiguity of what is an optional
argument again. I *could* parse this manually without git rev-parse
beforehand, but that seems like just adding yet-another difficult to
maintain thing.

```
$ echo $OPTS_SPEC | git rev-parse --parseopt -- "--gpg-sign=abcd"
set -- -S 'abcd' --

$ echo $OPTS_SPEC | git rev-parse --parseopt -- "-Sabcd"
set -- -S 'abcd' --
```

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2025-06-02 13:13 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-05-28 13:01 [PATCH 0/2] contrib/subtree: Add -S/--gpg-sign option Patrik Weiskircher
2025-05-28 13:01 ` [PATCH 1/2] " Patrik Weiskircher
2025-05-29 23:45   ` Junio C Hamano
2025-05-28 13:01 ` [PATCH 2/2] contrib/subtree: Add tests for -S/--gpg-sign Patrik Weiskircher
2025-05-29 23:15 ` [PATCH 0/2] contrib/subtree: Add -S/--gpg-sign option Junio C Hamano
2025-05-30 14:33   ` Patrik Weiskircher
2025-05-30 20:55     ` Junio C Hamano
2025-06-02 13:12       ` Patrik Weiskircher

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).