[PATCH] More missing terms in glossary.txt
[git.git] / git-fetch-script
index 9b05e41..b581dc4 100755 (executable)
@@ -6,16 +6,32 @@ _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"
 
 append=
-case "$#" in
-0)
-       die "Where do you want to fetch from?" ;;
-*)
+force=
+while case "$#" in 0) break ;; esac
+do
        case "$1" in
        -a|--a|--ap|--app|--appe|--appen|--append)
                append=t
-               shift ;;
+               shift
+               ;;
+       -f|--f|--fo|--for|--forc|--force)
+               force=t
+               shift
+               ;;
+       *)
+               break
+               ;;
        esac
+done
+
+case "$#" in
+0)
+       test -f "$GIT_DIR/branches/origin" ||
+               test -f "$GIT_DIR/remotes/origin" ||
+                       die "Where do you want to fetch from?"
+       set origin ;;
 esac
+
 remote_nick="$1"
 remote=$(get_remote_url "$@")
 refs=
@@ -37,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
@@ -57,7 +73,16 @@ fast_forward_local () {
     refs/tags/*)
        # Tags need not be pointing at commits so there
        # is no way to guarantee "fast-forward" anyway.
+       if test -f "$GIT_DIR/$1"
+       then
+               echo >&2 "* $1: updating with $4"
+               echo >&2 "  from $3."
+       else
+               echo >&2 "* $1: storing $4"
+               echo >&2 "  from $3."
+       fi
        echo "$2" >"$GIT_DIR/$1" ;;
+
     refs/heads/*)
        # NEEDSWORK: use the same cmpxchg protocol here.
        echo "$2" >"$GIT_DIR/$1.lock"
@@ -78,9 +103,16 @@ fast_forward_local () {
                false
                ;;
            esac || {
-               mv "$GIT_DIR/$1.lock" "$GIT_DIR/$1.remote"
                echo >&2 "* $1: does not fast forward to $4"
-               echo >&2 "  from $3; leaving it in '$1.remote'"
+               case "$force,$single_force" in
+               t,* | *,t)
+                       echo >&2 "  from $3; forcing update."
+                       ;;
+               *)
+                       mv "$GIT_DIR/$1.lock" "$GIT_DIR/$1.remote"
+                       echo >&2 "  from $3; leaving it in '$1.remote'"
+                       ;;
+               esac
            }
        else
                echo >&2 "* $1: storing $4"
@@ -98,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" : '[^:]*:\(.*\)')
 
@@ -143,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 ;;
@@ -153,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