|  | #!/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 |