diff options
Diffstat (limited to 'git-remote-testgit.sh')
| -rwxr-xr-x | git-remote-testgit.sh | 121 | 
1 files changed, 121 insertions, 0 deletions
diff --git a/git-remote-testgit.sh b/git-remote-testgit.sh new file mode 100755 index 0000000000..2109070d00 --- /dev/null +++ b/git-remote-testgit.sh @@ -0,0 +1,121 @@ +#!/bin/sh +# Copyright (c) 2012 Felipe Contreras + +alias=$1 +url=$2 + +dir="$GIT_DIR/testgit/$alias" +prefix="refs/testgit/$alias" + +default_refspec="refs/heads/*:${prefix}/heads/*" + +refspec="${GIT_REMOTE_TESTGIT_REFSPEC-$default_refspec}" + +test -z "$refspec" && prefix="refs" + +export GIT_DIR="$url/.git" + +mkdir -p "$dir" + +if test -z "$GIT_REMOTE_TESTGIT_NO_MARKS" +then +	gitmarks="$dir/git.marks" +	testgitmarks="$dir/testgit.marks" +	test -e "$gitmarks" || >"$gitmarks" +	test -e "$testgitmarks" || >"$testgitmarks" +fi + +while read line +do +	case $line in +	capabilities) +		echo 'import' +		echo 'export' +		test -n "$refspec" && echo "refspec $refspec" +		if test -n "$gitmarks" +		then +			echo "*import-marks $gitmarks" +			echo "*export-marks $gitmarks" +		fi +		test -n "$GIT_REMOTE_TESTGIT_SIGNED_TAGS" && echo "signed-tags" +		echo +		;; +	list) +		git for-each-ref --format='? %(refname)' 'refs/heads/' +		head=$(git symbolic-ref HEAD) +		echo "@$head HEAD" +		echo +		;; +	import*) +		# read all import lines +		while true +		do +			ref="${line#* }" +			refs="$refs $ref" +			read line +			test "${line%% *}" != "import" && break +		done + +		if test -n "$gitmarks" +		then +			echo "feature import-marks=$gitmarks" +			echo "feature export-marks=$gitmarks" +		fi + +		if test -n "$GIT_REMOTE_TESTGIT_FAILURE" +		then +			echo "feature done" +			exit 1 +		fi + +		echo "feature done" +		git fast-export \ +			${testgitmarks:+"--import-marks=$testgitmarks"} \ +			${testgitmarks:+"--export-marks=$testgitmarks"} \ +			$refs | +		sed -e "s#refs/heads/#${prefix}/heads/#g" +		echo "done" +		;; +	export) +		if test -n "$GIT_REMOTE_TESTGIT_FAILURE" +		then +			# consume input so fast-export doesn't get SIGPIPE; +			# git would also notice that case, but we want +			# to make sure we are exercising the later +			# error checks +			while read line; do +				test "done" = "$line" && break +			done +			exit 1 +		fi + +		before=$(git for-each-ref --format=' %(refname) %(objectname) ') + +		git fast-import \ +			${testgitmarks:+"--import-marks=$testgitmarks"} \ +			${testgitmarks:+"--export-marks=$testgitmarks"} \ +			--quiet + +		# figure out which refs were updated +		git for-each-ref --format='%(refname) %(objectname)' | +		while read ref a +		do +			case "$before" in +			*" $ref $a "*) +				continue ;;	# unchanged +			esac +			if test -z "$GIT_REMOTE_TESTGIT_PUSH_ERROR" +			then +				echo "ok $ref" +			else +				echo "error $ref $GIT_REMOTE_TESTGIT_PUSH_ERROR" +			fi +		done + +		echo +		;; +	'') +		exit +		;; +	esac +done  | 
