| #!/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 |