summaryrefslogtreecommitdiff
path: root/remote.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2013-01-11 16:45:44 -0800
committerJunio C Hamano <gitster@pobox.com>2013-01-11 16:45:44 -0800
commitc039f35b8af8c0e7a29f8d9403c020497ed40f67 (patch)
tree2c0675e5707bce5631e4ad141465549831706b45 /remote.c
parent9a4a941e04a5b3afdc038767ed59d1cc291e7a4d (diff)
parentf8fb971eace6ed6fb0f350ade8af6fdd3599272d (diff)
downloadgit-c039f35b8af8c0e7a29f8d9403c020497ed40f67.tar.gz
Merge branch 'jc/fetch-ignore-symref' into maint
"git fetch --mirror" and fetch that uses other forms of refspec with wildcard used to attempt to update a symbolic ref that match the wildcard on the receiving end, which made little sense (the real ref that is pointed at by the symbolic ref would be updated anyway). Symbolic refs no longer are affected by such a fetch. * jc/fetch-ignore-symref: fetch: ignore wildcarded refspecs that update local symbolic refs
Diffstat (limited to 'remote.c')
-rw-r--r--remote.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/remote.c b/remote.c
index 6aa49c03df..ca1f8f2eaf 100644
--- a/remote.c
+++ b/remote.c
@@ -1370,6 +1370,16 @@ int branch_merge_matches(struct branch *branch,
return refname_match(branch->merge[i]->src, refname, ref_fetch_rules);
}
+static int ignore_symref_update(const char *refname)
+{
+ unsigned char sha1[20];
+ int flag;
+
+ if (!resolve_ref_unsafe(refname, sha1, 0, &flag))
+ return 0; /* non-existing refs are OK */
+ return (flag & REF_ISSYMREF);
+}
+
static struct ref *get_expanded_map(const struct ref *remote_refs,
const struct refspec *refspec)
{
@@ -1383,7 +1393,8 @@ static struct ref *get_expanded_map(const struct ref *remote_refs,
if (strchr(ref->name, '^'))
continue; /* a dereference item */
if (match_name_with_pattern(refspec->src, ref->name,
- refspec->dst, &expn_name)) {
+ refspec->dst, &expn_name) &&
+ !ignore_symref_update(expn_name)) {
struct ref *cpy = copy_ref(ref);
cpy->peer_ref = alloc_ref(expn_name);