| #!/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 | |
| 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 | |
| echo "feature done" | |
| git fast-export "${testgitmarks_args[@]}" $refs | | |
| sed -e "s#refs/heads/#${prefix}/heads/#g" | |
| echo "done" | |
| ;; | |
| export) | |
| before=$(git for-each-ref --format='%(refname) %(objectname)') | |
| git fast-import "${testgitmarks_args[@]}" --quiet | |
| after=$(git for-each-ref --format='%(refname) %(objectname)') | |
| # figure out which refs were updated | |
| join -e 0 -o '0 1.2 2.2' -a 2 <(echo "$before") <(echo "$after") | | |
| while read ref a b | |
| do | |
| test $a == $b && continue | |
| echo "ok $ref" | |
| done | |
| echo | |
| ;; | |
| '') | |
| exit | |
| ;; | |
| esac | |
| done |