#!/usr/bin/env bash # 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" testgitmarks_args=( "--"{import,export}"-marks=$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 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_args[@]}" $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_args[@]}" --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 echo "ok $ref" done echo ;; '') exit ;; esac done