X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=git-fetch-script;h=dd94edeb38eb47dc6abf5e00c1a5d8c067a76f74;hb=80b52b0f9d04fa0b8863fef2beef937ee1a486ae;hp=dc7f4d6e44e9a597a2ed778bc89a3e4693a7fa27;hpb=ae2da40690a3f3f101de5780a7799781b09e2e05;p=git.git diff --git a/git-fetch-script b/git-fetch-script index dc7f4d6e..dd94edeb 100755 --- a/git-fetch-script +++ b/git-fetch-script @@ -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