[RFC/PATCH] rebase--interactive: Add "sign" command

Subsystems: the rest

4 messages, 2 authors, 2016-08-04 · open the first message on its own page

[RFC/PATCH] rebase--interactive: Add "sign" command

From: Chris Packham <hidden>
Date: 2016-08-03 08:49:24

This is similar to the existing "reword" command in that it can be used
to update the commit message the difference is that the editor presented
to the user for the commit. It provides a useful shorthand for "exec git
commit --amend --no-edit -s"

Signed-off-by: Chris Packham <redacted>
---
Hi,

At $dayjob we have a patch based work-flow where committers sign patches on the
way through. Occasionally when a larger patch series is involved it's easier
pull from the submitter's repo and use git rebase -i to add the required sign
off either by using 'reword' or 'exec git commit --amend -s'.

This is my attempt at making this a little less cumbersome by adding a
'sign' command. I decided not to add a short version of the command,
partly because 's' was taken and partly because it is a bit of a niche
use-case.

Thanks,
Chris

 git-rebase--interactive.sh    | 10 +++++++++-
 t/lib-rebase.sh               |  2 +-
 t/t3404-rebase-interactive.sh |  9 +++++++++
 3 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
index ded4595..1cd8bc6 100644
--- a/git-rebase--interactive.sh
+++ b/git-rebase--interactive.sh
@@ -148,6 +148,7 @@ append_todo_help () {
 Commands:
  p, pick = use commit
  r, reword = use commit, but edit the commit message
+ sign = use commit, add sign-off to the commit message
  e, edit = use commit, but stop for amending
  s, squash = use commit, but meld into previous commit
  f, fixup = like \"squash\", but discard this commit's log message
@@ -594,6 +595,13 @@ you are able to reword the commit.")"
 		}
 		record_in_rewritten $sha1
 		;;
+	sign)
+		comment_for_reflog sign
+		mark_action_done
+		do_pick $sha1 "$rest"
+		git commit --amend -s --no-post-rewrite --no-edit ${gpg_sign_opt:+"$gpg_sign_opt"}
+		record_in_rewritten $sha1
+		;;
 	edit|e)
 		comment_for_reflog edit
 
@@ -959,7 +967,7 @@ check_bad_cmd_and_sha () {
 			# Work around CR left by "read" (e.g. with Git for
 			# Windows' Bash).
 			;;
-		pick|p|drop|d|reword|r|edit|e|squash|s|fixup|f)
+		pick|p|drop|d|reword|r|sign|edit|e|squash|s|fixup|f)
 			if ! check_commit_sha "${rest%%[ 	]*}" "$lineno" "$1"
 			then
 				retval=1
diff --git a/t/lib-rebase.sh b/t/lib-rebase.sh
index 25a77ee..5a54228 100644
--- a/t/lib-rebase.sh
+++ b/t/lib-rebase.sh
@@ -47,7 +47,7 @@ set_fake_editor () {
 	action=pick
 	for line in $FAKE_LINES; do
 		case $line in
-		squash|fixup|edit|reword|drop)
+		squash|fixup|edit|reword|sign|drop)
 			action="$line";;
 		exec*)
 			echo "$line" | sed 's/_/ /g' >> "$1";;
diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh
index 197914b..e473ffb 100755
--- a/t/t3404-rebase-interactive.sh
+++ b/t/t3404-rebase-interactive.sh
@@ -690,6 +690,15 @@ test_expect_success 'reword' '
 	git show HEAD~2 | grep "C changed"
 '
 
+test_expect_success 'sign-off' '
+	git checkout -b sign-off-branch master &&
+	set_fake_editor &&
+	FAKE_LINES="1 2 3 sign 4" git rebase -i A &&
+	git show HEAD | grep "Signed-off-by:" &&
+	test $(git rev-parse master) != $(git rev-parse HEAD) &&
+	test $(git rev-parse master^) = $(git rev-parse HEAD^)
+'
+
 test_expect_success 'rebase -i can copy notes' '
 	git config notes.rewrite.rebase true &&
 	git config notes.rewriteRef "refs/notes/*" &&
-- 
2.9.2.518.ged577c6.dirty

Re: [RFC/PATCH] rebase--interactive: Add "sign" command

From: Johannes Schindelin <hidden>
Date: 2016-08-03 17:04:53

Hi Chris,

On Wed, 3 Aug 2016, Johannes Schindelin wrote:
I can understand how this "sign" command helps you. I myself wished for
new commands when working on my Git garden shears [*1*] (essentially, what
git rebase --interactive --preserve-merges *should* have been).
And of course I forgot to provide the footnote. Sigh. So here they are,
the Git garden shears, intended to rebase a thicket of branches:

https://github.com/git-for-windows/build-extra/blob/master/shears.sh

The edit script will look somewhat like this:

	mark onto

	# branch "something"
	bud
	pick abcdef first commit
	pick abcde0 second commit
	mark something

	# branch "another-one"
	bud
	pick cafebabe yep, that's a different branch
	mark another-one

	bud
	merge -C 0123456 something
	merge -C 6543210 another-one

	cleanup something another-one

So you see, I needed to introduce new commands: bud, mark, merge and
cleanup (I actually also added a "reset" one).

The fake editor I talked about is really the script itself, which detects
that it was run as the fake editor, and which converts all those commands
into the form "exec git .r <command> <parameters>...". The alias..r
setting also points to the same script, so that I really only need one
script. It's one big hack, but it works.

Needless to say, my idea to support new rebase -i commands via config
settings would be something I would use myself in the Git garden shears.

Ciao,
Johannes

Re: [RFC/PATCH] rebase--interactive: Add "sign" command

From: Johannes Schindelin <hidden>
Date: 2016-08-03 17:05:13

Hi Chris,

On Wed, 3 Aug 2016, Chris Packham wrote:
This is similar to the existing "reword" command in that it can be used
to update the commit message the difference is that the editor presented
to the user for the commit. It provides a useful shorthand for "exec git
commit --amend --no-edit -s"
I can understand how this "sign" command helps you. I myself wished for
new commands when working on my Git garden shears [*1*] (essentially, what
git rebase --interactive --preserve-merges *should* have been).

My solution was to introduce a new fake editor that calls the real editor
and afterwards converts the "new" commands into exec lines.

Having said that, this patch clashes seriously with my current effort to
move a lot of the interactive rebase from shell into plain C. It is
actually ready, but getting this into the code base is really slow-going,
unfortunately.

Now, after looking at your patch it looks to me as if this would be easily
ported, so there is not a big deal here.

However, I could imagine that we actually want this to be more extensible.
After all, all you are doing is to introduce a new rebase -i command that
does nothing else than shelling out to a command. Why not introduce a much
more flexible feature, where you add something like "rebase -i aliases"?

Maybe something like this:

[rebase "command"]
	sign = git commit --amend -s --no-post-rewrite --no-edit -S

I have not completely thought this through, but maybe this direction would
make the interactive rebase even more powerful?

Ciao,
Johannes

Re: [RFC/PATCH] rebase--interactive: Add "sign" command

From: Chris Packham <hidden>
Date: 2016-08-04 00:51:07

On Thu, Aug 4, 2016 at 2:31 AM, Johannes Schindelin
[off-list ref] wrote:
Hi Chris,

On Wed, 3 Aug 2016, Chris Packham wrote:
quoted
This is similar to the existing "reword" command in that it can be used
to update the commit message the difference is that the editor presented
to the user for the commit. It provides a useful shorthand for "exec git
commit --amend --no-edit -s"
<snip>
Having said that, this patch clashes seriously with my current effort to
move a lot of the interactive rebase from shell into plain C. It is
actually ready, but getting this into the code base is really slow-going,
unfortunately.

Now, after looking at your patch it looks to me as if this would be easily
ported, so there is not a big deal here.
Yeah sorry. I knew there was something in flight but ended up doing a
quick hack on top of master.
However, I could imagine that we actually want this to be more extensible.
After all, all you are doing is to introduce a new rebase -i command that
does nothing else than shelling out to a command. Why not introduce a much
more flexible feature, where you add something like "rebase -i aliases"?

Maybe something like this:

[rebase "command"]
        sign = git commit --amend -s --no-post-rewrite --no-edit -S
I did briefly consider that. I ended up taking the shortcut because I
had a patch series I needed to sign.

Elsewhere in this thread the idea of pick -S or reword -S was raised.
I'd actually prefer that because there seems little between 'git
config rebase.command.sign blah' and 'exec ~/sign.sh'
I have not completely thought this through, but maybe this direction would
make the interactive rebase even more powerful?
The uses I can think of are adding sign-off and running "make check".
For me rebase -i doesn't need to be much more powerful than that.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help