git/git-ls-remote.sh
Nicolas Pitre b3d9899324 make git a bit less cryptic on fetch errors
The remote server might not want to tell why it doesn't like us for
security reasons, but let's make the client report such error in a bit
less confusing way.  The remote failure remains a mystery, but the local
message might be a bit less so.

[jc: with a gentle wording updates from Andy Parkins]

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
2006-12-18 15:31:28 -08:00

132 lines
2.2 KiB
Bash
Executable file

#!/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 case "$#" in 0) break;; esac
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="--exec=$1"
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" ]; then
curl_extra_args="-k"
fi
if [ -n "$GIT_CURL_FTP_NO_EPSV" -o \
"`git-repo-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
cat "$tmpdir/$path" | tr -d '\012'
echo " $path"
done &&
rm -fr $tmpdir
;;
* )
git-peek-remote $exec "$peek_repo" ||
echo "failed slurping"
;;
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