Commits

Anonymous committed efe9bf0

[PATCH] Allow "+remote:local" refspec to cause --force when fetching.

With this we could say:

Pull: master:ko-master +pu:ko-pu

to mean "fast forward ko-master with master, overwrite ko-pu with pu",
and the latter one does not require the remote "pu" to be descendant
of local "ko-pu".

Signed-off-by: Junio C Hamano <junkio@cox.net>

Comments (0)

Files changed (2)

 		;;
 	    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."
 			;;
 		*)
 
     # 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" : '[^:]*:\(.*\)')
 
     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 ;;
 	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

git-parse-remote-script

 get_data_source () {
 	case "$1" in
 	*/*)
-		# Not so fast.  This could be the partial URL shorthand...
+		# Not so fast.	This could be the partial URL shorthand...
 		token=$(expr "$1" : '\([^/]*\)/')
 		remainder=$(expr "$1" : '[^/]*/\(.*\)')
 		if test -f "$GIT_DIR/branches/$token"
 canon_refs_list_for_fetch () {
 	for ref
 	do
+		force=
+		case "$ref" in
+		+*)
+			ref=$(expr "$ref" : '\+\(.*\)')
+			force=+
+			;;
+		esac
 		expr "$ref" : '.*:' >/dev/null || ref="${ref}:"
 		remote=$(expr "$ref" : '\([^:]*\):')
 		local=$(expr "$ref" : '[^:]*:\(.*\)')
 		'') local= ;;
 		*) local="refs/heads/$local" ;;
 		esac
-		echo "${remote}:${local}"
+		echo "${force}${remote}:${local}"
 	done
 }
 
 		else
 		    case "$ref" in
 		    tag)
-		        tag_just_seen=yes
+			tag_just_seen=yes
 			continue
 			;;
 		    esac
 		fi
-	        canon_refs_list_for_fetch "$ref"
+		canon_refs_list_for_fetch "$ref"
 	    done
 	    ;;
 	esac