Skip to contentSkip to conversation

subtree: support GPG commit signing

PATCH In review Allen Reese via GitGitGadget 2 participants 4 messages Apr 10, 2023

lore
Share & tools
lore
#0 lore raw

cover subtree: support GPG commit signing

Add support for -S/--gpg-sign/--no-gpg-sign command line options and commit.gpgsign configuration. These are passed to invocations of git commit-tree.

Allen Reese (1):
contrib/subtree: fix gpg_sign_arg not being passed to git merge.

Jacques Vidrine (1):
subtree: support GPG commit signing

 contrib/subtree/git-subtree.sh     | 36 ++++++++++++++++++++++++------
 contrib/subtree/git-subtree.txt    |  9 ++++++++
 contrib/subtree/t/t7900-subtree.sh |  2 +-
 3 files changed, 39 insertions(+), 8 deletions(-)

base-commit: 0607f793cbe0af16aee6d2480056d891835884bd
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1490%2Fareese%2Fgit-subtree-support-gpg-signing-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1490/areese/git-subtree-support-gpg-signing-v1
Pull-Request: https://github.com/git/git/pull/1490

Signature · 1 line
gitgitgadget
#3 lore raw

PATCH 2/2 contrib/subtree: fix gpg_sign_arg not being passed to git merge.

From: Allen Reese <[email protected]>

Replace immitate -> imitate.

---
 contrib/subtree/git-subtree.sh     | 14 +++++++++++---
 contrib/subtree/t/t7900-subtree.sh |  2 +-
 2 files changed, 12 insertions(+), 4 deletions(-)
contrib/subtree/git-subtree.sh +11 -3
index 553b4391deb..18dc7f8a4c2 100755
@@ -243,8 +243,16 @@ main () {
 			test -n "$allow_addmerge" || die_incompatible_opt "$opt" "$arg_command"
 			arg_addmerge_squash=
 			;;
-		-S*|--gpg-sign=*|--no-gpg-sign)
+		-S|--gpg-sign|--no-gpg-sign)
 			arg_gpgsign="${opt}"
+			case $1 in
+				-*)
+					;;
+				*)
+					arg_gpgsign=${opt}${1}
+					shift
+					;;
+			esac
 			;;
 		--)
 			break
@@ -1053,10 +1061,10 @@ cmd_merge () {
 
 	if test -n "$arg_addmerge_message"
 	then
-		git merge --no-ff -Xsubtree="$arg_prefix" \
+		git merge --no-ff $arg_gpgsign -Xsubtree="$arg_prefix" \
 			--message="$arg_addmerge_message" "$rev"
 	else
-		git merge --no-ff -Xsubtree="$arg_prefix" $rev
+		git merge --no-ff $arg_gpgsign -Xsubtree="$arg_prefix" $rev
 	fi
 }
 
contrib/subtree/t/t7900-subtree.sh +1 -1
index 341c169eca7..fa5bd9b7af6 100755
@@ -47,7 +47,7 @@ last_commit_subject () {
 # pre-2.32.0 versions of 'git subtree' would write the hash of the tag
 # (sub1 below), instead of the commit (sub1^{commit}) in the
 # "git-subtree-split" trailer.
-# We immitate this behaviour below using a replace ref.
+# We imitate this behaviour below using a replace ref.
 # This function creates 3 repositories:
 # - $1
 # - $1-sub (added as subtree "sub" in $1)
Signature · 1 line
gitgitgadget
#1 lore raw

PATCH 1/2 subtree: support GPG commit signing

In reply to Allen Reese via GitGitGadget

From: Jacques Vidrine <[email protected]>

Add support for -S/--gpg-sign/--no-gpg-sign command line options and commit.gpgsign configuration. These are passed to invocations of git commit-tree.

---
 contrib/subtree/git-subtree.sh  | 24 +++++++++++++++++++-----
 contrib/subtree/git-subtree.txt |  9 +++++++++
 2 files changed, 28 insertions(+), 5 deletions(-)
contrib/subtree/git-subtree.sh +19 -5
index 10c9c87839a..553b4391deb 100755
@@ -46,6 +46,8 @@ 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?   GPG-sign commits, optionally specifying keyid.
+no-gpg-sign   Disable GPG commit signing.
 "
 
 indent=0
@@ -165,6 +167,7 @@ main () {
 	arg_quiet=
 	arg_debug=
 	arg_prefix=
+	arg_gpgsign=
 	arg_split_branch=
 	arg_split_onto=
 	arg_split_ignore_joins=
@@ -240,6 +243,9 @@ main () {
 			test -n "$allow_addmerge" || die_incompatible_opt "$opt" "$arg_command"
 			arg_addmerge_squash=
 			;;
+		-S*|--gpg-sign=*|--no-gpg-sign)
+			arg_gpgsign="${opt}"
+			;;
 		--)
 			break
 			;;
@@ -268,6 +274,12 @@ main () {
 
 	dir="$(dirname "$arg_prefix/.")"
 
+	if test -z "$arg_gpgsign" &&
+		git config --bool commit.gpgsign >/dev/null
+	then
+		arg_gpgsign="-S"
+	fi
+
 	debug "command: {$arg_command}"
 	debug "quiet: {$arg_quiet}"
 	debug "dir: {$dir}"
@@ -534,7 +546,7 @@ copy_commit () {
 			printf "%s" "$arg_split_annotate"
 			cat
 		) |
-		git commit-tree "$2" $3  # reads the rest of stdin
+		git commit-tree $arg_gpgsign "$2" $3  # reads the rest of stdin
 	) || die "fatal: can't copy commit $1"
 }
 
@@ -674,10 +686,10 @@ new_squash_commit () {
 	if test -n "$old"
 	then
 		squash_msg "$dir" "$oldsub" "$newsub" |
-		git commit-tree "$tree" -p "$old" || exit $?
+		git commit-tree $arg_gpgsign "$tree" -p "$old" || exit $?
 	else
 		squash_msg "$dir" "" "$newsub" |
-		git commit-tree "$tree" || exit $?
+		git commit-tree $arg_gpgsign "$tree" || exit $?
 	fi
 }
 
@@ -900,11 +912,13 @@ 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 $arg_gpgsign "$tree" \
+			$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 $arg_gpgsign "$tree" \
+			$headp -p "$revp") || exit $?
 	fi
 	git reset "$commit" || exit $?
 
contrib/subtree/git-subtree.txt +9 -0
index 004abf415b8..fa54541b288 100644
@@ -185,6 +185,15 @@ subproject.
 --message=<message>::
 	Specify <message> as the commit message for the merge commit.
 
+-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 both `commit.gpgSign` configuration variable, and
+	earlier `--gpg-sign`.
+
 OPTIONS FOR 'split' (ALSO: 'push')
 ----------------------------------
 These options for 'split' may also be given to 'push' (which wraps
Signature · 1 line
gitgitgadget
#2 lore raw

Adding Avery, as I don’t seem to have managed to cc Avery as part of the gitgadet pr.

Quoted 120 lines · Jacques Vidrine via GitGitGadget

From: Jacques Vidrine <[email protected]>

Add support for -S/--gpg-sign/--no-gpg-sign command line options and commit.gpgsign configuration. These are passed to invocations of git commit-tree.

---
contrib/subtree/git-subtree.sh | 24 +++++++++++++++++++----- contrib/subtree/git-subtree.txt | 9 +++++++++

2 files changed, 28 insertions(+), 5 deletions(-)
contrib/subtree/git-subtree.sh +0 -0
index 10c9c87839a..553b4391deb 100755
@@ -46,6 +46,8 @@ 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

contrib/subtree/git-subtree.sh +2 -0
+S,gpg-sign?   GPG-sign commits, optionally specifying keyid.
+no-gpg-sign   Disable GPG commit signing.

"

indent=0

contrib/subtree/git-subtree.sh +17 -5
@@ -165,6 +167,7 @@ main () {
 	arg_quiet=
 	arg_debug=
 	arg_prefix=
+	arg_gpgsign=
 	arg_split_branch=
 	arg_split_onto=
 	arg_split_ignore_joins=
@@ -240,6 +243,9 @@ main () {
 			test -n "$allow_addmerge" || die_incompatible_opt "$opt" "$arg_command"
 			arg_addmerge_squash=
 			;;
+		-S*|--gpg-sign=*|--no-gpg-sign)
+			arg_gpgsign="${opt}"
+			;;
 		--)
 			break
 			;;
@@ -268,6 +274,12 @@ main () {
 
 	dir="$(dirname "$arg_prefix/.")"
 
+	if test -z "$arg_gpgsign" &&
+		git config --bool commit.gpgsign >/dev/null
+	then
+		arg_gpgsign="-S"
+	fi
+
 	debug "command: {$arg_command}"
 	debug "quiet: {$arg_quiet}"
 	debug "dir: {$dir}"
@@ -534,7 +546,7 @@ copy_commit () {
 			printf "%s" "$arg_split_annotate"
 			cat
 		) |
-		git commit-tree "$2" $3  # reads the rest of stdin
+		git commit-tree $arg_gpgsign "$2" $3  # reads the rest of stdin
 	) || die "fatal: can't copy commit $1"
 }
 
@@ -674,10 +686,10 @@ new_squash_commit () {
 	if test -n "$old"
 	then
 		squash_msg "$dir" "$oldsub" "$newsub" |
-		git commit-tree "$tree" -p "$old" || exit $?
+		git commit-tree $arg_gpgsign "$tree" -p "$old" || exit $?
 	else
 		squash_msg "$dir" "" "$newsub" |
-		git commit-tree "$tree" || exit $?
+		git commit-tree $arg_gpgsign "$tree" || exit $?
 	fi
 }
 
@@ -900,11 +912,13 @@ 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 $arg_gpgsign "$tree" \
+			$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 $arg_gpgsign "$tree" \
+			$headp -p "$revp") || exit $?
 	fi
 	git reset "$commit" || exit $?
 
contrib/subtree/git-subtree.txt +9 -2
index 004abf415b8..fa54541b288 100644
@@ -185,6 +185,15 @@ subproject.
--message=<message>::
 	Specify <message> as the commit message for the merge commit.
 
+-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 both `commit.gpgSign` configuration variable, and
+	earlier `--gpg-sign`.
+
 OPTIONS FOR 'split' (ALSO: 'push')
----------------------------------

These options for 'split' may also be given to 'push' (which wraps

Signature · 1 line
gitgitgadget