143 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			143 lines
		
	
	
		
			2.5 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 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
 |