You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
209 lines
6.4 KiB
209 lines
6.4 KiB
#!/bin/sh |
|
# |
|
# Copyright (c) 2019 Rohit Ashiwal |
|
# |
|
|
|
test_description='tests to ensure compatibility between am and interactive backends' |
|
|
|
. ./test-lib.sh |
|
|
|
. "$TEST_DIRECTORY"/lib-rebase.sh |
|
|
|
GIT_AUTHOR_DATE="1999-04-02T08:03:20+05:30" |
|
export GIT_AUTHOR_DATE |
|
|
|
# This is a special case in which both am and interactive backends |
|
# provide the same output. It was done intentionally because |
|
# both the backends fall short of optimal behaviour. |
|
test_expect_success 'setup' ' |
|
git checkout -b topic && |
|
test_write_lines "line 1" " line 2" "line 3" >file && |
|
git add file && |
|
git commit -m "add file" && |
|
|
|
test_write_lines "line 1" "new line 2" "line 3" >file && |
|
git commit -am "update file" && |
|
git tag side && |
|
test_commit commit1 foo foo1 && |
|
test_commit commit2 foo foo2 && |
|
test_commit commit3 foo foo3 && |
|
|
|
git checkout --orphan main && |
|
rm foo && |
|
test_write_lines "line 1" " line 2" "line 3" >file && |
|
git commit -am "add file" && |
|
git tag main && |
|
|
|
mkdir test-bin && |
|
write_script test-bin/git-merge-test <<-\EOF |
|
exec git merge-recursive "$@" |
|
EOF |
|
' |
|
|
|
test_expect_success '--ignore-whitespace works with apply backend' ' |
|
test_must_fail git rebase --apply main side && |
|
git rebase --abort && |
|
git rebase --apply --ignore-whitespace main side && |
|
git diff --exit-code side |
|
' |
|
|
|
test_expect_success '--ignore-whitespace works with merge backend' ' |
|
test_must_fail git rebase --merge main side && |
|
git rebase --abort && |
|
git rebase --merge --ignore-whitespace main side && |
|
git diff --exit-code side |
|
' |
|
|
|
test_expect_success '--ignore-whitespace is remembered when continuing' ' |
|
( |
|
set_fake_editor && |
|
FAKE_LINES="break 1" git rebase -i --ignore-whitespace \ |
|
main side && |
|
git rebase --continue |
|
) && |
|
git diff --exit-code side |
|
' |
|
|
|
test_ctime_is_atime () { |
|
git log $1 --format="$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> %ai" >authortime && |
|
git log $1 --format="%cn <%ce> %ci" >committertime && |
|
test_cmp authortime committertime |
|
} |
|
|
|
test_expect_success '--committer-date-is-author-date works with apply backend' ' |
|
GIT_AUTHOR_DATE="@1234 +0300" git commit --amend --reset-author && |
|
git rebase --apply --committer-date-is-author-date HEAD^ && |
|
test_ctime_is_atime -1 |
|
' |
|
|
|
test_expect_success '--committer-date-is-author-date works with merge backend' ' |
|
GIT_AUTHOR_DATE="@1234 +0300" git commit --amend --reset-author && |
|
git rebase -m --committer-date-is-author-date HEAD^ && |
|
test_ctime_is_atime -1 |
|
' |
|
|
|
test_expect_success '--committer-date-is-author-date works when rewording' ' |
|
GIT_AUTHOR_DATE="@1234 +0300" git commit --amend --reset-author && |
|
( |
|
set_fake_editor && |
|
FAKE_COMMIT_MESSAGE=edited \ |
|
FAKE_LINES="reword 1" \ |
|
git rebase -i --committer-date-is-author-date HEAD^ |
|
) && |
|
test_write_lines edited "" >expect && |
|
git log --format="%B" -1 >actual && |
|
test_cmp expect actual && |
|
test_ctime_is_atime -1 |
|
' |
|
|
|
test_expect_success '--committer-date-is-author-date works with rebase -r' ' |
|
git checkout side && |
|
GIT_AUTHOR_DATE="@1234 +0300" git merge --no-ff commit3 && |
|
git rebase -r --root --committer-date-is-author-date && |
|
test_ctime_is_atime |
|
' |
|
|
|
test_expect_success '--committer-date-is-author-date works when forking merge' ' |
|
git checkout side && |
|
GIT_AUTHOR_DATE="@1234 +0300" git merge --no-ff commit3 && |
|
PATH="./test-bin:$PATH" git rebase -r --root --strategy=test \ |
|
--committer-date-is-author-date && |
|
test_ctime_is_atime |
|
' |
|
|
|
test_expect_success '--committer-date-is-author-date works when committing conflict resolution' ' |
|
git checkout commit2 && |
|
GIT_AUTHOR_DATE="@1980 +0000" git commit --amend --only --reset-author && |
|
test_must_fail git rebase -m --committer-date-is-author-date \ |
|
--onto HEAD^^ HEAD^ && |
|
echo resolved > foo && |
|
git add foo && |
|
git rebase --continue && |
|
test_ctime_is_atime -1 |
|
' |
|
|
|
# Checking for +0000 in the author date is sufficient since the |
|
# default timezone is UTC but the timezone used while committing is |
|
# +0530. The inverted logic in the grep is necessary to check all the |
|
# author dates in the file. |
|
test_atime_is_ignored () { |
|
git log $1 --format=%ai >authortime && |
|
! grep -v +0000 authortime |
|
} |
|
|
|
test_expect_success '--reset-author-date works with apply backend' ' |
|
git commit --amend --date="$GIT_AUTHOR_DATE" && |
|
git rebase --apply --reset-author-date HEAD^ && |
|
test_atime_is_ignored -1 |
|
' |
|
|
|
test_expect_success '--reset-author-date works with merge backend' ' |
|
git commit --amend --date="$GIT_AUTHOR_DATE" && |
|
git rebase --reset-author-date -m HEAD^ && |
|
test_atime_is_ignored -1 |
|
' |
|
|
|
test_expect_success '--reset-author-date works after conflict resolution' ' |
|
test_must_fail git rebase --reset-author-date -m \ |
|
--onto commit2^^ commit2^ commit2 && |
|
echo resolved >foo && |
|
git add foo && |
|
git rebase --continue && |
|
test_atime_is_ignored -1 |
|
' |
|
|
|
test_expect_success '--reset-author-date works with rebase -r' ' |
|
git checkout side && |
|
git merge --no-ff commit3 && |
|
git rebase -r --root --reset-author-date && |
|
test_atime_is_ignored |
|
' |
|
|
|
test_expect_success '--reset-author-date with --committer-date-is-author-date works' ' |
|
test_must_fail git rebase -m --committer-date-is-author-date \ |
|
--reset-author-date --onto commit2^^ commit2^ commit3 && |
|
git checkout --theirs foo && |
|
git add foo && |
|
git rebase --continue && |
|
test_ctime_is_atime -2 && |
|
test_atime_is_ignored -2 |
|
' |
|
|
|
test_expect_success 'reset-author-date with --committer-date-is-author-date works when rewording' ' |
|
GIT_AUTHOR_DATE="@1234 +0300" git commit --amend --reset-author && |
|
( |
|
set_fake_editor && |
|
FAKE_COMMIT_MESSAGE=edited \ |
|
FAKE_LINES="reword 1" \ |
|
git rebase -i --committer-date-is-author-date \ |
|
--reset-author-date HEAD^ |
|
) && |
|
test_write_lines edited "" >expect && |
|
git log --format="%B" -1 >actual && |
|
test_cmp expect actual && |
|
test_atime_is_ignored -1 |
|
' |
|
|
|
test_expect_success '--reset-author-date --committer-date-is-author-date works when forking merge' ' |
|
GIT_SEQUENCE_EDITOR="echo \"merge -C $(git rev-parse HEAD) commit3\">" \ |
|
PATH="./test-bin:$PATH" git rebase -i --strategy=test \ |
|
--reset-author-date \ |
|
--committer-date-is-author-date side side && |
|
test_ctime_is_atime -1 && |
|
test_atime_is_ignored -1 |
|
' |
|
|
|
test_expect_success '--ignore-date is an alias for --reset-author-date' ' |
|
git commit --amend --date="$GIT_AUTHOR_DATE" && |
|
git rebase --apply --ignore-date HEAD^ && |
|
git commit --allow-empty -m empty --date="$GIT_AUTHOR_DATE" && |
|
git rebase -m --ignore-date HEAD^ && |
|
test_atime_is_ignored -2 |
|
' |
|
|
|
# This must be the last test in this file |
|
test_expect_success '$EDITOR and friends are unchanged' ' |
|
test_editor_unchanged |
|
' |
|
|
|
test_done
|
|
|