[PATCH] New git-apply test cases for scanning forwards and backwards.
[git.git] / git-fetch-script
index dc7f4d6..dd94ede 100755 (executable)
@@ -7,28 +7,33 @@ _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
 
 append=
 force=
+update_head_ok=
 while case "$#" in 0) break ;; esac
 do
        case "$1" in
        -a|--a|--ap|--app|--appe|--appen|--append)
                append=t
-               shift
                ;;
        -f|--f|--fo|--for|--forc|--force)
                force=t
-               shift
+               ;;
+       -u|--u|--up|--upd|--upda|--updat|--update|--update-|--update-h|\
+       --update-he|--update-hea|--update-head|--update-head-|\
+       --update-head-o|--update-head-ok)
+               update_head_ok=t
                ;;
        *)
                break
                ;;
        esac
+       shift
 done
 
 case "$#" in
 0)
        test -f "$GIT_DIR/branches/origin" ||
                test -f "$GIT_DIR/remotes/origin" ||
-                       die "Where do you want to fetch from?"
+                       die "Where do you want to fetch from today?"
        set origin ;;
 esac
 
@@ -53,8 +58,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 +109,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."
                        ;;
                *)
@@ -124,12 +129,25 @@ fast_forward_local () {
     esac
 }
 
+case "$update_head_ok" in
+'')
+       orig_head=$(cat "$GIT_DIR/HEAD" 2>/dev/null)
+       ;;
+esac
+
 for ref in $(get_remote_refs_for_fetch "$@")
 do
     refs="$refs $ref"
 
     # 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,7 +161,7 @@ do
        fi
        head=$(curl -nsf $curl_extra_args "$remote/$remote_name") &&
        expr "$head" : "$_x40\$" >/dev/null ||
-           die "Failed to fetch $remote_name from $remote"
+               die "Failed to fetch $remote_name from $remote"
        echo Fetching "$remote_name from $remote" using http
        git-http-pull -v -a "$head" "$remote/" || exit
        ;;
@@ -175,9 +193,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 +208,22 @@ 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
+
+# If the original head was empty (i.e. no "master" yet), or
+# if we were told not to worry, we do not have to check.
+case ",$update_head_ok,$orig_head," in
+*,, | t,* )
+       ;;
+*)
+       curr_head=$(cat "$GIT_DIR/HEAD" 2>/dev/null)
+       if test "$curr_head" != "$orig_head"
+       then
+               echo "$orig_head" >$GIT_DIR/HEAD
+               die "Cannot fetch into the current branch."
+       fi
+       ;;
+esac