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.
147 lines
2.9 KiB
147 lines
2.9 KiB
#!/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
|
|
|