about summary refs log tree commit diff
path: root/third_party/git/t/t3419-rebase-patch-id.sh
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/git/t/t3419-rebase-patch-id.sh')
-rwxr-xr-xthird_party/git/t/t3419-rebase-patch-id.sh100
1 files changed, 100 insertions, 0 deletions
diff --git a/third_party/git/t/t3419-rebase-patch-id.sh b/third_party/git/t/t3419-rebase-patch-id.sh
new file mode 100755
index 000000000000..49f548cdb93d
--- /dev/null
+++ b/third_party/git/t/t3419-rebase-patch-id.sh
@@ -0,0 +1,100 @@
+#!/bin/sh
+
+test_description='git rebase - test patch id computation'
+
+. ./test-lib.sh
+
+count () {
+	i=0
+	while test $i -lt $1
+	do
+		echo "$i"
+		i=$(($i+1))
+	done
+}
+
+scramble () {
+	i=0
+	while read x
+	do
+		if test $i -ne 0
+		then
+			echo "$x"
+		fi
+		i=$((($i+1) % 10))
+	done <"$1" >"$1.new"
+	mv -f "$1.new" "$1"
+}
+
+run () {
+	echo \$ "$@"
+	/usr/bin/time "$@" >/dev/null
+}
+
+test_expect_success 'setup' '
+	git commit --allow-empty -m initial &&
+	git tag root
+'
+
+do_tests () {
+	nlines=$1 pr=${2-}
+
+	test_expect_success $pr "setup: $nlines lines" "
+		rm -f .gitattributes &&
+		git checkout -q -f master &&
+		git reset --hard root &&
+		count $nlines >file &&
+		git add file &&
+		git commit -q -m initial &&
+		git branch -f other &&
+
+		scramble file &&
+		git add file &&
+		git commit -q -m 'change big file' &&
+
+		git checkout -q other &&
+		: >newfile &&
+		git add newfile &&
+		git commit -q -m 'add small file' &&
+
+		git cherry-pick master >/dev/null 2>&1
+	"
+
+	test_debug "
+		run git diff master^\!
+	"
+
+	test_expect_success $pr 'setup attributes' "
+		echo 'file binary' >.gitattributes
+	"
+
+	test_debug "
+		run git format-patch --stdout master &&
+		run git format-patch --stdout --ignore-if-in-upstream master
+	"
+
+	test_expect_success $pr 'detect upstream patch' '
+		git checkout -q master &&
+		scramble file &&
+		git add file &&
+		git commit -q -m "change big file again" &&
+		git checkout -q other^{} &&
+		git rebase master &&
+		test_must_fail test -n "$(git rev-list master...HEAD~)"
+	'
+
+	test_expect_success $pr 'do not drop patch' '
+		git branch -f squashed master &&
+		git checkout -q -f squashed &&
+		git reset -q --soft HEAD~2 &&
+		git commit -q -m squashed &&
+		git checkout -q other^{} &&
+		test_must_fail git rebase squashed &&
+		rm -rf .git/rebase-apply
+	'
+}
+
+do_tests 500
+do_tests 50000 EXPENSIVE
+
+test_done