revision: --max-age alone does not need limit_list() anymore.
[git.git] / git-fetch.sh
index d1659e2..954901d 100755 (executable)
@@ -18,16 +18,18 @@ force=
 verbose=
 update_head_ok=
 exec=
+upload_pack=
 while case "$#" in 0) break ;; esac
 do
        case "$1" in
        -a|--a|--ap|--app|--appe|--appen|--append)
                append=t
                ;;
-       -u|--u|--up|--upl|--uploa|--upload|--upload-|--upload-p|--upload-pa|\
-       --upload-pac|--upload-pack)
+       --upl|--uplo|--uploa|--upload|--upload-|--upload-p|\
+       --upload-pa|--upload-pac|--upload-pack)
                shift
                exec="--exec=$1" 
+               upload_pack="-u $1"
                ;;
        -f|--f|--fo|--for|--forc|--force)
                force=t
@@ -92,6 +94,9 @@ 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.
+
+    # the $note_ variable will be fed to git-fmt-merge-msg for further
+    # processing.
     case "$remote_name_" in
     HEAD)
        note_= ;;
@@ -101,6 +106,9 @@ append_fetch_head () {
     refs/tags/*)
        note_="$(expr "$remote_name_" : 'refs/tags/\(.*\)')"
        note_="tag '$note_' of " ;;
+    refs/remotes/*)
+       note_="$(expr "$remote_name_" : 'refs/remotes/\(.*\)')"
+       note_="remote branch '$note_' of " ;;
     *)
        note_="$remote_name of " ;;
     esac
@@ -145,10 +153,10 @@ fast_forward_local () {
        else
                echo >&2 "* $1: storing $3"
        fi
-       git-update-ref "$1" "$2" 
+       git-update-ref "$1" "$2"
        ;;
 
-    refs/heads/*)
+    refs/heads/* | refs/remotes/*)
        # $1 is the ref being updated.
        # $2 is the new value for the ref.
        local=$(git-rev-parse --verify "$1^0" 2>/dev/null)
@@ -162,6 +170,7 @@ fast_forward_local () {
                ;;
            *,$local)
                echo >&2 "* $1: fast forward to $3"
+               echo >&2 "  from $local to $2"
                git-update-ref "$1" "$2" "$local"
                ;;
            *)
@@ -176,6 +185,7 @@ fast_forward_local () {
                        ;;
                *)
                        echo >&2 "  not updating."
+                       exit 1
                        ;;
                esac
            }
@@ -202,7 +212,7 @@ reflist=$(get_remote_refs_for_fetch "$@")
 if test "$tags"
 then
        taglist=$(IFS=" " &&
-                 git-ls-remote --tags "$remote" |
+                 git-ls-remote $upload_pack --tags "$remote" |
                  while read sha1 name
                  do
                        case "$name" in
@@ -318,7 +328,7 @@ fetch_main () {
     ( : subshell because we muck with IFS
       IFS="    $LF"
       (
-         git-fetch-pack $exec $keep "$remote" $rref || echo failed "$remote"
+         git-fetch-pack $exec $keep --thin "$remote" $rref || echo failed "$remote"
       ) |
       while read sha1 remote_name
       do
@@ -366,20 +376,25 @@ fetch_main "$reflist"
 # automated tag following
 case "$no_tags$tags" in
 '')
-       taglist=$(IFS=" " &&
-       git-ls-remote --tags "$remote" |
-       sed -ne 's|^\([0-9a-f]*\)[      ]\(refs/tags/.*\)^{}$|\1 \2|p' |
-       while read sha1 name
-       do
-               test -f "$GIT_DIR/$name" && continue
-               git-check-ref-format "$name" || {
-                       echo >&2 "warning: tag ${name} ignored"
-                       continue
-               }
-               git-cat-file -t "$sha1" >/dev/null 2>&1 || continue
-               echo >&2 "Auto-following $name"
-               echo ".${name}:${name}"
-       done)
+       case "$reflist" in
+       *:refs/*)
+               # effective only when we are following remote branch
+               # using local tracking branch.
+               taglist=$(IFS=" " &&
+               git-ls-remote $upload_pack --tags "$remote" |
+               sed -ne 's|^\([0-9a-f]*\)[      ]\(refs/tags/.*\)^{}$|\1 \2|p' |
+               while read sha1 name
+               do
+                       test -f "$GIT_DIR/$name" && continue
+                       git-check-ref-format "$name" || {
+                               echo >&2 "warning: tag ${name} ignored"
+                               continue
+                       }
+                       git-cat-file -t "$sha1" >/dev/null 2>&1 || continue
+                       echo >&2 "Auto-following $name"
+                       echo ".${name}:${name}"
+               done)
+       esac
        case "$taglist" in
        '') ;;
        ?*)