From: Junio C Hamano Date: Sat, 12 Jan 2013 00:45:44 +0000 (-0800) Subject: Merge branch 'jc/fetch-ignore-symref' into maint X-Git-Tag: v1.8.1.1~24 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/c039f35b8af8c0e7a29f8d9403c020497ed40f67?ds=inline;hp=-c 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 --- c039f35b8af8c0e7a29f8d9403c020497ed40f67 diff --combined remote.c index 6aa49c03df,a72748ce8e..ca1f8f2eaf --- a/remote.c +++ b/remote.c @@@ -1370,6 -1370,16 +1370,16 @@@ int branch_merge_matches(struct 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 +1393,8 @@@ 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); @@@ -1458,8 -1469,8 +1469,8 @@@ int get_fetch_map(const struct ref *rem for (rmp = &ref_map; *rmp; ) { if ((*rmp)->peer_ref) { - if (check_refname_format((*rmp)->peer_ref->name + 5, - REFNAME_ALLOW_ONELEVEL)) { + if (prefixcmp((*rmp)->peer_ref->name, "refs/") || + check_refname_format((*rmp)->peer_ref->name, 0)) { struct ref *ignore = *rmp; error("* Ignoring funny ref '%s' locally", (*rmp)->peer_ref->name); @@@ -1627,16 -1638,13 +1638,16 @@@ int format_tracking_info(struct branch base = branch->merge[0]->dst; base = shorten_unambiguous_ref(base, 0); - if (!num_theirs) + if (!num_theirs) { strbuf_addf(sb, Q_("Your branch is ahead of '%s' by %d commit.\n", "Your branch is ahead of '%s' by %d commits.\n", num_ours), base, num_ours); - else if (!num_ours) + if (advice_status_hints) + strbuf_addf(sb, + _(" (use \"git push\" to publish your local commits)\n")); + } else if (!num_ours) { strbuf_addf(sb, Q_("Your branch is behind '%s' by %d commit, " "and can be fast-forwarded.\n", @@@ -1644,10 -1652,7 +1655,10 @@@ "and can be fast-forwarded.\n", num_theirs), base, num_theirs); - else + if (advice_status_hints) + strbuf_addf(sb, + _(" (use \"git pull\" to update your local branch)\n")); + } else { strbuf_addf(sb, Q_("Your branch and '%s' have diverged,\n" "and have %d and %d different commit each, " @@@ -1657,10 -1662,6 +1668,10 @@@ "respectively.\n", num_theirs), base, num_ours, num_theirs); + if (advice_status_hints) + strbuf_addf(sb, + _(" (use \"git pull\" to merge the remote branch into yours)\n")); + } return 1; }