Commit 5bda3ef83752a447e1afc97850d2bd6bd250ca55

Stefan Sperling 2020-02-09T11:51:29

extend 'backout' tests; covers segfault found by semarie@ (fixed in 3c24af98)

diff --git a/regress/cmdline/backout.sh b/regress/cmdline/backout.sh
index 32c9222..9784f97 100755
--- a/regress/cmdline/backout.sh
+++ b/regress/cmdline/backout.sh
@@ -26,8 +26,11 @@ function test_backout_basic {
 		return 1
 	fi
 
+	echo "new" > $testroot/wt/new
+	(cd $testroot/wt && got add new > /dev/null)
 	echo "modified alpha" > $testroot/wt/alpha
-	(cd $testroot/wt && got commit -m "changing alpha" > /dev/null)
+	(cd $testroot/wt && got rm epsilon/zeta > /dev/null)
+	(cd $testroot/wt && got commit -m "bad changes" > /dev/null)
 
 	local bad_commit=`git_show_head $testroot/repo`
 
@@ -42,6 +45,8 @@ function test_backout_basic {
 	(cd $testroot/wt && got backout $bad_commit > $testroot/stdout)
 
 	echo "G  alpha" > $testroot/stdout.expected
+	echo "A  epsilon/zeta" >> $testroot/stdout.expected
+	echo "D  new" >> $testroot/stdout.expected
 	echo "Backed out commit $bad_commit" >> $testroot/stdout.expected
 	cmp -s $testroot/stdout.expected $testroot/stdout
 	ret="$?"
@@ -61,7 +66,21 @@ function test_backout_basic {
 		return 1
 	fi
 
+	if [ -e "$testroot/wt/new" ]; then
+		echo "file '$testroot/wt/new' still exists on disk" >&2
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	if [ ! -e "$testroot/wt/epsilon/zeta" ]; then
+		echo "file '$testroot/wt/epsilon/zeta' is missing on disk" >&2
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
 	echo 'M  alpha' > $testroot/stdout.expected
+	echo 'A  epsilon/zeta' >> $testroot/stdout.expected
+	echo 'D  new' >> $testroot/stdout.expected
 	(cd $testroot/wt && got status > $testroot/stdout)
 	cmp -s $testroot/stdout.expected $testroot/stdout
 	ret="$?"
@@ -71,4 +90,119 @@ function test_backout_basic {
 	test_done "$testroot" "$ret"
 }
 
+function test_backout_edits_for_file_since_deleted {
+	local testroot=`test_init backout_edits_for_file_since_deleted`
+
+	got checkout $testroot/repo $testroot/wt > /dev/null
+	ret="$?"
+	if [ "$ret" != "0" ]; then
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	echo "modified alpha" > $testroot/wt/alpha
+	(cd $testroot/wt && got commit -m "changing alpha" > /dev/null)
+
+	local bad_commit=`git_show_head $testroot/repo`
+
+
+	(cd $testroot/wt && got update > /dev/null)
+
+	(cd $testroot/wt && got rm alpha > /dev/null)
+	(cd $testroot/wt && got commit -m "removing alpha" > /dev/null)
+
+	(cd $testroot/wt && got update > /dev/null)
+
+	(cd $testroot/wt && got backout $bad_commit > $testroot/stdout)
+
+	echo "!  alpha" > $testroot/stdout.expected
+	echo "Backed out commit $bad_commit" >> $testroot/stdout.expected
+	cmp -s $testroot/stdout.expected $testroot/stdout
+	ret="$?"
+	if [ "$ret" != "0" ]; then
+		diff -u $testroot/stdout.expected $testroot/stdout
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	if [ -e "$testroot/wt/alpha" ]; then
+		echo "file '$testroot/wt/alpha' still exists on disk" >&2
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	echo -n '' > $testroot/stdout.expected
+	(cd $testroot/wt && got status > $testroot/stdout)
+	cmp -s $testroot/stdout.expected $testroot/stdout
+	ret="$?"
+	if [ "$ret" != "0" ]; then
+		diff -u $testroot/stdout.expected $testroot/stdout
+	fi
+	test_done "$testroot" "$ret"
+}
+
+function test_backout_next_commit {
+	local testroot=`test_init backout_next_commit`
+	local commit0=`git_show_head $testroot/repo`
+
+	got checkout $testroot/repo $testroot/wt > /dev/null
+	ret="$?"
+	if [ "$ret" != "0" ]; then
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	echo "new" > $testroot/wt/new
+	(cd $testroot/wt && got add new > /dev/null)
+	echo "modified alpha" > $testroot/wt/alpha
+	(cd $testroot/wt && got rm epsilon/zeta > /dev/null)
+	(cd $testroot/wt && got commit -m "bad changes" > /dev/null)
+
+	local bad_commit=`git_show_head $testroot/repo`
+
+	(cd $testroot/wt && got update -c $commit0 > /dev/null)
+
+	(cd $testroot/wt && got backout $bad_commit > $testroot/stdout)
+
+	echo "G  alpha" > $testroot/stdout.expected
+	echo "G  epsilon/zeta" >> $testroot/stdout.expected
+	echo "!  new" >> $testroot/stdout.expected
+	echo "Backed out commit $bad_commit" >> $testroot/stdout.expected
+	cmp -s $testroot/stdout.expected $testroot/stdout
+	ret="$?"
+	if [ "$ret" != "0" ]; then
+		diff -u $testroot/stdout.expected $testroot/stdout
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	if [ -e "$testroot/wt/new" ]; then
+		echo "file '$testroot/wt/new' still exists on disk" >&2
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	echo "zeta" > $testroot/content.expected
+	cat $testroot/wt/epsilon/zeta > $testroot/content
+	cmp -s $testroot/content.expected $testroot/content
+	ret="$?"
+	if [ "$ret" != "0" ]; then
+		diff -u $testroot/content.expected $testroot/content
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	echo -n '' > $testroot/stdout.expected
+	(cd $testroot/wt && got status > $testroot/stdout)
+	cmp -s $testroot/stdout.expected $testroot/stdout
+	ret="$?"
+	if [ "$ret" != "0" ]; then
+		diff -u $testroot/stdout.expected $testroot/stdout
+	fi
+	test_done "$testroot" "$ret"
+}
+
+
 run_test test_backout_basic
+run_test test_backout_edits_for_file_since_deleted
+run_test test_backout_next_commit