Commit dc5351b4fbeb55371ddf6f812d68c69bc0d478a7

Stefan Sperling 2019-07-30T17:22:16

fix a bug in 'got branch' and add tests for this command

diff --git a/got/got.c b/got/got.c
index 2eae149..e2cf661 100644
--- a/got/got.c
+++ b/got/got.c
@@ -2861,6 +2861,8 @@ cmd_branch(int argc, char *argv[])
 			base_branch = worktree ?
 			    got_worktree_get_head_ref_name(worktree) :
 			    GOT_REF_HEAD;
+			if (strncmp(base_branch, "refs/heads/", 11) == 0)
+				base_branch += 11;
 		} else
 			base_branch = argv[1];
 		error = add_branch(repo, argv[0], base_branch);
diff --git a/regress/cmdline/Makefile b/regress/cmdline/Makefile
index 21fbf1f..e6db280 100644
--- a/regress/cmdline/Makefile
+++ b/regress/cmdline/Makefile
@@ -1,4 +1,4 @@
-REGRESS_TARGETS=checkout update status log add rm diff blame commit \
+REGRESS_TARGETS=checkout update status log add rm diff blame branch commit \
 	cherrypick backout rebase import histedit
 NOOBJ=Yes
 
@@ -26,6 +26,9 @@ diff:
 blame:
 	./blame.sh
 
+branch:
+	./branch.sh
+
 commit:
 	./commit.sh
 
diff --git a/regress/cmdline/branch.sh b/regress/cmdline/branch.sh
new file mode 100755
index 0000000..e624d53
--- /dev/null
+++ b/regress/cmdline/branch.sh
@@ -0,0 +1,255 @@
+#!/bin/sh
+#
+# Copyright (c) 2019 Stefan Sperling <stsp@openbsd.org>
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+. ./common.sh
+
+function test_branch_create {
+	local testroot=`test_init branch_create`
+
+	# Create a branch based on repository's HEAD reference
+	got branch -r $testroot/repo newbranch
+	ret="$?"
+	if [ "$ret" != "0" ]; then
+		echo "got branch command failed unexpectedly"
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	# Ensure that Git recognizes the branch Got has created
+	(cd $testroot/repo && git checkout -q newbranch)
+	ret="$?"
+	if [ "$ret" != "0" ]; then
+		echo "git checkout command failed unexpectedly"
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+	echo "modified delta on branch" > $testroot/repo/gamma/delta
+	git_commit $testroot/repo -m "committing to delta on newbranch"
+
+	got checkout -b newbranch $testroot/repo $testroot/wt >/dev/null
+	ret="$?"
+	if [ "$ret" != "0" ]; then
+		echo "got checkout command failed unexpectedly"
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	echo "modified delta on branch" > $testroot/content.expected
+	cat $testroot/wt/gamma/delta > $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
+
+	# Create a branch based on the work tree's branch
+	(cd $testroot/wt && got branch anotherbranch)
+	ret="$?"
+	if [ "$ret" != "0" ]; then
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	(cd $testroot/repo && git checkout -q anotherbranch)
+	ret="$?"
+	if [ "$ret" != "0" ]; then
+		echo "git checkout command failed unexpectedly"
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	# Create a branch based on another specific branch
+	(cd $testroot/wt && got branch yetanotherbranch master)
+	ret="$?"
+	if [ "$ret" != "0" ]; then
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	(cd $testroot/repo && git checkout -q yetanotherbranch)
+	ret="$?"
+	if [ "$ret" != "0" ]; then
+		echo "git checkout command failed unexpectedly"
+	fi
+	test_done "$testroot" "$ret"
+}
+
+function test_branch_list {
+	local testroot=`test_init branch_list`
+	local commit_id=`git_show_head $testroot/repo`
+
+	for b in branch1 branch2 branch3; do
+		got branch -r $testroot/repo $b
+		ret="$?"
+		if [ "$ret" != "0" ]; then
+			echo "got branch command failed unexpectedly"
+			test_done "$testroot" "$ret"
+			return 1
+		fi
+	done
+
+	got branch -l -r $testroot/repo > $testroot/stdout
+	echo "  branch1: $commit_id" > $testroot/stdout.expected
+	echo "  branch2: $commit_id" >> $testroot/stdout.expected
+	echo "  branch3: $commit_id" >> $testroot/stdout.expected
+	echo "  master: $commit_id" >> $testroot/stdout.expected
+	cmp -s $testroot/stdout $testroot/stdout.expected
+	ret="$?"
+	if [ "$ret" != "0" ]; then
+		diff -u $testroot/stdout.expected $testroot/stdout
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	got checkout $testroot/repo $testroot/wt >/dev/null
+	ret="$?"
+	if [ "$ret" != "0" ]; then
+		echo "got checkout command failed unexpectedly"
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	(cd $testroot/wt && got branch -l > $testroot/stdout)
+	echo "  branch1: $commit_id" > $testroot/stdout.expected
+	echo "  branch2: $commit_id" >> $testroot/stdout.expected
+	echo "  branch3: $commit_id" >> $testroot/stdout.expected
+	echo "* master: $commit_id" >> $testroot/stdout.expected
+	cmp -s $testroot/stdout $testroot/stdout.expected
+	ret="$?"
+	if [ "$ret" != "0" ]; then
+		diff -u $testroot/stdout.expected $testroot/stdout
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	echo "modified delta" > $testroot/repo/gamma/delta
+	git_commit $testroot/repo -m "committing to delta"
+	local commit_id2=`git_show_head $testroot/repo`
+
+	(cd $testroot/wt && got branch -l > $testroot/stdout)
+	echo "  branch1: $commit_id" > $testroot/stdout.expected
+	echo "  branch2: $commit_id" >> $testroot/stdout.expected
+	echo "  branch3: $commit_id" >> $testroot/stdout.expected
+	echo "~ master: $commit_id2" >> $testroot/stdout.expected
+	cmp -s $testroot/stdout $testroot/stdout.expected
+	ret="$?"
+	if [ "$ret" != "0" ]; then
+		diff -u $testroot/stdout.expected $testroot/stdout
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	(cd $testroot/wt && got update > /dev/null)
+	ret="$?"
+	if [ "$ret" != "0" ]; then
+		echo "got update command failed unexpectedly"
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	(cd $testroot/wt && got branch -l > $testroot/stdout)
+	echo "  branch1: $commit_id" > $testroot/stdout.expected
+	echo "  branch2: $commit_id" >> $testroot/stdout.expected
+	echo "  branch3: $commit_id" >> $testroot/stdout.expected
+	echo "* master: $commit_id2" >> $testroot/stdout.expected
+	cmp -s $testroot/stdout $testroot/stdout.expected
+	ret="$?"
+	if [ "$ret" != "0" ]; then
+		diff -u $testroot/stdout.expected $testroot/stdout
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	(cd $testroot/wt && got update -b branch1 > /dev/null)
+	ret="$?"
+	if [ "$ret" != "0" ]; then
+		echo "got update command failed unexpectedly"
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	(cd $testroot/wt && got branch -l > $testroot/stdout)
+	echo "* branch1: $commit_id" > $testroot/stdout.expected
+	echo "  branch2: $commit_id" >> $testroot/stdout.expected
+	echo "  branch3: $commit_id" >> $testroot/stdout.expected
+	echo "  master: $commit_id2" >> $testroot/stdout.expected
+	cmp -s $testroot/stdout $testroot/stdout.expected
+	ret="$?"
+	if [ "$ret" != "0" ]; then
+		diff -u $testroot/stdout.expected $testroot/stdout
+	fi
+	test_done "$testroot" "$ret"
+}
+
+function test_branch_delete {
+	local testroot=`test_init branch_delete`
+	local commit_id=`git_show_head $testroot/repo`
+
+	for b in branch1 branch2 branch3; do
+		got branch -r $testroot/repo $b
+		ret="$?"
+		if [ "$ret" != "0" ]; then
+			echo "got branch command failed unexpectedly"
+			test_done "$testroot" "$ret"
+			return 1
+		fi
+	done
+
+	got branch -d branch2 -r $testroot/repo > $testroot/stdout
+	ret="$?"
+	if [ "$ret" != "0" ]; then
+		echo "got update command failed unexpectedly"
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	got branch -l -r $testroot/repo > $testroot/stdout
+	echo "  branch1: $commit_id" > $testroot/stdout.expected
+	echo "  branch3: $commit_id" >> $testroot/stdout.expected
+	echo "  master: $commit_id" >> $testroot/stdout.expected
+	cmp -s $testroot/stdout $testroot/stdout.expected
+	ret="$?"
+	if [ "$ret" != "0" ]; then
+		diff -u $testroot/stdout.expected $testroot/stdout
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	got branch -d bogus_branch_name -r $testroot/repo \
+		> $testroot/stdout 2> $testroot/stderr
+	ret="$?"
+	if [ "$ret" == "0" ]; then
+		echo "got update succeeded unexpectedly"
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	echo "got: reference refs/heads/bogus_branch_name not found" \
+		> $testroot/stderr.expected
+	cmp -s $testroot/stderr $testroot/stderr.expected
+	ret="$?"
+	if [ "$ret" != "0" ]; then
+		diff -u $testroot/stderr.expected $testroot/stderr
+	fi
+	test_done "$testroot" "$ret"
+}
+
+
+run_test test_branch_create
+run_test test_branch_list
+run_test test_branch_delete