git/t/t3436-rebase-more-options.sh
Jeff King 56706dba33 t3436: check --committer-date-is-author-date result more carefully
After running "rebase --committer-date-is-author-date", we confirm that
the committer date is the same as the author date. However, we don't
look at any other parts of the committer ident line to make sure we
didn't screw them up. And indeed, there are a few bugs here. Depending
on the rebase backend in use, we may accidentally use the author email
instead of the committer's, or even an empty string.

Let's teach our test_ctime_is_atime helper to check the committer name
and email, which reveals several failing tests.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-10-23 08:25:17 -07:00

181 lines
5.5 KiB
Bash
Executable file

#!/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="$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> %ai" >authortime &&
git log $1 --format="%cn <%ce> %ci" >committertime &&
test_cmp authortime committertime
}
test_expect_failure '--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_failure '--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_failure '--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_failure '--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_failure '--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