Commit Diff


commit - e28ceabf9e2d8ad71b5cec0f4cba20ec0a3bd06d
commit + a9c0a12c5e9658f3f46a39a74dfc22a8ca23b16e
blob - 00f69c40c6fd31670fde808184134e4ac98ce8e1
blob + 0167d899f41c288d28cb4fec97714f37f9b48bc9
--- regress/gotd/Makefile
+++ regress/gotd/Makefile
@@ -4,8 +4,8 @@ REGRESS_TARGETS=test_repo_read test_repo_read_group \
 	test_repo_read_denied_user test_repo_read_denied_group \
 	test_repo_read_bad_user test_repo_read_bad_group \
 	test_repo_write test_repo_write_empty test_request_bad \
-	test_repo_write_protected test_email_notification \
-	test_http_notification
+	test_repo_write_protected test_repo_write_readonly \
+	test_email_notification test_http_notification
 NOOBJ=Yes
 CLEANFILES=gotd.conf
 
@@ -247,6 +247,12 @@ test_repo_write_protected: prepare_test_repo start_got
 	@$(GOTD_STOP_CMD) 2>/dev/null
 	@su -m ${GOTD_USER} -c 'env $(GOTD_TEST_ENV) sh ./check_test_repo.sh'
 	
+test_repo_write_readonly: prepare_test_repo_empty start_gotd_ro
+	@-$(GOTD_TRAP); su ${GOTD_TEST_USER} -c \
+		'env $(GOTD_TEST_ENV) sh ./repo_write_readonly.sh'
+	@$(GOTD_STOP_CMD) 2>/dev/null
+	@su -m ${GOTD_USER} -c 'env $(GOTD_TEST_ENV) sh ./check_test_repo.sh'
+
 test_request_bad: prepare_test_repo_empty start_gotd_ro
 	@-$(GOTD_TRAP); su -m ${GOTD_TEST_USER} -c \
 		'env $(GOTD_TEST_ENV) sh ./request_bad.sh'
blob - /dev/null
blob + 9bfba2cfd281497c7e9b811178f4b534d191cc7e (mode 644)
--- /dev/null
+++ regress/gotd/repo_write_readonly.sh
@@ -0,0 +1,87 @@
+#!/bin/sh
+#
+# Copyright (c) 2024 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.
+
+. ../cmdline/common.sh
+. ./common.sh
+
+test_send_empty_readonly() {
+	local testroot=`test_init send_empty`
+	local commit_id=`git_show_head $testroot/repo`
+
+	(cd ${GOTD_TEST_REPO} && find . > $testroot/repo-list.before)
+
+	# The gotd-controlled test repository starts out empty.
+	got ref -l -r ${GOTD_TEST_REPO} > $testroot/ref-list.before
+	echo "HEAD: refs/heads/main" > $testroot/ref-list.expected
+	cmp -s $testroot/ref-list.expected $testroot/ref-list.before
+	ret=$?
+	if [ $ret -ne 0 ]; then
+		diff -u $testroot/ref-list.expected $testroot/ref-list.before
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	got checkout -q $testroot/repo $testroot/wt >/dev/null
+	ret=$?
+	if [ $ret -ne 0 ]; then
+		echo "got checkout failed unexpectedly" >&2
+		test_done "$testroot" 1
+		return 1
+	fi
+
+	# send contents of $testroot/repo to ${GOTD_TEST_REPO}
+	cat >> $testroot/wt/.got/got.conf <<EOF
+remote "gotd" {
+	server ${GOTD_DEVUSER}@127.0.0.1
+	repository "test-repo"
+	protocol ssh
+}
+EOF
+	(cd $testroot/wt && got send -q -a gotd 2> $testroot/stderr)
+	ret=$?
+	if [ $ret -eq 0 ]; then
+		echo "got send succeeded unexpectedly" >&2
+		test_done "$testroot" 1
+		return 1
+	fi
+
+	echo "got-send-pack: test-repo: Permission denied" \
+		> $testroot/stderr.expected
+	grep '^got-send-pack:' $testroot/stderr > $testroot/stderr.filtered
+	cmp -s $testroot/stderr.expected $testroot/stderr.filtered
+	ret=$?
+	if [ $ret -ne 0 ]; then
+		diff -u $testroot/stderr.expected $testroot/stderr.filtered
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	# Server should not have created a new reference.
+	got ref -l -r ${GOTD_TEST_REPO} > $testroot/ref-list.after
+	echo "HEAD: refs/heads/main" > $testroot/ref-list.expected
+	cmp -s $testroot/ref-list.expected $testroot/ref-list.after
+	ret=$?
+	if [ $ret -ne 0 ]; then
+		diff -u $testroot/ref-list.expected $testroot/ref-list.after
+		test_done "$testroot" "$ret"
+		return 1
+	fi
+
+	test_done "$testroot" "$ret"
+}
+
+test_parseargs "$@"
+run_test test_send_empty_readonly