Browse Source
"git rebase -i" learns a bit more options. * pw/rebase-i-more-options: t3436: do not run git-merge-recursive in dashed form rebase: add --reset-author-date rebase -i: support --ignore-date rebase -i: support --committer-date-is-author-date am: stop exporting GIT_COMMITTER_DATE rebase -i: add --ignore-whitespace flagmaint
Junio C Hamano
4 years ago
11 changed files with 423 additions and 49 deletions
@ -0,0 +1,180 @@
@@ -0,0 +1,180 @@
|
||||
#!/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 master && |
||||
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=%ai >authortime && |
||||
git log $1 --format=%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 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 --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 |
Loading…
Reference in new issue