mirror of
https://github.com/git/git
synced 2024-09-12 21:04:12 +00:00
6ea3b67b4e
Since 7b3b7e3 (am --abort: keep unrelated commits since the last failure and warn, 2010-12-21), git-am would refuse to rewind HEAD if commits were made since the last git-am failure. This check was implemented in safe_to_abort(), which checked to see if HEAD's hash matched the abort-safety file. However, this check was skipped if the abort-safety file was empty, which can happen if git-am failed while on an unborn branch. As such, if any commits were made since then, they would be discarded. Fix this by carrying on the abort safety check even if the abort-safety file is empty. Signed-off-by: Paul Tan <pyokagan@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
157 lines
4.1 KiB
Bash
Executable file
157 lines
4.1 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
test_description='am --abort'
|
|
|
|
. ./test-lib.sh
|
|
|
|
test_expect_success setup '
|
|
for i in a b c d e f g
|
|
do
|
|
echo $i
|
|
done >file-1 &&
|
|
cp file-1 file-2 &&
|
|
test_tick &&
|
|
git add file-1 file-2 &&
|
|
git commit -m initial &&
|
|
git tag initial &&
|
|
git format-patch --stdout --root initial >initial.patch &&
|
|
for i in 2 3 4 5 6
|
|
do
|
|
echo $i >>file-1 &&
|
|
echo $i >otherfile-$i &&
|
|
git add otherfile-$i &&
|
|
test_tick &&
|
|
git commit -a -m $i || break
|
|
done &&
|
|
git format-patch --no-numbered initial &&
|
|
git checkout -b side initial &&
|
|
echo local change >file-2-expect
|
|
'
|
|
|
|
for with3 in '' ' -3'
|
|
do
|
|
test_expect_success "am$with3 stops at a patch that does not apply" '
|
|
|
|
git reset --hard initial &&
|
|
cp file-2-expect file-2 &&
|
|
|
|
test_must_fail git am$with3 000[1245]-*.patch &&
|
|
git log --pretty=tformat:%s >actual &&
|
|
for i in 3 2 initial
|
|
do
|
|
echo $i
|
|
done >expect &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success "am$with3 --skip continue after failed am$with3" '
|
|
test_must_fail git am$with3 --skip >output &&
|
|
test_i18ngrep "^Applying" output >output.applying &&
|
|
test_i18ngrep "^Applying: 6$" output.applying &&
|
|
test_i18ncmp file-2-expect file-2 &&
|
|
test ! -f .git/MERGE_RR
|
|
'
|
|
|
|
test_expect_success "am --abort goes back after failed am$with3" '
|
|
git am --abort &&
|
|
git rev-parse HEAD >actual &&
|
|
git rev-parse initial >expect &&
|
|
test_cmp expect actual &&
|
|
test_cmp file-2-expect file-2 &&
|
|
git diff-index --exit-code --cached HEAD &&
|
|
test ! -f .git/MERGE_RR
|
|
'
|
|
|
|
done
|
|
|
|
test_expect_success 'am -3 --skip removes otherfile-4' '
|
|
git reset --hard initial &&
|
|
test_must_fail git am -3 0003-*.patch &&
|
|
test 3 -eq $(git ls-files -u | wc -l) &&
|
|
test 4 = "$(cat otherfile-4)" &&
|
|
git am --skip &&
|
|
test_cmp_rev initial HEAD &&
|
|
test -z "$(git ls-files -u)" &&
|
|
test_path_is_missing otherfile-4
|
|
'
|
|
|
|
test_expect_success 'am -3 --abort removes otherfile-4' '
|
|
git reset --hard initial &&
|
|
test_must_fail git am -3 0003-*.patch &&
|
|
test 3 -eq $(git ls-files -u | wc -l) &&
|
|
test 4 = "$(cat otherfile-4)" &&
|
|
git am --abort &&
|
|
test_cmp_rev initial HEAD &&
|
|
test -z $(git ls-files -u) &&
|
|
test_path_is_missing otherfile-4
|
|
'
|
|
|
|
test_expect_success 'am --abort will keep the local commits intact' '
|
|
test_must_fail git am 0004-*.patch &&
|
|
test_commit unrelated &&
|
|
git rev-parse HEAD >expect &&
|
|
git am --abort &&
|
|
git rev-parse HEAD >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'am -3 stops on conflict on unborn branch' '
|
|
git checkout -f --orphan orphan &&
|
|
git reset &&
|
|
rm -f otherfile-4 &&
|
|
test_must_fail git am -3 0003-*.patch &&
|
|
test 2 -eq $(git ls-files -u | wc -l) &&
|
|
test 4 = "$(cat otherfile-4)"
|
|
'
|
|
|
|
test_expect_success 'am -3 --skip clears index on unborn branch' '
|
|
test_path_is_dir .git/rebase-apply &&
|
|
echo tmpfile >tmpfile &&
|
|
git add tmpfile &&
|
|
git am --skip &&
|
|
test -z "$(git ls-files)" &&
|
|
test_path_is_missing otherfile-4 &&
|
|
test_path_is_missing tmpfile
|
|
'
|
|
|
|
test_expect_success 'am -3 --abort removes otherfile-4 on unborn branch' '
|
|
git checkout -f --orphan orphan &&
|
|
git reset &&
|
|
rm -f otherfile-4 file-1 &&
|
|
test_must_fail git am -3 0003-*.patch &&
|
|
test 2 -eq $(git ls-files -u | wc -l) &&
|
|
test 4 = "$(cat otherfile-4)" &&
|
|
git am --abort &&
|
|
test -z "$(git ls-files -u)" &&
|
|
test_path_is_missing otherfile-4
|
|
'
|
|
|
|
test_expect_success 'am -3 --abort on unborn branch removes applied commits' '
|
|
git checkout -f --orphan orphan &&
|
|
git reset &&
|
|
rm -f otherfile-4 otherfile-2 file-1 file-2 &&
|
|
test_must_fail git am -3 initial.patch 0003-*.patch &&
|
|
test 3 -eq $(git ls-files -u | wc -l) &&
|
|
test 4 = "$(cat otherfile-4)" &&
|
|
git am --abort &&
|
|
test -z "$(git ls-files -u)" &&
|
|
test_path_is_missing otherfile-4 &&
|
|
test_path_is_missing file-1 &&
|
|
test_path_is_missing file-2 &&
|
|
test 0 -eq $(git log --oneline 2>/dev/null | wc -l) &&
|
|
test refs/heads/orphan = "$(git symbolic-ref HEAD)"
|
|
'
|
|
|
|
test_expect_success 'am --abort on unborn branch will keep local commits intact' '
|
|
git checkout -f --orphan orphan &&
|
|
git reset &&
|
|
test_must_fail git am 0004-*.patch &&
|
|
test_commit unrelated2 &&
|
|
git rev-parse HEAD >expect &&
|
|
git am --abort &&
|
|
git rev-parse HEAD >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_done
|