[PATCH] fetch.c: Remove useless lookup_object_type() call in process()
[gitweb.git] / git-fetch.sh
index 22739440384648357896898f11001e2fa05f217e..cbfa27de90baa14b268785a72e1f9c1a91a47f54 100755 (executable)
@@ -58,21 +58,25 @@ append_fetch_head () {
     # remote-nick is the URL given on the command line (or a shorthand)
     # remote-name is the $GIT_DIR relative refs/ path we computed
     # for this refspec.
+    remote_1_=$(expr "$remote_" : '\(.*\)\.git/*$') &&
+       remote_="$remote_1_"
+    case "$remote_" in
+    . | ./) where_= ;;
+    *) where_=" of $remote_" ;;
+    esac
     case "$remote_name_" in
     HEAD)
        note_= ;;
     refs/heads/*)
        note_="$(expr "$remote_name_" : 'refs/heads/\(.*\)')"
-       note_="branch '$note_' of " ;;
+       note_="branch '$note_'" ;;
     refs/tags/*)
        note_="$(expr "$remote_name_" : 'refs/tags/\(.*\)')"
-       note_="tag '$note_' of " ;;
+       note_="tag '$note_'" ;;
     *)
-       note_="$remote_name of " ;;
+       note_="$remote_name" ;;
     esac
-    remote_1_=$(expr "$remote_" : '\(.*\)\.git/*$') &&
-       remote_="$remote_1_"
-    note_="$note_$remote_"
+    note_="$note_$where_"
 
     # 2.6.11-tree tag would not be happy to be fed to resolve.
     if git-cat-file commit "$head_" >/dev/null 2>&1
@@ -183,12 +187,31 @@ do
        ;;
     rsync://*)
        TMP_HEAD="$GIT_DIR/TMP_HEAD"
-       rsync -L "$remote/$remote_name" "$TMP_HEAD" || exit 1
+       rsync -L -q "$remote/$remote_name" "$TMP_HEAD" || exit 1
        head=$(git-rev-parse TMP_HEAD)
        rm -f "$TMP_HEAD"
        test "$rsync_slurped_objects" || {
-           rsync -avz --ignore-existing "$remote/objects/" \
-               "$GIT_OBJECT_DIRECTORY/" || exit
+           rsync -av --ignore-existing --exclude info \
+               "$remote/objects/" "$GIT_OBJECT_DIRECTORY/" || exit
+
+           # Look at objects/info/alternates for rsync -- http will
+           # support it natively and git native ones will do it on the remote
+           # end.  Not having that file is not a crime.
+           rsync -q "$remote/objects/info/alternates" \
+               "$GIT_DIR/TMP_ALT" 2>/dev/null ||
+               rm -f "$GIT_DIR/TMP_ALT"
+           if test -f "$GIT_DIR/TMP_ALT"
+           then
+               resolve_alternates "$remote" <"$GIT_DIR/TMP_ALT" |
+               while read alt
+               do
+                   case "$alt" in 'bad alternate: '*) die "$alt";; esac
+                   echo >&2 "Getting alternate: $alt"
+                   rsync -av --ignore-existing --exclude info \
+                   "$alt" "$GIT_OBJECT_DIRECTORY/" || exit
+               done
+               rm -f "$GIT_DIR/TMP_ALT"
+           fi
            rsync_slurped_objects=t
        }
        ;;