2006-06-25 05:29:49 +04:00
|
|
|
#!/bin/sh
|
|
|
|
#
|
|
|
|
# Copyright (c) 2006 Eric Wong
|
|
|
|
#
|
|
|
|
|
|
|
|
test_description='git rebase --merge --skip tests'
|
|
|
|
|
2020-11-19 02:44:25 +03:00
|
|
|
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
|
tests: mark tests relying on the current default for `init.defaultBranch`
In addition to the manual adjustment to let the `linux-gcc` CI job run
the test suite with `master` and then with `main`, this patch makes sure
that GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME is set in all test scripts
that currently rely on the initial branch name being `master by default.
To determine which test scripts to mark up, the first step was to
force-set the default branch name to `master` in
- all test scripts that contain the keyword `master`,
- t4211, which expects `t/t4211/history.export` with a hard-coded ref to
initialize the default branch,
- t5560 because it sources `t/t556x_common` which uses `master`,
- t8002 and t8012 because both source `t/annotate-tests.sh` which also
uses `master`)
This trick was performed by this command:
$ sed -i '/^ *\. \.\/\(test-lib\|lib-\(bash\|cvs\|git-svn\)\|gitweb-lib\)\.sh$/i\
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master\
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\
' $(git grep -l master t/t[0-9]*.sh) \
t/t4211*.sh t/t5560*.sh t/t8002*.sh t/t8012*.sh
After that, careful, manual inspection revealed that some of the test
scripts containing the needle `master` do not actually rely on a
specific default branch name: either they mention `master` only in a
comment, or they initialize that branch specificially, or they do not
actually refer to the current default branch. Therefore, the
aforementioned modification was undone in those test scripts thusly:
$ git checkout HEAD -- \
t/t0027-auto-crlf.sh t/t0060-path-utils.sh \
t/t1011-read-tree-sparse-checkout.sh \
t/t1305-config-include.sh t/t1309-early-config.sh \
t/t1402-check-ref-format.sh t/t1450-fsck.sh \
t/t2024-checkout-dwim.sh \
t/t2106-update-index-assume-unchanged.sh \
t/t3040-subprojects-basic.sh t/t3301-notes.sh \
t/t3308-notes-merge.sh t/t3423-rebase-reword.sh \
t/t3436-rebase-more-options.sh \
t/t4015-diff-whitespace.sh t/t4257-am-interactive.sh \
t/t5323-pack-redundant.sh t/t5401-update-hooks.sh \
t/t5511-refspec.sh t/t5526-fetch-submodules.sh \
t/t5529-push-errors.sh t/t5530-upload-pack-error.sh \
t/t5548-push-porcelain.sh \
t/t5552-skipping-fetch-negotiator.sh \
t/t5572-pull-submodule.sh t/t5608-clone-2gb.sh \
t/t5614-clone-submodules-shallow.sh \
t/t7508-status.sh t/t7606-merge-custom.sh \
t/t9302-fast-import-unpack-limit.sh
We excluded one set of test scripts in these commands, though: the range
of `git p4` tests. The reason? `git p4` stores the (foreign) remote
branch in the branch called `p4/master`, which is obviously not the
default branch. Manual analysis revealed that only five of these tests
actually require a specific default branch name to pass; They were
modified thusly:
$ sed -i '/^ *\. \.\/lib-git-p4\.sh$/i\
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master\
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\
' t/t980[0167]*.sh t/t9811*.sh
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-11-19 02:44:19 +03:00
|
|
|
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
|
|
|
|
|
2006-06-25 05:29:49 +04:00
|
|
|
. ./test-lib.sh
|
|
|
|
|
2019-11-22 22:43:03 +03:00
|
|
|
. "$TEST_DIRECTORY"/lib-rebase.sh
|
|
|
|
|
2008-09-03 12:59:27 +04:00
|
|
|
# we assume the default git am -3 --skip strategy is tested independently
|
2006-06-25 05:29:49 +04:00
|
|
|
# and always works :)
|
|
|
|
|
|
|
|
test_expect_success setup '
|
|
|
|
echo hello > hello &&
|
|
|
|
git add hello &&
|
|
|
|
git commit -m "hello" &&
|
|
|
|
git branch skip-reference &&
|
2021-08-12 16:42:09 +03:00
|
|
|
git tag hello &&
|
2006-06-25 05:29:49 +04:00
|
|
|
|
|
|
|
echo world >> hello &&
|
|
|
|
git commit -a -m "hello world" &&
|
|
|
|
echo goodbye >> hello &&
|
|
|
|
git commit -a -m "goodbye" &&
|
2019-11-22 22:43:03 +03:00
|
|
|
git tag goodbye &&
|
|
|
|
|
|
|
|
git checkout --detach &&
|
|
|
|
git checkout HEAD^ . &&
|
|
|
|
test_tick &&
|
|
|
|
git commit -m reverted-goodbye &&
|
|
|
|
git tag reverted-goodbye &&
|
2019-12-06 19:06:09 +03:00
|
|
|
git checkout goodbye &&
|
|
|
|
test_tick &&
|
|
|
|
GIT_AUTHOR_NAME="Another Author" \
|
|
|
|
GIT_AUTHOR_EMAIL="another.author@example.com" \
|
2021-08-12 16:42:07 +03:00
|
|
|
git commit --amend --no-edit -m amended-goodbye \
|
|
|
|
--reset-author &&
|
2019-12-06 19:06:09 +03:00
|
|
|
test_tick &&
|
|
|
|
git tag amended-goodbye &&
|
2006-06-25 05:29:49 +04:00
|
|
|
|
|
|
|
git checkout -f skip-reference &&
|
|
|
|
echo moo > hello &&
|
|
|
|
git commit -a -m "we should skip this" &&
|
|
|
|
echo moo > cow &&
|
|
|
|
git add cow &&
|
|
|
|
git commit -m "this should not be skipped" &&
|
|
|
|
git branch pre-rebase skip-reference &&
|
|
|
|
git branch skip-merge skip-reference
|
|
|
|
'
|
|
|
|
|
2008-02-01 12:50:53 +03:00
|
|
|
test_expect_success 'rebase with git am -3 (default)' '
|
2021-08-12 16:42:08 +03:00
|
|
|
test_must_fail git rebase --apply main
|
apply --unidiff-zero: loosen sanity checks for --unidiff=0 patches
In "git-apply", we have a few sanity checks and heuristics that
expects that the patch fed to us is a unified diff with at least
one line of context.
* When there is no leading context line in a hunk, the hunk
must apply at the beginning of the preimage. Similarly, no
trailing context means that the hunk is anchored at the end.
* We learn a patch deletes the file from a hunk that has no
resulting line (i.e. all lines are prefixed with '-') if it
has not otherwise been known if the patch deletes the file.
Similarly, no old line means the file is being created.
And we declare an error condition when the file created by a
creation patch already exists, and/or when a deletion patch
still leaves content in the file.
These sanity checks are good safety measures, but breaks down
when people feed a diff generated with --unified=0. This was
recently noticed first by Matthew Wilcox and Gerrit Pape.
This adds a new flag, --unified-zero, to allow bypassing these
checks. If you are in control of the patch generation process,
you should not use --unified=0 patch and fix it up with this
flag; rather you should try work with a patch with context. But
if all you have to work with is a patch without context, this
flag may come handy as the last resort.
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-09-17 12:04:24 +04:00
|
|
|
'
|
2006-06-25 05:29:49 +04:00
|
|
|
|
2011-02-06 21:43:36 +03:00
|
|
|
test_expect_success 'rebase --skip can not be used with other options' '
|
|
|
|
test_must_fail git rebase -v --skip &&
|
|
|
|
test_must_fail git rebase --skip -v
|
|
|
|
'
|
|
|
|
|
2006-06-25 05:29:49 +04:00
|
|
|
test_expect_success 'rebase --skip with am -3' '
|
|
|
|
git rebase --skip
|
|
|
|
'
|
2007-11-12 16:11:46 +03:00
|
|
|
|
|
|
|
test_expect_success 'rebase moves back to skip-reference' '
|
|
|
|
test refs/heads/skip-reference = $(git symbolic-ref HEAD) &&
|
|
|
|
git branch post-rebase &&
|
|
|
|
git reset --hard pre-rebase &&
|
2020-11-19 02:44:25 +03:00
|
|
|
test_must_fail git rebase main &&
|
2007-11-12 16:11:46 +03:00
|
|
|
echo "hello" > hello &&
|
|
|
|
git add hello &&
|
|
|
|
git rebase --continue &&
|
|
|
|
test refs/heads/skip-reference = $(git symbolic-ref HEAD) &&
|
|
|
|
git reset --hard post-rebase
|
|
|
|
'
|
|
|
|
|
2006-06-25 05:29:49 +04:00
|
|
|
test_expect_success 'checkout skip-merge' 'git checkout -f skip-merge'
|
|
|
|
|
2008-07-12 19:47:52 +04:00
|
|
|
test_expect_success 'rebase with --merge' '
|
2020-11-19 02:44:25 +03:00
|
|
|
test_must_fail git rebase --merge main
|
2008-07-12 19:47:52 +04:00
|
|
|
'
|
2006-06-25 05:29:49 +04:00
|
|
|
|
|
|
|
test_expect_success 'rebase --skip with --merge' '
|
|
|
|
git rebase --skip
|
2013-05-28 16:54:29 +04:00
|
|
|
'
|
2006-06-25 05:29:49 +04:00
|
|
|
|
2013-05-28 16:54:29 +04:00
|
|
|
test_expect_success 'merge and reference trees equal' '
|
2015-12-22 18:27:46 +03:00
|
|
|
test -z "$(git diff-tree skip-merge skip-reference)"
|
2013-05-28 16:54:29 +04:00
|
|
|
'
|
2006-06-25 05:29:49 +04:00
|
|
|
|
2007-11-12 16:11:46 +03:00
|
|
|
test_expect_success 'moved back to branch correctly' '
|
|
|
|
test refs/heads/skip-merge = $(git symbolic-ref HEAD)
|
|
|
|
'
|
|
|
|
|
2006-06-25 05:29:49 +04:00
|
|
|
test_debug 'gitk --all & sleep 1'
|
|
|
|
|
2021-08-12 16:42:09 +03:00
|
|
|
test_expect_success 'skipping final pick removes .git/MERGE_MSG' '
|
|
|
|
test_must_fail git rebase --onto hello reverted-goodbye^ \
|
|
|
|
reverted-goodbye &&
|
|
|
|
git rebase --skip &&
|
|
|
|
test_path_is_missing .git/MERGE_MSG
|
|
|
|
'
|
|
|
|
|
2019-12-06 19:06:09 +03:00
|
|
|
test_expect_success 'correct advice upon picking empty commit' '
|
|
|
|
test_when_finished "git rebase --abort" &&
|
|
|
|
test_must_fail git rebase -i --onto goodbye \
|
|
|
|
amended-goodbye^ amended-goodbye 2>err &&
|
|
|
|
test_i18ngrep "previous cherry-pick is now empty" err &&
|
2019-12-06 19:06:12 +03:00
|
|
|
test_i18ngrep "git rebase --skip" err &&
|
2019-12-06 19:06:09 +03:00
|
|
|
test_must_fail git commit &&
|
2019-12-06 19:06:12 +03:00
|
|
|
test_i18ngrep "git rebase --skip" err
|
2019-12-06 19:06:09 +03:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'correct authorship when committing empty pick' '
|
|
|
|
test_when_finished "git rebase --abort" &&
|
|
|
|
test_must_fail git rebase -i --onto goodbye \
|
|
|
|
amended-goodbye^ amended-goodbye &&
|
|
|
|
git commit --allow-empty &&
|
|
|
|
git log --pretty=format:"%an <%ae>%n%ad%B" -1 amended-goodbye >expect &&
|
|
|
|
git log --pretty=format:"%an <%ae>%n%ad%B" -1 HEAD >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'correct advice upon rewording empty commit' '
|
|
|
|
test_when_finished "git rebase --abort" &&
|
|
|
|
(
|
|
|
|
set_fake_editor &&
|
|
|
|
test_must_fail env FAKE_LINES="reword 1" git rebase -i \
|
|
|
|
--onto goodbye amended-goodbye^ amended-goodbye 2>err
|
|
|
|
) &&
|
|
|
|
test_i18ngrep "previous cherry-pick is now empty" err &&
|
2019-12-06 19:06:12 +03:00
|
|
|
test_i18ngrep "git rebase --skip" err &&
|
2019-12-06 19:06:09 +03:00
|
|
|
test_must_fail git commit &&
|
2019-12-06 19:06:12 +03:00
|
|
|
test_i18ngrep "git rebase --skip" err
|
2019-12-06 19:06:09 +03:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'correct advice upon editing empty commit' '
|
|
|
|
test_when_finished "git rebase --abort" &&
|
|
|
|
(
|
|
|
|
set_fake_editor &&
|
|
|
|
test_must_fail env FAKE_LINES="edit 1" git rebase -i \
|
|
|
|
--onto goodbye amended-goodbye^ amended-goodbye 2>err
|
|
|
|
) &&
|
|
|
|
test_i18ngrep "previous cherry-pick is now empty" err &&
|
2019-12-06 19:06:12 +03:00
|
|
|
test_i18ngrep "git rebase --skip" err &&
|
2019-12-06 19:06:09 +03:00
|
|
|
test_must_fail git commit &&
|
2019-12-06 19:06:12 +03:00
|
|
|
test_i18ngrep "git rebase --skip" err
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'correct advice upon cherry-picking an empty commit during a rebase' '
|
|
|
|
test_when_finished "git rebase --abort" &&
|
|
|
|
(
|
|
|
|
set_fake_editor &&
|
|
|
|
test_must_fail env FAKE_LINES="1 exec_git_cherry-pick_amended-goodbye" \
|
|
|
|
git rebase -i goodbye^ goodbye 2>err
|
|
|
|
) &&
|
|
|
|
test_i18ngrep "previous cherry-pick is now empty" err &&
|
|
|
|
test_i18ngrep "git cherry-pick --skip" err &&
|
|
|
|
test_must_fail git commit 2>err &&
|
|
|
|
test_i18ngrep "git cherry-pick --skip" err
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'correct advice upon multi cherry-pick picking an empty commit during a rebase' '
|
|
|
|
test_when_finished "git rebase --abort" &&
|
|
|
|
(
|
|
|
|
set_fake_editor &&
|
|
|
|
test_must_fail env FAKE_LINES="1 exec_git_cherry-pick_goodbye_amended-goodbye" \
|
|
|
|
git rebase -i goodbye^^ goodbye 2>err
|
|
|
|
) &&
|
|
|
|
test_i18ngrep "previous cherry-pick is now empty" err &&
|
|
|
|
test_i18ngrep "git cherry-pick --skip" err &&
|
|
|
|
test_must_fail git commit 2>err &&
|
2019-12-06 19:06:09 +03:00
|
|
|
test_i18ngrep "git cherry-pick --skip" err
|
|
|
|
'
|
|
|
|
|
2019-11-22 22:43:03 +03:00
|
|
|
test_expect_success 'fixup that empties commit fails' '
|
|
|
|
test_when_finished "git rebase --abort" &&
|
|
|
|
(
|
|
|
|
set_fake_editor &&
|
|
|
|
test_must_fail env FAKE_LINES="1 fixup 2" git rebase -i \
|
|
|
|
goodbye^ reverted-goodbye
|
|
|
|
)
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'squash that empties commit fails' '
|
|
|
|
test_when_finished "git rebase --abort" &&
|
|
|
|
(
|
|
|
|
set_fake_editor &&
|
|
|
|
test_must_fail env FAKE_LINES="1 squash 2" git rebase -i \
|
|
|
|
goodbye^ reverted-goodbye
|
|
|
|
)
|
|
|
|
'
|
|
|
|
|
|
|
|
# Must be the last test in this file
|
|
|
|
test_expect_success '$EDITOR and friends are unchanged' '
|
|
|
|
test_editor_unchanged
|
|
|
|
'
|
|
|
|
|
2006-06-25 05:29:49 +04:00
|
|
|
test_done
|