1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-20 01:46:14 +02:00

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
This commit is contained in:
Junio C Hamano 2013-01-11 16:45:44 -08:00
commit c039f35b8a
2 changed files with 54 additions and 1 deletions

View File

@ -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);

42
t/t5535-fetch-push-symref.sh Executable file
View File

@ -0,0 +1,42 @@
#!/bin/sh
test_description='avoiding conflicting update thru symref aliasing'
. ./test-lib.sh
test_expect_success 'setup' '
test_commit one &&
git clone . src &&
git clone src dst1 &&
git clone src dst2 &&
test_commit two &&
( cd src && git pull )
'
test_expect_success 'push' '
(
cd src &&
git push ../dst1 "refs/remotes/*:refs/remotes/*"
) &&
git ls-remote src "refs/remotes/*" >expect &&
git ls-remote dst1 "refs/remotes/*" >actual &&
test_cmp expect actual &&
( cd src && git symbolic-ref refs/remotes/origin/HEAD ) >expect &&
( cd dst1 && git symbolic-ref refs/remotes/origin/HEAD ) >actual &&
test_cmp expect actual
'
test_expect_success 'fetch' '
(
cd dst2 &&
git fetch ../src "refs/remotes/*:refs/remotes/*"
) &&
git ls-remote src "refs/remotes/*" >expect &&
git ls-remote dst2 "refs/remotes/*" >actual &&
test_cmp expect actual &&
( cd src && git symbolic-ref refs/remotes/origin/HEAD ) >expect &&
( cd dst2 && git symbolic-ref refs/remotes/origin/HEAD ) >actual &&
test_cmp expect actual
'
test_done