Junio C Hamano <gitster@xxxxxxxxx> writes: > Nanako Shiraishi <nanako3@xxxxxxxxxxx> writes: > >> @@ -519,6 +521,43 @@ get_saved_options () { >> test -f "$DOTEST"/rebase-root && REBASE_ROOT=t >> } >> >> +# Rearrange the todo list that has both "pick sha1 msg" and >> +# "pick sha1 !fixup/!squash msg" appears in it so that the latter >> +# comes immediately after the former, and change "pick" to >> +# "fixup"/"squash". >> +rearrange_squash () { >> + sed -n -e 's/^pick \([0-9a-f]*\) !\(squash\) /\1 \2 /p' \ >> + -e 's/^pick \([0-9a-f]*\) !\(fixup\) /\1 \2 /p' \ >> + "$1" >"$1.sq" >> + test -s "$1.sq" || return >> + >> + sed -e '/^pick [0-9a-f]* !squash /d' \ >> + -e '/^pick [0-9a-f]* !fixup /d' \ >> + "$1" | >> + ( >> + used= >> + while read pick sha1 message >> + do >> + ... >> + done >"$1.rearranged" >> + ) >> + cat "$1.rearranged" >"$1" >> + rm -f "$1.sq" >> +} > > The logic to move the lines seem to have been improved since the last > round, which is good. I've amended this to remove "$1.rearranged" as well. Actually I think the logic in the version from the June is more correct; doesn't this version drop commits that are marked as "squash! <message>" but with a misspelled <message> part? I think your old version, when it didn't find a matching one in early part, left such an unmatched "fixup" in place. Here is a fix-up patch I think should be squashed in. I added a test to make sure that a mismatching "squash!" is kept in place. Please double check for sanity. Thanks. git-rebase--interactive.sh | 38 ++++++++++++++++---------------------- t/t3415-rebase-autosquash.sh | 15 +++++++++++++++ 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index c68cc5b..935e9e1 100755 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -531,29 +531,23 @@ rearrange_squash () { "$1" >"$1.sq" test -s "$1.sq" || return - sed -e '/^pick [0-9a-f]* squash! /d' \ - -e '/^pick [0-9a-f]* fixup! /d' \ - "$1" | - ( - used= - while read pick sha1 message + used= + while read pick sha1 message + do + case " $used" in + *" $sha1 "*) continue ;; + esac + echo "$pick $sha1 $message" + while read squash action msg do - echo "$pick $sha1 $message" - while read squash action msg - do - case " $used" in - *" $squash "*) - continue ;; - esac - case "$message" in - "$msg"*) - echo "$action $squash $action! $msg" - used="$used$squash " - ;; - esac - done <"$1.sq" - done >"$1.rearranged" - ) + case "$message" in + "$msg"*) + echo "$action $squash $action! $msg" + used="$used$squash " + ;; + esac + done <"$1.sq" + done >"$1.rearranged" <"$1" cat "$1.rearranged" >"$1" rm -f "$1.sq" "$1.rearranged" } diff --git a/t/t3415-rebase-autosquash.sh b/t/t3415-rebase-autosquash.sh index f7a0f7a..b63f4e2 100755 --- a/t/t3415-rebase-autosquash.sh +++ b/t/t3415-rebase-autosquash.sh @@ -55,4 +55,19 @@ test_expect_success 'auto squash' ' test 2 = $(git cat-file commit HEAD^ | grep first | wc -l) ' +test_expect_success 'misspelled auto squash' ' + git reset --hard base && + echo 1 >file1 && + git add -u && + test_tick && + git commit -m "squash! forst" + git tag final-missquash && + test_tick && + git rebase --autosquash -i HEAD^^^ && + git log --oneline >actual && + test 4 = $(wc -l <actual) && + git diff --exit-code final-missquash && + test 0 = $(git rev-list final-missquash...HEAD | wc -l) +' + test_done -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html