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