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.
90 lines
1.8 KiB
90 lines
1.8 KiB
#!/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 |
|
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
|
|
|