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.
142 lines
2.5 KiB
142 lines
2.5 KiB
#!/bin/sh |
|
# |
|
|
|
usage () { |
|
echo >&2 "usage: $0 [--heads] [--tags] [-u|--upload-pack <upload-pack>]" |
|
echo >&2 " <repository> <refs>..." |
|
exit 1; |
|
} |
|
|
|
die () { |
|
echo >&2 "$*" |
|
exit 1 |
|
} |
|
|
|
exec= |
|
while test $# != 0 |
|
do |
|
case "$1" in |
|
-h|--h|--he|--hea|--head|--heads) |
|
heads=heads; shift ;; |
|
-t|--t|--ta|--tag|--tags) |
|
tags=tags; shift ;; |
|
-u|--u|--up|--upl|--uploa|--upload|--upload-|--upload-p|--upload-pa|\ |
|
--upload-pac|--upload-pack) |
|
shift |
|
exec="--upload-pack=$1" |
|
shift;; |
|
-u=*|--u=*|--up=*|--upl=*|--uplo=*|--uploa=*|--upload=*|\ |
|
--upload-=*|--upload-p=*|--upload-pa=*|--upload-pac=*|--upload-pack=*) |
|
exec=--upload-pack=$(expr "z$1" : 'z-[^=]*=\(.*\)') |
|
shift;; |
|
--) |
|
shift; break ;; |
|
-*) |
|
usage ;; |
|
*) |
|
break ;; |
|
esac |
|
done |
|
|
|
case "$#" in 0) usage ;; esac |
|
|
|
case ",$heads,$tags," in |
|
,,,) heads=heads tags=tags other=other ;; |
|
esac |
|
|
|
. git-parse-remote |
|
peek_repo="$(get_remote_url "$@")" |
|
shift |
|
|
|
tmp=.ls-remote-$$ |
|
trap "rm -fr $tmp-*" 0 1 2 3 15 |
|
tmpdir=$tmp-d |
|
|
|
case "$peek_repo" in |
|
http://* | https://* | ftp://* ) |
|
if [ -n "$GIT_SSL_NO_VERIFY" -o \ |
|
"`git config --bool http.sslVerify`" = false ]; then |
|
curl_extra_args="-k" |
|
fi |
|
if [ -n "$GIT_CURL_FTP_NO_EPSV" -o \ |
|
"`git config --bool http.noEPSV`" = true ]; then |
|
curl_extra_args="${curl_extra_args} --disable-epsv" |
|
fi |
|
curl -nsf $curl_extra_args --header "Pragma: no-cache" "$peek_repo/info/refs" || |
|
echo "failed slurping" |
|
;; |
|
|
|
rsync://* ) |
|
mkdir $tmpdir && |
|
rsync -rlq "$peek_repo/HEAD" $tmpdir && |
|
rsync -rq "$peek_repo/refs" $tmpdir || { |
|
echo "failed slurping" |
|
exit |
|
} |
|
head=$(cat "$tmpdir/HEAD") && |
|
case "$head" in |
|
ref:' '*) |
|
head=$(expr "z$head" : 'zref: \(.*\)') && |
|
head=$(cat "$tmpdir/$head") || exit |
|
esac && |
|
echo "$head HEAD" |
|
(cd $tmpdir && find refs -type f) | |
|
while read path |
|
do |
|
tr -d '\012' <"$tmpdir/$path" |
|
echo " $path" |
|
done && |
|
rm -fr $tmpdir |
|
;; |
|
|
|
* ) |
|
if test -f "$peek_repo" ; then |
|
git bundle list-heads "$peek_repo" || |
|
echo "failed slurping" |
|
else |
|
git-peek-remote $exec "$peek_repo" || |
|
echo "failed slurping" |
|
fi |
|
;; |
|
esac | |
|
sort -t ' ' -k 2 | |
|
while read sha1 path |
|
do |
|
case "$sha1" in |
|
failed) |
|
exit 1 ;; |
|
esac |
|
case "$path" in |
|
refs/heads/*) |
|
group=heads ;; |
|
refs/tags/*) |
|
group=tags ;; |
|
*) |
|
group=other ;; |
|
esac |
|
case ",$heads,$tags,$other," in |
|
*,$group,*) |
|
;; |
|
*) |
|
continue;; |
|
esac |
|
case "$#" in |
|
0) |
|
match=yes ;; |
|
*) |
|
match=no |
|
for pat |
|
do |
|
case "/$path" in |
|
*/$pat ) |
|
match=yes |
|
break ;; |
|
esac |
|
done |
|
esac |
|
case "$match" in |
|
no) |
|
continue ;; |
|
esac |
|
echo "$sha1 $path" |
|
done
|
|
|