mirror of
https://github.com/git-for-windows/git.git
synced 2026-04-20 17:05:12 -05:00
Add a new --trailer=<trailer> option to git rebase to append trailer lines to each rewritten commit message (merge backend only). Because the apply backend does not provide a commit-message filter, reject --trailer when --apply is in effect and require the merge backend instead. This option implies --force-rebase so that fast-forwarded commits are also rewritten. Validate trailer arguments early to avoid starting an interactive rebase with invalid input. Add integration tests covering error paths and trailer insertion across non-interactive and interactive rebases. Signed-off-by: Li Chen <me@linux.beauty> Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk> Signed-off-by: Junio C Hamano <gitster@pobox.com>
148 lines
3.8 KiB
Bash
Executable File
148 lines
3.8 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
|
|
test_description='git rebase --trailer integration tests
|
|
We verify that --trailer works with the merge backend,
|
|
and that it is rejected early when the apply backend is requested.'
|
|
|
|
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
|
|
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
|
|
|
|
. ./test-lib.sh
|
|
. "$TEST_DIRECTORY"/lib-rebase.sh # test_commit_message, helpers
|
|
|
|
REVIEWED_BY_TRAILER="Reviewed-by: Dev <dev@example.com>"
|
|
SP=" "
|
|
|
|
test_expect_success 'setup repo with a small history' '
|
|
git commit --allow-empty -m "Initial empty commit" &&
|
|
test_commit first file a &&
|
|
test_commit second file &&
|
|
git checkout -b conflict-branch first &&
|
|
test_commit file-2 file-2 &&
|
|
test_commit conflict file &&
|
|
test_commit third file &&
|
|
git checkout main
|
|
'
|
|
|
|
test_expect_success 'apply backend is rejected with --trailer' '
|
|
git checkout -B apply-backend third &&
|
|
test_expect_code 128 \
|
|
git rebase --apply --trailer "$REVIEWED_BY_TRAILER" HEAD^ 2>err &&
|
|
test_grep "fatal: --trailer requires the merge backend" err
|
|
'
|
|
|
|
test_expect_success 'reject empty --trailer argument' '
|
|
git checkout -B empty-trailer third &&
|
|
test_expect_code 128 git rebase --trailer "" HEAD^ 2>err &&
|
|
test_grep "empty --trailer" err
|
|
'
|
|
|
|
test_expect_success 'reject trailer with missing key before separator' '
|
|
git checkout -B missing-key third &&
|
|
test_expect_code 128 git rebase --trailer ": no-key" HEAD^ 2>err &&
|
|
test_grep "missing key before separator" err
|
|
'
|
|
|
|
test_expect_success 'allow trailer with missing value after separator' '
|
|
git checkout -B missing-value third &&
|
|
git rebase --trailer "Acked-by:" HEAD^ &&
|
|
test_commit_message HEAD <<-EOF
|
|
third
|
|
|
|
Acked-by:${SP}
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'CLI trailer duplicates allowed; replace policy keeps last' '
|
|
git checkout -B replace-policy third &&
|
|
git -c trailer.Bug.ifexists=replace -c trailer.Bug.ifmissing=add \
|
|
rebase --trailer "Bug: 123" --trailer "Bug: 456" HEAD^ &&
|
|
test_commit_message HEAD <<-EOF
|
|
third
|
|
|
|
Bug: 456
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'multiple Signed-off-by trailers all preserved' '
|
|
git checkout -B multiple-signoff third &&
|
|
git rebase --trailer "Signed-off-by: Dev A <a@example.com>" \
|
|
--trailer "Signed-off-by: Dev B <b@example.com>" HEAD^ &&
|
|
test_commit_message HEAD <<-EOF
|
|
third
|
|
|
|
Signed-off-by: Dev A <a@example.com>
|
|
Signed-off-by: Dev B <b@example.com>
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'rebase --trailer adds trailer after conflicts' '
|
|
git checkout -B trailer-conflict third &&
|
|
test_commit fourth file &&
|
|
test_must_fail git rebase --trailer "$REVIEWED_BY_TRAILER" second &&
|
|
git checkout --theirs file &&
|
|
git add file &&
|
|
git rebase --continue &&
|
|
test_commit_message HEAD <<-EOF &&
|
|
fourth
|
|
|
|
$REVIEWED_BY_TRAILER
|
|
EOF
|
|
test_commit_message HEAD^ <<-EOF
|
|
third
|
|
|
|
$REVIEWED_BY_TRAILER
|
|
EOF
|
|
'
|
|
|
|
test_expect_success '--trailer handles fixup commands in todo list' '
|
|
git checkout -B fixup-trailer third &&
|
|
test_commit fixup-base base &&
|
|
test_commit fixup-second second &&
|
|
cat >todo <<-\EOF &&
|
|
pick fixup-base fixup-base
|
|
fixup fixup-second fixup-second
|
|
EOF
|
|
(
|
|
set_replace_editor todo &&
|
|
git rebase -i --trailer "$REVIEWED_BY_TRAILER" HEAD~2
|
|
) &&
|
|
test_commit_message HEAD <<-EOF &&
|
|
fixup-base
|
|
|
|
$REVIEWED_BY_TRAILER
|
|
EOF
|
|
git reset --hard fixup-second &&
|
|
cat >todo <<-\EOF &&
|
|
pick fixup-base fixup-base
|
|
fixup -C fixup-second fixup-second
|
|
EOF
|
|
(
|
|
set_replace_editor todo &&
|
|
git rebase -i --trailer "$REVIEWED_BY_TRAILER" HEAD~2
|
|
) &&
|
|
test_commit_message HEAD <<-EOF
|
|
fixup-second
|
|
|
|
$REVIEWED_BY_TRAILER
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'rebase --root honors trailer.<name>.key' '
|
|
git checkout -B root-trailer first &&
|
|
git -c trailer.review.key=Reviewed-by rebase --root \
|
|
--trailer=review="Dev <dev@example.com>" &&
|
|
test_commit_message HEAD <<-EOF &&
|
|
first
|
|
|
|
Reviewed-by: Dev <dev@example.com>
|
|
EOF
|
|
test_commit_message HEAD^ <<-EOF
|
|
Initial empty commit
|
|
|
|
Reviewed-by: Dev <dev@example.com>
|
|
EOF
|
|
'
|
|
test_done
|