You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
2.4 KiB
121 lines
2.4 KiB
#!/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
|
|
|