git-svn: optimize --branch and --branch-all-ref
[gitweb.git] / git-fetch.sh
index 83143f82cfa3b92a38a9caa2b00860541d139aa2..48818f822451b3d69e7cd90e81e34bf137ead4dd 100755 (executable)
@@ -166,7 +166,10 @@ fast_forward_local () {
            mb=$(git-merge-base "$local" "$2") &&
            case "$2,$mb" in
            $local,*)
-               echo >&2 "* $1: same as $3"
+               if test -n "$verbose"
+               then
+                       echo >&2 "* $1: same as $3"
+               fi
                ;;
            *,$local)
                echo >&2 "* $1: fast forward to $3"
@@ -211,12 +214,12 @@ esac
 reflist=$(get_remote_refs_for_fetch "$@")
 if test "$tags"
 then
-       taglist=$(IFS=" " &&
+       taglist=`IFS="  " &&
                  git-ls-remote $upload_pack --tags "$remote" |
                  while read sha1 name
                  do
                        case "$name" in
-                       (*^*) continue ;;
+                       *^*) continue ;;
                        esac
                        if git-check-ref-format "$name"
                        then
@@ -224,7 +227,7 @@ then
                        else
                            echo >&2 "warning: tag ${name} ignored"
                        fi
-                 done)
+                 done`
        if test "$#" -gt 1
        then
                # remote URL plus explicit refspecs; we need to merge them.
@@ -270,14 +273,22 @@ fetch_main () {
          if [ -n "$GIT_SSL_NO_VERIFY" ]; then
              curl_extra_args="-k"
          fi
-         remote_name_quoted=$(perl -e '
+         max_depth=5
+         depth=0
+         head="ref: $remote_name"
+         while (expr "z$head" : "zref:" && expr $depth \< $max_depth) >/dev/null
+         do
+           remote_name_quoted=$(perl -e '
              my $u = $ARGV[0];
+              $u =~ s/^ref:\s*//;
              $u =~ s{([^-a-zA-Z0-9/.])}{sprintf"%%%02x",ord($1)}eg;
              print "$u";
-         ' "$remote_name")
-         head=$(curl -nsfL $curl_extra_args "$remote/$remote_name_quoted") &&
+         ' "$head")
+           head=$(curl -nsfL $curl_extra_args "$remote/$remote_name_quoted")
+           depth=$( expr \( $depth + 1 \) )
+         done
          expr "z$head" : "z$_x40\$" >/dev/null ||
-                 die "Failed to fetch $remote_name from $remote"
+             die "Failed to fetch $remote_name from $remote"
          echo >&2 Fetching "$remote_name from $remote" using http
          git-http-fetch -v -a "$head" "$remote/" || exit
          ;;