Commit Diff


commit - 52be27fcce9624a6bcdd4c32becf42c291e8b348
commit + dc5351b4fbeb55371ddf6f812d68c69bc0d478a7
blob - 2eae149a2cdf63ee47f1c8dfb1415ad4b7706ff8
blob + e2cf6617507de8f326679a36e7832faa921be073
--- got/got.c
+++ 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);
blob - 21fbf1fbeaa86fd116323404f9dff1dea6f14601
blob + e6db280d0aaf7bf2b5185205225b3568f9ca36e3
--- regress/cmdline/Makefile
+++ 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
 
blob - /dev/null
blob + e624d53380913d538422ddc4c6503cb48bdf3b02 (mode 755)
--- /dev/null
+++ 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