|  | #!/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 |