Code

Do not merge random set of refs out of wildcarded refs
authorJunio C Hamano <junkio@cox.net>
Mon, 1 Jan 2007 01:44:37 +0000 (17:44 -0800)
committerJunio C Hamano <junkio@cox.net>
Mon, 1 Jan 2007 02:53:26 +0000 (18:53 -0800)
When your fetch configuration has only the wildcards, we would
pick the lexicographically first ref from the remote side for
merging, which was complete nonsense.  Make sure nothing except
the one that is specified with branch.*.merge is merged in this
case.

Signed-off-by: Junio C Hamano <junkio@cox.net>
git-parse-remote.sh

index 144f1701553a1e2f4204a2df15e66437e0670123..d2e4c2b9aede8310879cea9c47bd3cee323f11af 100755 (executable)
@@ -76,16 +76,32 @@ get_remote_default_refs_for_push () {
 # from get_remote_refs_for_fetch when it deals with refspecs
 # supplied on the command line.  $ls_remote_result has the list
 # of refs available at remote.
+#
+# The first token returned is either "explicit" or "glob"; this
+# is to help prevent randomly "globbed" ref from being chosen as
+# a merge candidate
 expand_refs_wildcard () {
+       first_one=yes
        for ref
        do
                lref=${ref#'+'}
                # a non glob pattern is given back as-is.
                expr "z$lref" : 'zrefs/.*/\*:refs/.*/\*$' >/dev/null || {
+                       if test -n "$first_one"
+                       then
+                               echo "explicit"
+                               first_one=
+                       fi
                        echo "$ref"
                        continue
                }
 
+               # glob
+               if test -n "$first_one"
+               then
+                       echo "glob"
+                       first_one=
+               fi
                from=`expr "z$lref" : 'z\(refs/.*/\)\*:refs/.*/\*$'`
                to=`expr "z$lref" : 'zrefs/.*/\*:\(refs/.*/\)\*$'`
                local_force=
@@ -116,7 +132,8 @@ canon_refs_list_for_fetch () {
        if test "$1" = "-d"
        then
                shift ; remote="$1" ; shift
-               set x $(expand_refs_wildcard "$@")
+               set $(expand_refs_wildcard "$@")
+               is_explicit="$1"
                shift
                if test "$remote" = "$(get_default_remote)"
                then
@@ -125,6 +142,10 @@ canon_refs_list_for_fetch () {
                        merge_branches=$(git-repo-config \
                            --get-all "branch.${curr_branch}.merge")
                fi
+               if test -z "$merge_branches" && test $is_explicit != explicit
+               then
+                       merge_branches=..this.will.never.match.any.ref..
+               fi
        fi
        for ref
        do