Fix fetching of tags.
[gitweb.git] / git-fetch-script
index dc7f4d6e44e9a597a2ed778bc89a3e4693a7fa27..b581dc4cd6fa7fe6406cf3b1e1e142118a52b00b 100755 (executable)
@@ -53,8 +53,8 @@ append_fetch_head () {
     # 2.6.11-tree tag would not be happy to be fed to resolve.
     if git-cat-file commit "$head_" >/dev/null 2>&1
     then
-       head_=$(git-rev-parse --verify "$head_^0") || exit
-       note_="$head  $remote_name_ from $remote_nick_"
+       headc_=$(git-rev-parse --verify "$head_^0") || exit
+       note_="$headc_  $remote_name_ from $remote_nick_"
        echo "$note_" >>$GIT_DIR/FETCH_HEAD
        echo >&2 "* committish: $note_"
     else
@@ -104,8 +104,8 @@ fast_forward_local () {
                ;;
            esac || {
                echo >&2 "* $1: does not fast forward to $4"
-               case "$force" in
-               t)
+               case "$force,$single_force" in
+               t,* | *,t)
                        echo >&2 "  from $3; forcing update."
                        ;;
                *)
@@ -130,6 +130,13 @@ do
 
     # These are relative path from $GIT_DIR, typically starting at refs/
     # but may be HEAD
+    if expr "$ref" : '\+' >/dev/null
+    then
+       single_force=t
+       ref=$(expr "$ref" : '\+\(.*\)')
+    else
+       single_force=
+    fi
     remote_name=$(expr "$ref" : '\([^:]*\):')
     local_name=$(expr "$ref" : '[^:]*:\(.*\)')
 
@@ -175,9 +182,14 @@ http://* | https://* | rsync://* )
     while read sha1 remote_name
     do
        found=
+       single_force=
        for ref in $refs
        do
            case "$ref" in
+           +$remote_name:*)
+               single_force=t
+               found="$ref"
+               break ;;
            $remote_name:*)
                found="$ref"
                break ;;
@@ -185,7 +197,7 @@ http://* | https://* | rsync://* )
        done
 
        local_name=$(expr "$found" : '[^:]*:\(.*\)')
-        append_fetch_head "$sha1" "$remote" "$remote_name" "$remote_nick" "$local_name"
+       append_fetch_head "$sha1" "$remote" "$remote_name" "$remote_nick" "$local_name"
     done
     ;;
 esac