#!/bin/sh # Copyright (c) 2012 Felipe Contreras # The first argument can be a url when the fetch/push command was a url # instead of a configured remote. In this case, use a generic alias. if test "$1" = "testgit::$2"; then alias=_ else alias=$1 fi 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" GIT_DIR="$url/.git" export GIT_DIR force= 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" test -n "$GIT_REMOTE_TESTGIT_NO_PRIVATE_UPDATE" && echo "no-private-update" echo 'option' 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 \ ${force:+--force} \ ${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 ;; option\ *) read cmd opt val <<-EOF $line EOF case $opt in force) test $val = "true" && force="true" || force= echo "ok" ;; *) echo "unsupported" ;; esac ;; '') exit ;; esac done