summaryrefslogtreecommitdiff
path: root/remote.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2013-01-05 23:41:37 -0800
committerJunio C Hamano <gitster@pobox.com>2013-01-05 23:41:37 -0800
commit245d6d006408898613cdad35700d456e5d265722 (patch)
treee4b722a23316c8210d74d8ad0c0b7003f8be3408 /remote.c
parent9a2c83d24cb547c49e320d2498863b0ef297acd4 (diff)
parentf8fb971eace6ed6fb0f350ade8af6fdd3599272d (diff)
downloadgit-245d6d006408898613cdad35700d456e5d265722.tar.gz
Merge branch 'jc/fetch-ignore-symref'
Avoid false error from an attempt to update local symbolic ref via 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 225073909a..4b1153f02c 100644
--- a/remote.c
+++ b/remote.c
@@ -1413,6 +1413,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)
{
@@ -1426,7 +1436,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);