diff --git a/git-fetch.sh b/git-fetch.sh index d3988660ff8cf214cfb1f5903a4bab5ab63b6cea..7c05880bcfca30426d03112c0967ada6f68305be 100755 --- a/git-fetch.sh +++ b/git-fetch.sh @@ -5,6 +5,10 @@ _x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40" +LF=' +' +IFS="$LF" + tags= append= force= @@ -170,11 +174,14 @@ esac reflist=$(get_remote_refs_for_fetch "$@") if test "$tags" then - taglist=$(git-ls-remote --tags "$remote" | awk '{ print "."$2":"$2 }') + taglist=$(git-ls-remote --tags "$remote" | + sed -e ' + s/^[^ ]* // + s/.*/&:&/') if test "$#" -gt 1 then # remote URL plus explicit refspecs; we need to merge them. - reflist="$reflist $taglist" + reflist="$reflist$LF$taglist" else # No explicit refspecs; fetch tags only. reflist=$taglist @@ -183,7 +190,7 @@ fi for ref in $reflist do - refs="$refs $ref" + refs="$refs$LF$ref" # These are relative path from $GIT_DIR, typically starting at refs/ # but may be HEAD @@ -204,7 +211,7 @@ do remote_name=$(expr "$ref" : '\([^:]*\):') local_name=$(expr "$ref" : '[^:]*:\(.*\)') - rref="$rref $remote_name" + rref="$rref$LF$remote_name" # There are transports that can fetch only one head at a time... case "$remote" in @@ -212,7 +219,12 @@ do if [ -n "$GIT_SSL_NO_VERIFY" ]; then curl_extra_args="-k" fi - head=$(curl -nsf $curl_extra_args "$remote/$remote_name") && + remote_name_quoted=$(perl -e ' + my $u = $ARGV[0]; + $u =~ s{([^-a-zA-Z0-9/.])}{sprintf"%%%02x",ord($1)}eg; + print "$u"; + ' "$remote_name") + head=$(curl -nsf $curl_extra_args "$remote/$remote_name_quoted") && expr "$head" : "$_x40\$" >/dev/null || die "Failed to fetch $remote_name from $remote" echo >&2 Fetching "$remote_name from $remote" using http @@ -262,6 +274,7 @@ case "$remote" in http://* | https://* | rsync://* ) ;; # we are already done. *) + IFS=" $LF" ( git-fetch-pack "$remote" $rref || echo failed "$remote" ) |