commit: restore --edit when combined with --fixup
PATCH 1/1 commit: restore --edit when combined with --fixup
From: Joel Klinghed <[email protected]>
Recent changes to --fixup, adding amend suboption, caused the --edit flag to be ignored as use_editor was always set to zero.
Restore edit_flag having higher priority than fixup_message when deciding the value of use_editor by only changing the default if edit_flag is not set.
---
commit: restore --edit when combined with --fixup
Recent changes to --fixup, adding amend suboption, caused the --edit flag to be ignored as use_editor was always set to zero.
Restore edit_flag having higher priority than fixup_message when deciding the value of use_editor by only changing the default if edit_flag is not set.
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1014%2Fthejk%2Ffixup_edit-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1014/thejk/fixup_edit-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/1014
builtin/commit.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
builtin/commit.c +2 -1
@@ -1333,7 +1333,8 @@ static int parse_and_validate_options(int argc, const char *argv[], }else { fixup_commit = fixup_message; fixup_prefix ="fixup" ; - use_editor =0 ; +if (0 > edit_flag) + use_editor =0 ; } }
base-commit: ebf3c04b262aa27fbb97f8a0156c2347fecafafb
Signature · 1 line
gitgitgadget
Quoted 8 lines · Joel Klinghed via GitGitGadget
From: Joel Klinghed <[email protected]>
Recent changes to --fixup, adding amend suboption, caused the --edit flag to be ignored as
use_editorwas always set to zero.Restore
edit_flaghaving higher priority thanfixup_messagewhen deciding the value ofuse_editorby only changing the default ifedit_flagis not set.
This is definitely a change in behavior due to 494d314a05 (commit: add amend suboption to --fixup to create amend! commit, 2021-03-15). That was in v2.32.0, so it's not a regression in the upcoming v2.33 which needs to be handled in the next few days.
My inclination is to call it a regression and restore the original behavior. But when I was going to suggest that you add a test, it made me wonder: what would we be testing for?
If the user says "git commit --fixup HEAD --edit", it seems reasonable for them to expect that the editor is run, and that is easy to check. But what are they planning to edit? If they modify the subject line of the commit, it will wreck the "fixup!" mechanism. If they modify the body (which starts blank), it's going to be discarded by the fixup operation.
Is the goal that they might leave notes for themselves, which they can view in the meantime before they run "rebase --autosquash"?
-Peff
Quoted 27 lines · Jeff King
Quoted 8 lines · Joel Klinghed via GitGitGadget
From: Joel Klinghed <[email protected]>
Recent changes to --fixup, adding amend suboption, caused the --edit flag to be ignored as
use_editorwas always set to zero.Restore
edit_flaghaving higher priority thanfixup_messagewhen deciding the value ofuse_editorby only changing the default ifedit_flagis not set.This is definitely a change in behavior due to
494d314a05(commit: add amend suboption to --fixup to create amend! commit, 2021-03-15). That was in v2.32.0, so it's not a regression in the upcoming v2.33 which needs to be handled in the next few days.My inclination is to call it a regression and restore the original behavior. But when I was going to suggest that you add a test, it made me wonder: what would we be testing for?
If the user says "git commit --fixup HEAD --edit", it seems reasonable for them to expect that the editor is run, and that is easy to check. But what are they planning to edit? If they modify the subject line of the commit, it will wreck the "fixup!" mechanism. If they modify the body (which starts blank), it's going to be discarded by the fixup operation.
Quoted 3 lines
Is the goal that they might leave notes for themselves, which they can view in the meantime before they run "rebase --autosquash"?
At my work we use "fixup!" when pushing fixes to a review, using the modified body to outline what issue the commit is addressing, helping the reviewers to see intent and not just the end result. All "fixup!" are then ofc. squashed before integration. Same can be achieved with -m but --edit is generally easier to work with in my experience.
I've also once or twice used it to avoid a "fixup!" of a "fixup!" instead of looking up the original target commit hash but that's just me being lazy.
I'll add a test to check for previous behavior.
/JK
Quoted 11 lines · Joel Klinghed
Quoted 3 lines
Is the goal that they might leave notes for themselves, which they can view in the meantime before they run "rebase --autosquash"?
At my work we use "fixup!" when pushing fixes to a review, using the modified body to outline what issue the commit is addressing, helping the reviewers to see intent and not just the end result. All "fixup!" are then ofc. squashed before integration. Same can be achieved with -m but --edit is generally easier to work with in my experience.
Quoted 3 lines
I've also once or twice used it to avoid a "fixup!" of a "fixup!" instead of looking up the original target commit hash but that's just me being lazy.
Ah, thanks for explaining. That makes sense.
Quoted 1 line
I'll add a test to check for previous behavior.
This is what I worked up, in case it helps.
t/t7502-commit-porcelain.sh +18 -0
@@ -940,4 +940,22 @@ EOF ) ' +test_expect_success 'commit --fixup respects --edit' ' + echo broken >foo.c && + git add foo.c && + git commit -m "wip of foo.c" && + echo fixed >foo.c && + ( + test_set_editor "$TEST_DIRECTORY/t7500/add-content" && + git commit --fixup HEAD --edit foo.c + ) && + cat >expect <<-\EOF && + fixup! wip of foo.c + + commit message + EOF + git log -1 --pretty=format:%B HEAD >actual && + test_cmp expect actual +' + test_done
-Peff
Quoted 6 lines · Joel Klinghed
At my work we use "fixup!" when pushing fixes to a review, using the modified body to outline what issue the commit is addressing, helping the reviewers to see intent and not just the end result. All "fixup!" are then ofc. squashed before integration. Same can be achieved with -m but --edit is generally easier to work with in my experience.
Yeah, I do exactly the same thing. I want to write a nice explanation of the change I made for the reviewer, but I don't want to preserve it for the future.
I recently had a series that was 33 commits after squashing but with 117 before squashing, thanks to a series of very thorough and thoughtful reviews, so in this kind of scenario, it can really be kind to the reviewer to help them match up the change with their comment.
Quoted 5 lines
I've also once or twice used it to avoid a "fixup!" of a "fixup!" instead of looking up the original target commit hash but that's just me being lazy.
I'll add a test to check for previous behavior.
Thanks for catching this.
Signature · 2 lines
brian m. carlson (he/him or they/them) Toronto, Ontario, CA
PATCH v2 1/1 commit: restore --edit when combined with --fixup
In reply to Joel Klinghed via GitGitGadgetFrom: Joel Klinghed <[email protected]>
Recent changes to --fixup, adding amend suboption, caused the --edit flag to be ignored as use_editor was always set to zero.
Restore edit_flag having higher priority than fixup_message when deciding the value of use_editor by only changing the default if edit_flag is not set.
---
commit: restore --edit when combined with --fixup
Recent changes to --fixup, adding amend suboption, caused the --edit flag to be ignored as use_editor was always set to zero.
Restore edit_flag having higher priority than fixup_message when deciding the value of use_editor by only changing the default if edit_flag is not set.
Changes since v1: Added test verifying that --fixup --edit brings up editor.
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1014%2Fthejk%2Ffixup_edit-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1014/thejk/fixup_edit-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/1014
Range-diff vs v1:
1: b3e44c6ccde ! 1: 0ee926d4149 commit: restore --edit when combined with --fixup
@@ builtin/commit.c: static int parse_and_validate_options(int argc, const char *ar
}
}
+
+ ## t/t7500-commit-template-squash-signoff.sh ##
+@@ t/t7500-commit-template-squash-signoff.sh: test_expect_success 'commit --fixup -m"something" -m"extra"' '
+
+ extra"
+ '
++test_expect_success 'commit --fixup --edit' '
++ commit_for_rebase_autosquash_setup &&
++ cat >e-append <<-\EOF &&
++ #!/bin/sh
++ sed -e "2a\\
++something\\
++extra" <"$1" >"$1-"
++ mv "$1-" "$1"
++ EOF
++ chmod 755 e-append &&
++ EDITOR="./e-append" git commit --fixup HEAD~1 --edit &&
++ commit_msg_is "fixup! target message subject linesomething
++extra"
++'
++
+ get_commit_msg () {
+ rev="$1" &&
+ git log -1 --pretty=format:"%B" "$rev"builtin/commit.c | 3 ++- t/t7500-commit-template-squash-signoff.sh | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-)
builtin/commit.c +2 -1
@@ -1333,7 +1333,8 @@ static int parse_and_validate_options(int argc, const char *argv[], }else { fixup_commit = fixup_message; fixup_prefix ="fixup" ; - use_editor =0 ; +if (0 > edit_flag) + use_editor =0 ; } }
t/t7500-commit-template-squash-signoff.sh +15 -0
@@ -281,6 +281,21 @@ test_expect_success 'commit --fixup -m"something" -m"extra"' ' extra" ' +test_expect_success 'commit --fixup --edit' ' + commit_for_rebase_autosquash_setup && + cat >e-append <<-\EOF && + #!/bin/sh + sed -e "2a\\ +something\\ +extra" <"$1" >"$1-" + mv "$1-" "$1" + EOF + chmod 755 e-append && + EDITOR="./e-append" git commit --fixup HEAD~1 --edit && + commit_msg_is "fixup! target message subject linesomething +extra" +' + get_commit_msg () { rev="$1" && git log -1 --pretty=format:"%B" "$rev"
base-commit: ebf3c04b262aa27fbb97f8a0156c2347fecafafb
Signature · 1 line
gitgitgadget
builtin/commit.c static int parse_and_validate_options(int argc, const char *argv[], · line 1336
Quoted 10 lines · Joel Klinghed via GitGitGadget
builtin/commit.c +1
-1@@ -1333,7 +1333,8 @@ static int parse_and_validate_options(int argc, const char *argv[], }else { fixup_commit = fixup_message; fixup_prefix ="fixup" ; - use_editor =0 ; +if (0 > edit_flag)
Writing this as
if (edit_flag < 0)
makes it far easier to immediately see that we are talking about a nagetive edit_flag.
Quoted 13 lines
builtin/commit.c +1
-0+ use_editor =0 ; } }t/t7500-commit-template-squash-signoff.sh +1
-0@@ -281,6 +281,21 @@ test_expect_success 'commit --fixup -m"something" -m"extra"' ' extra" ' +test_expect_success 'commit --fixup --edit' '
t/t7500-commit-template-squash-signoff.sh test_expect_success 'commit --fixup -m"something" -m"extra"' ' · line 294
Quoted 10 lines
t/t7500-commit-template-squash-signoff.sh +9
-0+ commit_for_rebase_autosquash_setup && + cat >e-append <<-\EOF && + #!/bin/sh + sed -e "2a\\ +something\\ +extra" <"$1" >"$1-" + mv "$1-" "$1" + EOF + chmod 755 e-append &&
Use write_script helper from test-lib-functions.sh here and lose the hardcoded reference to /bin/sh.
t/t7500-commit-template-squash-signoff.sh test_expect_success 'commit --fixup -m"something" -m"extra"' ' · line 297
Quoted 4 lines
t/t7500-commit-template-squash-signoff.sh +4
-0+ EDITOR="./e-append" git commit --fixup HEAD~1 --edit && + commit_msg_is "fixup! target message subject linesomething +extra" +'
Thanks.
Quoted 15 lines · Junio C Hamano
builtin/commit.c static int parse_and_validate_options(int argc, const char *argv[], · line 1336
Quoted 10 lines · Joel Klinghed via GitGitGadget
builtin/commit.c +1
-1@@ -1333,7 +1333,8 @@ static int parse_and_validate_options(int argc, const char *argv[], }else { fixup_commit = fixup_message; fixup_prefix ="fixup" ; - use_editor =0 ; +if (0 > edit_flag)Writing this as
Quoted 5 lines
if (edit_flag < 0)makes it far easier to immediately see that we are talking about a nagetive
edit_flag.
Agree, I'll change it.
I was unsure of the style and copied from the earlier condition:
if (0 <= edit_flag) use_editor = edit_flag;
Quoted 9 lines
builtin/commit.c static int parse_and_validate_options(int argc, const char *argv[], · line 1340
Quoted 4 lines
builtin/commit.c +1
-0+ use_editor =0 ; } }Use
write_scripthelper fromtest-lib-functions.shhere and lose the hardcoded reference to/bin/sh.
Ah, missed that one.
Thanks.
/JK
Quoted 4 lines · Joel Klinghed
Quoted 4 lines
Writing this as
if (edit_flag < 0)
Quoted 8 lines
Quoted 3 lines
makes it far easier to immediately see that we are talking about a nagetive
edit_flag.Agree, I'll change it.
I was unsure of the style and copied from the earlier condition:if (0 <= edit_flag) use_editor = edit_flag;
There are two valid schools of thought when it comes to comparison.
Some folks consider that a comparison between a variable and a constant is a statement about the variable, hence the expression should be
if (VARIRABLE comparison-operator CONSTANT)
They will write things like:
if (edit_flag >= 0) if (edit_flag < 0)
Other folks consider that textual order of the comparison should match the actual order of the things being compared, as if they are arranged on a number line, hence the expression should be
if (SMALLER < LARGER)
no matter which one is variable and which one is constant.
They will write:
if (0 <= edit_flag) if (edit_flag < 0)
The case in question, asserting that edit_flag is negative, is what both camps agree how to write.
PATCH v3 1/1 commit: restore --edit when combined with --fixup
In reply to Joel Klinghed via GitGitGadgetFrom: Joel Klinghed <[email protected]>
Recent changes to --fixup, adding amend suboption, caused the --edit flag to be ignored as use_editor was always set to zero.
Restore edit_flag having higher priority than fixup_message when deciding the value of use_editor by only changing the default if edit_flag is not set.
---
commit: restore --edit when combined with --fixup
Recent changes to --fixup, adding amend suboption, caused the --edit flag to be ignored as use_editor was always set to zero.
Restore edit_flag having higher priority than fixup_message when deciding the value of use_editor by only changing the default if edit_flag is not set.
Changes since v1: Added test verifying that --fixup --edit brings up editor.
Changes since v2: Clarify if condition and use write_script helper in test.
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1014%2Fthejk%2Ffixup_edit-v3
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1014/thejk/fixup_edit-v3
Pull-Request: https://github.com/gitgitgadget/git/pull/1014
Range-diff vs v2:
1: 0ee926d4149 ! 1: 6bc5d8bbe61 commit: restore --edit when combined with --fixup
@@ builtin/commit.c: static int parse_and_validate_options(int argc, const char *ar
fixup_commit = fixup_message;
fixup_prefix = "fixup";
- use_editor = 0;
-+ if (0 > edit_flag)
++ if (edit_flag < 0)
+ use_editor = 0;
}
}
@@ t/t7500-commit-template-squash-signoff.sh: test_expect_success 'commit --fixup -
'
+test_expect_success 'commit --fixup --edit' '
+ commit_for_rebase_autosquash_setup &&
-+ cat >e-append <<-\EOF &&
-+ #!/bin/sh
++ write_script e-append <<-\EOF &&
+ sed -e "2a\\
+something\\
+extra" <"$1" >"$1-"
+ mv "$1-" "$1"
+ EOF
-+ chmod 755 e-append &&
+ EDITOR="./e-append" git commit --fixup HEAD~1 --edit &&
+ commit_msg_is "fixup! target message subject linesomething
+extra"builtin/commit.c | 3 ++- t/t7500-commit-template-squash-signoff.sh | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-)
builtin/commit.c +2 -1
@@ -1333,7 +1333,8 @@ static int parse_and_validate_options(int argc, const char *argv[], }else { fixup_commit = fixup_message; fixup_prefix ="fixup" ; - use_editor =0 ; +if (edit_flag <0 ) + use_editor =0 ; } }
t/t7500-commit-template-squash-signoff.sh +13 -0
@@ -281,6 +281,19 @@ test_expect_success 'commit --fixup -m"something" -m"extra"' ' extra" ' +test_expect_success 'commit --fixup --edit' ' + commit_for_rebase_autosquash_setup && + write_script e-append <<-\EOF && + sed -e "2a\\ +something\\ +extra" <"$1" >"$1-" + mv "$1-" "$1" + EOF + EDITOR="./e-append" git commit --fixup HEAD~1 --edit && + commit_msg_is "fixup! target message subject linesomething +extra" +' + get_commit_msg () { rev="$1" && git log -1 --pretty=format:"%B" "$rev"
base-commit: ebf3c04b262aa27fbb97f8a0156c2347fecafafb
Signature · 1 line
gitgitgadget
Hi Joel
Quoted 8 lines · Joel Klinghed via GitGitGadget
From: Joel Klinghed <[email protected]>
Recent changes to --fixup, adding amend suboption, caused the --edit flag to be ignored as
use_editorwas always set to zero.Restore
edit_flaghaving higher priority thanfixup_messagewhen deciding the value ofuse_editorby only changing the default ifedit_flagis not set.
Thanks for fixing this
Quoted 5 lines
builtin/commit.c +0
-0
builtin/commit.c static int parse_and_validate_options(int argc, const char *argv[], · line 1340
Quoted 9 lines
builtin/commit.c +2
-1@@ -1333,7 +1333,8 @@ static int parse_and_validate_options(int argc, const char *argv[], }else { fixup_commit = fixup_message; fixup_prefix ="fixup" ; - use_editor =0 ; +if (edit_flag <0 ) + use_editor =0 ; } }
Commit 494d314a05 ("commit: add amend suboption to --fixup to create amend! commit", 2021-03-15) that broke this has the following hunk above this change
@@ -1170,7 +1206,7 @@ static int parse_and_validate_options(int argc, const char *argv[],
if (force_author && renew_authorship)
die(_("Using both --reset-author and --author does not make sense"));
- if (logfile || have_option_m || use_message || fixup_message)
+ if (logfile || have_option_m || use_message)
use_editor = 0;
if (0 <= edit_flag)
use_editor = edit_flag;I think it should have moved those last two context lines that set use_editor to below the part that you are fixing. Then the use_editor = 0 line that you are changing continues to work as before. (As you see there are quite a few legacy Yoda conditions in this file, nowadays we avoid adding new ones). I'm not sure if it is worth re working this patch to do that, but it does have the advantage of only testing edit_flag once.
Quoted 6 lines
t/t7500-commit-template-squash-signoff.sh +0
-0@@ -281,6 +281,19 @@ test_expect_success 'commit --fixup -m"something" -m"extra"' '
t/t7500-commit-template-squash-signoff.sh test_expect_success 'commit --fixup -m"something" -m"extra"' ' · line 291
Quoted 10 lines
t/t7500-commit-template-squash-signoff.sh +8
-0extra" ' +test_expect_success 'commit --fixup --edit' ' + commit_for_rebase_autosquash_setup && + write_script e-append <<-\EOF && + sed -e "2a\\ +something\\ +extra" <"$1" >"$1-" + mv "$1-" "$1" + EOF
Again I'm not sure it is worth changing it now but for future reference this is a rather complicated way of appending to the commit message. The test file has an example using set_fake_editor() together with FAKE_COMMIT_AMEND just below where you have added this test or you can just have
EDITOR="echo something extra >>" git commit --fixup=HEAD~1 --edit
Best Wishes
Phillip
Quoted 11 lines
t/t7500-commit-template-squash-signoff.sh +5
-0+ EDITOR="./e-append" git commit --fixup HEAD~1 --edit && + commit_msg_is "fixup! target message subject linesomething +extra" +' + get_commit_msg () { rev="$1" && git log -1 --pretty=format:"%B" "$rev"base-commit:
ebf3c04b262aa27fbb97f8a0156c2347fecafafb
Quoted 14 lines · Phillip Wood
Hi Joel
(quoted diff) +1
-1@@ -1170,7 +1206,7 @@ static int parse_and_validate_options(int argc, const char *argv[], if (force_author && renew_authorship) die(_("Using both --reset-author and --author does not make sense")); - if (logfile || have_option_m || use_message || fixup_message) + if (logfile || have_option_m || use_message) use_editor = 0;if (0 <= edit_flag) use_editor = edit_flag;
Quoted 7 lines
I think it should have moved those last two context lines that set
use_editorto below the part that you are fixing. Then theuse_editor = 0line that you are changing continues to work as before. (As you see there are quite a few legacy Yoda conditions in this file, nowadays we avoid adding new ones). I'm not sure if it is worth re working this patch to do that, but it does have the advantage of only testingedit_flagonce.
I looked at moving the condition to one place but as use_editor = 0 is only set for --fixup if there isn't a suboption specified I didn't want to have to duplicate the check for a suboption when deciding if use_editor should default to zero.
Quoted 23 lines
Quoted 6 lines
t/t7500-commit-template-squash-signoff.sh +0
-0@@ -281,6 +281,19 @@ test_expect_success 'commit --fixup -m"something" -m"extra"' 't/t7500-commit-template-squash-signoff.sh test_expect_success 'commit --fixup -m"something" -m"extra"' ' · line 291
Quoted 10 lines
t/t7500-commit-template-squash-signoff.sh +8
-0extra" ' +test_expect_success 'commit --fixup --edit' ' + commit_for_rebase_autosquash_setup && + write_script e-append <<-\EOF && + sed -e "2a\\ +something\\ +extra" <"$1" >"$1-" + mv "$1-" "$1" + EOFAgain I'm not sure it is worth changing it now but for future reference this is a rather complicated way of appending to the commit message. The test file has an example using
set_fake_editor()together withFAKE_COMMIT_AMENDjust below where you have added this test or you can just have
Quoted 6 lines
EDITOR="echo something extra >>" git commit --fixup=HEAD~1 --editBest Wishes
Phillip
Yeah, especially getting sed in a POSIX and BSD compatible mode took some doing. I wanted to have a similar output to the test above this one, with a line break between something and extra, and frankly, my shell-foo lacked for getting either FAKE_COMMIT_AMEND or EDITOR="... >>" to include a newline. But looking at it again, I realize that EDITOR="printf \"something\nextra\" >>" works just fine.
/JK
Quoted 15 lines · Joel Klinghed
Quoted 14 lines · Phillip Wood
Hi Joel
(quoted diff) +1
-1@@ -1170,7 +1206,7 @@ static int parse_and_validate_options(int argc, const char *argv[], if (force_author && renew_authorship) die(_("Using both --reset-author and --author does not make sense")); - if (logfile || have_option_m || use_message || fixup_message) + if (logfile || have_option_m || use_message) use_editor = 0;if (0 <= edit_flag) use_editor = edit_flag;
Quoted 12 lines
Quoted 7 lines
I think it should have moved those last two context lines that set
use_editorto below the part that you are fixing. Then theuse_editor = 0line that you are changing continues to work as before. (As you see there are quite a few legacy Yoda conditions in this file, nowadays we avoid adding new ones). I'm not sure if it is worth re working this patch to do that, but it does have the advantage of only testingedit_flagonce.I looked at moving the condition to one place but as
use_editor= 0 is only set for --fixup if there isn't a suboption specified I didn't want to have to duplicate the check for a suboption when deciding ifuse_editorshould default to zero.
I don't think you need to duplicate the check for a suboption, can't you just do this on top of master (i.e without you patch applied)?
builtin/commit.c +0 -0
@@ -1251,11 +1251,6 @@ static int parse_and_validate_options(int argc, const char *argv[],if (force_author && renew_authorship) die(_("Using both --reset-author and --author does not
make sense"));
- if (logfile || have_option_m || use_message)
- use_editor = 0;
- if (0 <= edit_flag)
- use_editor = edit_flag;
-
/* Sanity check options */
if (amend && !current_head)
die(_("You have nothing to amend."));
@@ -1344,6 +1339,11 @@ static int parse_and_validate_options(int argc, const char *argv[],
}
}+ if (logfile || have_option_m || use_message)
+ use_editor = 0;
+ if (0 <= edit_flag)
+ use_editor = edit_flag;
+
cleanup_mode = get_cleanup_mode(cleanup_arg, use_editor);
handle_untracked_files_arg(s);I chose to move the other clause that sets use_editor as well so they stay together.
Best wishes
Phillip
Quoted 40 lines
Quoted 24 lines
Quoted 7 lines
t/t7500-commit-template-squash-signoff.sh +0
-0@@ -281,6 +281,19 @@ test_expect_success 'commit --fixup -m"something" -m"extra"' 't/t7500-commit-template-squash-signoff.sh test_expect_success 'commit --fixup -m"something" -m"extra"' ' · line 291
Quoted 10 lines
t/t7500-commit-template-squash-signoff.sh +8
-0extra" ' +test_expect_success 'commit --fixup --edit' ' + commit_for_rebase_autosquash_setup && + write_script e-append <<-\EOF && + sed -e "2a\\ +something\\ +extra" <"$1" >"$1-" + mv "$1-" "$1" + EOFAgain I'm not sure it is worth changing it now but for future reference this is a rather complicated way of appending to the commit message. The test file has an example using
set_fake_editor()together withFAKE_COMMIT_AMENDjust below where you have added this test or you can just haveQuoted 6 lines
EDITOR="echo something extra >>" git commit --fixup=HEAD~1 --editBest Wishes
Phillip
Yeah, especially getting sed in a POSIX and BSD compatible mode took some doing. I wanted to have a similar output to the test above this one, with a line break between something and extra, and frankly, my shell-foo lacked for getting either
FAKE_COMMIT_AMENDor EDITOR="... >>" to include a newline. But looking at it again, I realize that EDITOR="printf \"something\nextra\" >>" works just fine./JK
Quoted 41 lines · Phillip Wood
Quoted 4 lines · Joel Klinghed
I looked at moving the condition to one place but as
use_editor= 0 is only set for --fixup if there isn't a suboption specified I didn't want to have to duplicate the check for a suboption when deciding ifuse_editorshould default to zero.I don't think you need to duplicate the check for a suboption, can't you just do this on top of master (i.e without you patch applied)?
builtin/commit.c +0
-5@@ -1251,11 +1251,6 @@ static int parse_and_validate_options(int argc, const char *argv[], if (force_author && renew_authorship) die(_("Using both --reset-author and --author does not make sense")); - if (logfile || have_option_m || use_message) - use_editor = 0; -if (0 <= edit_flag) - use_editor = edit_flag; - /* Sanity check options */if (amend && !current_head) die(_("You have nothing to amend."));builtin/commit.c +5
-0@@ -1344,6 +1339,11 @@ static int parse_and_validate_options(int argc, const char *argv[], } } +if (logfile || have_option_m || use_message) + use_editor =0 ; +if (0 <= edit_flag) + use_editor = edit_flag; + cleanup_mode =get_cleanup_mode (cleanup_arg, use_editor);handle_untracked_files_arg(s);
Quoted 3 lines
I chose to move the other clause that sets
use_editoras well so they stay together.
With the above change use_editor no longer defaults to 0 for --fixup as it used to do.
My expected behavior (based on old versions):
git commit --fixup <hash> /// No editor
git commit --fixup <hash> --edit /// Editor
As far as I can see your change would display an editor in both cases.
An alternative would be:
+ if (logfile || have_option_m || use_message || fixup_message)
+ use_editor = 0;
+ if (0 <= edit_flag)
+ use_editor = edit_flag;
That would fix the above cases but in
"commit: add amend suboption to --fixup to create amend! commit" the implementation left
git commit --fixup amend:<hash> // Editor
and I didn't want to change that. But if the default should be no editor here as well then the above would be a better patch.
/JK
Hi Joel
Quoted 44 lines · Joel Klinghed
Quoted 41 lines · Phillip Wood
Quoted 4 lines · Joel Klinghed
I looked at moving the condition to one place but as
use_editor= 0 is only set for --fixup if there isn't a suboption specified I didn't want to have to duplicate the check for a suboption when deciding ifuse_editorshould default to zero.I don't think you need to duplicate the check for a suboption, can't you just do this on top of master (i.e without you patch applied)?
builtin/commit.c +0
-5@@ -1251,11 +1251,6 @@ static int parse_and_validate_options(int argc, const char *argv[], if (force_author && renew_authorship) die(_("Using both --reset-author and --author does not make sense")); - if (logfile || have_option_m || use_message) - use_editor = 0; -if (0 <= edit_flag) - use_editor = edit_flag; - /* Sanity check options */if (amend && !current_head) die(_("You have nothing to amend."));builtin/commit.c +5
-0@@ -1344,6 +1339,11 @@ static int parse_and_validate_options(int argc, const char *argv[], } } +if (logfile || have_option_m || use_message) + use_editor =0 ; +if (0 <= edit_flag) + use_editor = edit_flag; + cleanup_mode =get_cleanup_mode (cleanup_arg, use_editor);handle_untracked_files_arg(s);
Quoted 10 lines
Quoted 3 lines
I chose to move the other clause that sets
use_editoras well so they stay together.With the above change
use_editorno longer defaults to 0 for --fixup as it used to do.
My expected behavior (based on old versions):
git commit --fixup <hash> /// No editor
git commit --fixup <hash> --edit /// Editor
As far as I can see your change would display an editor in both cases.
I've just tested it and it works as expected. However moving the 'if (logfile...)' breaks the test "commit --squash works with -c" so we need to just move the second if clause. This is what I have on top of master (i.e. without your patch so a plain fixup is still setting use_editor=0)
builtin/commit.c +3 -2
@@ -1253,8 +1253,6 @@ static int parse_and_validate_options(int argc, const char *argv[],if (logfile || have_option_m || use_message) use_editor =0 ; -if (0 <= edit_flag) - use_editor = edit_flag;/* Sanity check options */ if (amend && !current_head)
@@ -1344,6 +1342,9 @@ static int parse_and_validate_options(int argc, const char *argv[], } } +if (0 <= edit_flag) + use_editor = edit_flag; + cleanup_mode =get_cleanup_mode (cleanup_arg, use_editor);handle_untracked_files_arg (s);
t/t7500-commit-template-squash-signoff.sh +9 -1
@@ -270,7 +270,7 @@ EOF test_expect_success 'commit --fixup provides correct one-line commit message' ' commit_for_rebase_autosquash_setup && - git commit --fixup HEAD~1 && + EDITOR="printf \"something\nextra\" >>" git commit --fixup HEAD~1 && commit_msg_is "fixup! target message subject line" '
@@ -281,6 +281,14 @@ test_expect_success 'commit --fixup -m"something" -m"extra"' ' extra" ' + +test_expect_success 'commit --fixup --edit' ' + commit_for_rebase_autosquash_setup && + EDITOR="printf \"something\nextra\" >>" git commit --fixup HEAD~1 --edit && + commit_msg_is "fixup! target message subject linesomething +extra" +' + get_commit_msg () { rev="$1" && git log -1 --pretty=format:"%B" "$rev"
Quoted 9 lines · Phillip Wood
Quoted 7 lines · Joel Klinghed
With the above change
use_editorno longer defaults to 0 for --fixup as it used to do.
My expected behavior (based on old versions):
git commit --fixup <hash> /// No editor
git commit --fixup <hash> --edit /// Editor
As far as I can see your change would display an editor in both cases.
Quoted 6 lines
I've just tested it and it works as expected. However moving the 'if (logfile...)' breaks the test "commit --squash works with -c" so we need to just move the second if clause. This is what I have on top of master (i.e. without your patch so a plain fixup is still setting use_editor=0)
Ah, my bad. I misunderstood and thought your first patch was to be applied without my fixes. This way is cleaner, no doubt.
Quoted 12 lines
t/t7500-commit-template-squash-signoff.sh +0
-0@@ -270,7 +270,7 @@ EOF test_expect_success 'commit --fixup provides correct one-line commitmessage' '
commit_for_rebase_autosquash_setup &&t/t7500-commit-template-squash-signoff.sh +1
-1- git commit --fixup HEAD~1 && + EDITOR="printf \"something\nextra\" >>" git commit --fixup
Quoted 3 lines
HEAD~1 &&
commit_msg_is"fixup! target message subject line"
'
Good idea to make --fixup without edit behavior verification explicit.
/JK
PATCH v4 1/1 commit: restore --edit when combined with --fixup
In reply to Joel Klinghed via GitGitGadgetFrom: Joel Klinghed <[email protected]>
Recent changes to --fixup, adding amend suboption, caused the --edit flag to be ignored as use_editor was always set to zero.
Restore edit_flag having higher priority than fixup_message when deciding the value of use_editor by only changing the default if edit_flag is not set.
---
commit: restore --edit when combined with --fixup
Recent changes to --fixup, adding amend suboption, caused the --edit flag to be ignored as use_editor was always set to zero.
Restore edit_flag having higher priority than fixup_message when deciding the value of use_editor by only changing the default if edit_flag is not set.
Changes since v1: Added test verifying that --fixup --edit brings up editor.
Changes since v2: Clarify if condition and use write_script helper in test.
Changes since v3: Simplify test.
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1014%2Fthejk%2Ffixup_edit-v4
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1014/thejk/fixup_edit-v4
Pull-Request: https://github.com/gitgitgadget/git/pull/1014
Range-diff vs v3:
1: 6bc5d8bbe61 ! 1: 0c0cb647e03 commit: restore --edit when combined with --fixup
@@ t/t7500-commit-template-squash-signoff.sh: test_expect_success 'commit --fixup -
'
+test_expect_success 'commit --fixup --edit' '
+ commit_for_rebase_autosquash_setup &&
-+ write_script e-append <<-\EOF &&
-+ sed -e "2a\\
-+something\\
-+extra" <"$1" >"$1-"
-+ mv "$1-" "$1"
-+ EOF
-+ EDITOR="./e-append" git commit --fixup HEAD~1 --edit &&
++ EDITOR="printf \"something\nextra\" >>" git commit --fixup HEAD~1 --edit &&
+ commit_msg_is "fixup! target message subject linesomething
+extra"
+'builtin/commit.c | 3 ++- t/t7500-commit-template-squash-signoff.sh | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-)
builtin/commit.c +2 -1
@@ -1333,7 +1333,8 @@ static int parse_and_validate_options(int argc, const char *argv[], }else { fixup_commit = fixup_message; fixup_prefix ="fixup" ; - use_editor =0 ; +if (edit_flag <0 ) + use_editor =0 ; } }
t/t7500-commit-template-squash-signoff.sh +7 -0
@@ -281,6 +281,13 @@ test_expect_success 'commit --fixup -m"something" -m"extra"' ' extra" ' +test_expect_success 'commit --fixup --edit' ' + commit_for_rebase_autosquash_setup && + EDITOR="printf \"something\nextra\" >>" git commit --fixup HEAD~1 --edit && + commit_msg_is "fixup! target message subject linesomething +extra" +' + get_commit_msg () { rev="$1" && git log -1 --pretty=format:"%B" "$rev"
base-commit: ebf3c04b262aa27fbb97f8a0156c2347fecafafb
Signature · 1 line
gitgitgadget
PATCH v5 1/1 commit: restore --edit when combined with --fixup
From: Joel Klinghed <[email protected]>
Recent changes to --fixup, adding amend suboption, caused the --edit flag to be ignored as use_editor was always set to zero.
Restore edit_flag having higher priority than fixup_message when deciding the value of use_editor by moving the edit flag condition later in the method.
---
commit: restore --edit when combined with --fixup
Recent changes to --fixup, adding amend suboption, caused the --edit flag to be ignored as use_editor was always set to zero.
Restore edit_flag having higher priority than fixup_message when deciding the value of use_editor by only changing the default if edit_flag is not set.
Changes since v1: Added test verifying that --fixup --edit brings up editor.
Changes since v2: Clarify if condition and use write_script helper in test.
Changes since v3: Simplify test.
Changes since v4: Using cleaner fix by Phillip Wood instead and added an explicit verification to a test for --fixup without --edit.
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1014%2Fthejk%2Ffixup_edit-v5
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1014/thejk/fixup_edit-v5
Pull-Request: https://github.com/gitgitgadget/git/pull/1014
Range-diff vs v4:
1: 0c0cb647e03 ! 1: 1c608daf0cd commit: restore --edit when combined with --fixup
@@ Commit message
--edit flag to be ignored as use_editor was always set to zero.
Restore edit_flag having higher priority than fixup_message when
- deciding the value of use_editor by only changing the default
- if edit_flag is not set.
+ deciding the value of use_editor by moving the edit flag condition
+ later in the method.
Signed-off-by: Joel Klinghed <[email protected]>
## builtin/commit.c ##
@@ builtin/commit.c: static int parse_and_validate_options(int argc, const char *argv[],
- } else {
- fixup_commit = fixup_message;
- fixup_prefix = "fixup";
-- use_editor = 0;
-+ if (edit_flag < 0)
-+ use_editor = 0;
+
+ if (logfile || have_option_m || use_message)
+ use_editor = 0;
+- if (0 <= edit_flag)
+- use_editor = edit_flag;
+
+ /* Sanity check options */
+ if (amend && !current_head)
+@@ builtin/commit.c: static int parse_and_validate_options(int argc, const char *argv[],
}
}
++ if (0 <= edit_flag)
++ use_editor = edit_flag;
++
+ cleanup_mode = get_cleanup_mode(cleanup_arg, use_editor);
+
+ handle_untracked_files_arg(s);
## t/t7500-commit-template-squash-signoff.sh ##
+@@ t/t7500-commit-template-squash-signoff.sh: EOF
+
+ test_expect_success 'commit --fixup provides correct one-line commit message' '
+ commit_for_rebase_autosquash_setup &&
+- git commit --fixup HEAD~1 &&
++ EDITOR="echo ignored >>" git commit --fixup HEAD~1 &&
+ commit_msg_is "fixup! target message subject line"
+ '
+
@@ t/t7500-commit-template-squash-signoff.sh: test_expect_success 'commit --fixup -m"something" -m"extra"' '
extra"builtin/commit.c | 5 +++-- t/t7500-commit-template-squash-signoff.sh | 9 ++++++++- 2 files changed, 11 insertions(+), 3 deletions(-)
builtin/commit.c +3 -2
@@ -1246,8 +1246,6 @@ static int parse_and_validate_options(int argc, const char *argv[],if (logfile || have_option_m || use_message) use_editor =0 ; -if (0 <= edit_flag) - use_editor = edit_flag;/* Sanity check options */ if (amend && !current_head)
@@ -1337,6 +1335,9 @@ static int parse_and_validate_options(int argc, const char *argv[], } } +if (0 <= edit_flag) + use_editor = edit_flag; + cleanup_mode =get_cleanup_mode (cleanup_arg, use_editor);handle_untracked_files_arg (s);
t/t7500-commit-template-squash-signoff.sh +8 -1
@@ -270,7 +270,7 @@ EOF test_expect_success 'commit --fixup provides correct one-line commit message' ' commit_for_rebase_autosquash_setup && - git commit --fixup HEAD~1 && + EDITOR="echo ignored >>" git commit --fixup HEAD~1 && commit_msg_is "fixup! target message subject line" '
@@ -281,6 +281,13 @@ test_expect_success 'commit --fixup -m"something" -m"extra"' ' extra" ' +test_expect_success 'commit --fixup --edit' ' + commit_for_rebase_autosquash_setup && + EDITOR="printf \"something\nextra\" >>" git commit --fixup HEAD~1 --edit && + commit_msg_is "fixup! target message subject linesomething +extra" +' + get_commit_msg () { rev="$1" && git log -1 --pretty=format:"%B" "$rev"
base-commit: ebf3c04b262aa27fbb97f8a0156c2347fecafafb
Signature · 1 line
gitgitgadget
Hi Joel
Quoted 8 lines · Joel Klinghed via GitGitGadget
From: Joel Klinghed <[email protected]>
Recent changes to --fixup, adding amend suboption, caused the --edit flag to be ignored as
use_editorwas always set to zero.Restore
edit_flaghaving higher priority thanfixup_messagewhen deciding the value ofuse_editorby moving the edit flag condition later in the method.
This version looks good, thanks for revising it
Best Wishes
Phillip
Quoted 142 lines
Signed-off-by Joel Klinghed <[email protected]>---
commit: restore --edit when combined with --fixupRecent changes to --fixup, adding amend suboption, caused the --edit flag to be ignored as
use_editorwas always set to zero.Restore
edit_flaghaving higher priority thanfixup_messagewhen deciding the value ofuse_editorby only changing the default ifedit_flagis not set.Changes since v1: Added test verifying that --fixup --edit brings up editor.
Changes since v2: Clarify if condition and use
write_scripthelper in test.Changes since v3: Simplify test.
Changes since v4: Using cleaner fix by Phillip Wood instead and added an explicit verification to a test for --fixup without --edit.
Signed-off-by Joel Klinghed [email protected]Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1014%2Fthejk%2Ffixup_edit-v5
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1014/thejk/fixup_edit-v5
Pull-Request: https://github.com/gitgitgadget/git/pull/1014Range-diff vs v4:
1:
0c0cb647e03! 1:1c608daf0cdcommit: restore --edit when combined with --fixup@@ Commit message --edit flag to be ignored as use_editor was always set to zero. Restore edit_flag having higher priority than fixup_message when - deciding the value of use_editor by only changing the default - if edit_flag is not set. + deciding the value of use_editor by moving the edit flag condition + later in the method. Signed-off-by: Joel Klinghed <[email protected]> ## builtin/commit.c ## @@ builtin/commit.c: static int parse_and_validate_options(int argc, const char *argv[], - } else { - fixup_commit = fixup_message; - fixup_prefix = "fixup"; -- use_editor = 0; -+ if (edit_flag < 0) -+ use_editor = 0; + + if (logfile || have_option_m || use_message) + use_editor = 0; +- if (0 <= edit_flag) +- use_editor = edit_flag; + + /* Sanity check options */ + if (amend && !current_head) +@@ builtin/commit.c: static int parse_and_validate_options(int argc, const char *argv[], } } ++ if (0 <= edit_flag) ++ use_editor = edit_flag; ++ + cleanup_mode = get_cleanup_mode(cleanup_arg, use_editor); + + handle_untracked_files_arg(s); ## t/t7500-commit-template-squash-signoff.sh ## +@@ t/t7500-commit-template-squash-signoff.sh: EOF + + test_expect_success 'commit --fixup provides correct one-line commit message' ' + commit_for_rebase_autosquash_setup && +- git commit --fixup HEAD~1 && ++ EDITOR="echo ignored >>" git commit --fixup HEAD~1 && + commit_msg_is "fixup! target message subject line" + ' + @@ t/t7500-commit-template-squash-signoff.sh: test_expect_success 'commit --fixup -m"something" -m"extra"' ' extra"builtin/commit.c | 5 +++-- t/t7500-commit-template-squash-signoff.sh | 9 ++++++++- 2 files changed, 11 insertions(+), 3 deletions(-)builtin/commit.c +3
-2@@ -1246,8 +1246,6 @@ static int parse_and_validate_options(int argc, const char *argv[],if (logfile || have_option_m || use_message) use_editor =0 ; -if (0 <= edit_flag) - use_editor = edit_flag;/* Sanity check options */ if (amend && !current_head)@@ -1337,6 +1335,9 @@ static int parse_and_validate_options(int argc, const char *argv[], } } +if (0 <= edit_flag) + use_editor = edit_flag; + cleanup_mode =get_cleanup_mode (cleanup_arg, use_editor);handle_untracked_files_arg (s);t/t7500-commit-template-squash-signoff.sh +8
-1@@ -270,7 +270,7 @@ EOF test_expect_success 'commit --fixup provides correct one-line commit message' ' commit_for_rebase_autosquash_setup && - git commit --fixup HEAD~1 && + EDITOR="echo ignored >>" git commit --fixup HEAD~1 && commit_msg_is "fixup! target message subject line" '@@ -281,6 +281,13 @@ test_expect_success 'commit --fixup -m"something" -m"extra"' ' extra" ' +test_expect_success 'commit --fixup --edit' ' + commit_for_rebase_autosquash_setup && + EDITOR="printf \"something\nextra\" >>" git commit --fixup HEAD~1 --edit && + commit_msg_is "fixup! target message subject linesomething +extra" +' + get_commit_msg () { rev="$1" && git log -1 --pretty=format:"%B" "$rev"base-commit:
ebf3c04b262aa27fbb97f8a0156c2347fecafafb