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