Re: [PATCH 0/3] Add a "fix" command to "rebase --interactive"
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Dec 9, 2009, 06:16 UTC
- Message-ID
- <7vaaxsvfie.fsf@alter.siamese.dyndns.org>
- In-Reply-To
- <7viqchhl7h.fsf@alter.siamese.dyndns.org>
Junio C Hamano <gitster@pobox.com> writes:
Show 32 quoted lines
> Nanako Shiraishi <nanako3@lavabit.com> 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