am --abort: keep unrelated commits since the last failure and warn

After making commits (either by pulling or doing their own work) after a
failed "am", the user will be reminded by next "am" invocation that there
was a failed "am" that the user needs to decide to resolve or to get rid
of the old "am" attempt.  The "am --abort" option was meant to help the
latter.  However, it rewinded the HEAD back to the beginning of the failed
"am" attempt, discarding commits made (perhaps by mistake) since.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Junio C Hamano 2010-12-21 10:35:53 -08:00
Родитель 05bb5a2584
Коммит 7b3b7e3758
2 изменённых файлов: 34 добавлений и 2 удалений

Просмотреть файл

@ -68,9 +68,31 @@ sq () {
stop_here () {
echo "$1" >"$dotest/next"
git rev-parse --verify -q HEAD >"$dotest/abort-safety"
exit 1
}
safe_to_abort () {
if test -f "$dotest/dirtyindex"
then
return 1
fi
if ! test -s "$dotest/abort-safety"
then
return 0
fi
abort_safety=$(cat "$dotest/abort-safety")
if test "z$(git rev-parse --verify -q HEAD)" = "z$abort_safety"
then
return 0
fi
echo >&2 "You seem to have moved HEAD since the last 'am' failure."
echo >&2 "Not rewinding to ORIG_HEAD"
return 1
}
stop_here_user_resolve () {
if [ -n "$resolvemsg" ]; then
printf '%s\n' "$resolvemsg"
@ -419,10 +441,11 @@ then
exec git rebase --abort
fi
git rerere clear
test -f "$dotest/dirtyindex" || {
if safe_to_abort
then
git read-tree --reset -u HEAD ORIG_HEAD
git reset ORIG_HEAD
}
fi
rm -fr "$dotest"
exit ;;
esac

Просмотреть файл

@ -62,4 +62,13 @@ do
done
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_done