Merge branch 'ar/wildcardpush'
* ar/wildcardpush: Test wildcard push/fetch Fix push with refspecs containing wildcardsmaint
commit
684a93d958
39
remote.c
39
remote.c
|
@ -501,16 +501,16 @@ static struct ref *find_ref_by_name(struct ref *list, const char *name)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static int check_pattern_match(struct refspec *rs, int rs_nr, struct ref *src)
|
||||
static const struct refspec *check_pattern_match(const struct refspec *rs,
|
||||
int rs_nr,
|
||||
const struct ref *src)
|
||||
{
|
||||
int i;
|
||||
if (!rs_nr)
|
||||
return 1;
|
||||
for (i = 0; i < rs_nr; i++) {
|
||||
if (rs[i].pattern && !prefixcmp(src->name, rs[i].src))
|
||||
return 1;
|
||||
return rs + i;
|
||||
}
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int match_refs(struct ref *src, struct ref *dst, struct ref ***dst_tail,
|
||||
|
@ -525,29 +525,44 @@ int match_refs(struct ref *src, struct ref *dst, struct ref ***dst_tail,
|
|||
/* pick the remainder */
|
||||
for ( ; src; src = src->next) {
|
||||
struct ref *dst_peer;
|
||||
const struct refspec *pat = NULL;
|
||||
char *dst_name;
|
||||
if (src->peer_ref)
|
||||
continue;
|
||||
if (!check_pattern_match(rs, nr_refspec, src))
|
||||
continue;
|
||||
if (nr_refspec) {
|
||||
pat = check_pattern_match(rs, nr_refspec, src);
|
||||
if (!pat)
|
||||
continue;
|
||||
}
|
||||
|
||||
dst_peer = find_ref_by_name(dst, src->name);
|
||||
if (pat) {
|
||||
dst_name = xmalloc(strlen(pat->dst) +
|
||||
strlen(src->name) -
|
||||
strlen(pat->src) + 2);
|
||||
strcpy(dst_name, pat->dst);
|
||||
strcat(dst_name, src->name + strlen(pat->src));
|
||||
} else
|
||||
dst_name = strdup(src->name);
|
||||
dst_peer = find_ref_by_name(dst, dst_name);
|
||||
if (dst_peer && dst_peer->peer_ref)
|
||||
/* We're already sending something to this ref. */
|
||||
continue;
|
||||
goto free_name;
|
||||
if (!dst_peer && !nr_refspec && !all)
|
||||
/* Remote doesn't have it, and we have no
|
||||
* explicit pattern, and we don't have
|
||||
* --all. */
|
||||
continue;
|
||||
goto free_name;
|
||||
if (!dst_peer) {
|
||||
/* Create a new one and link it */
|
||||
int len = strlen(src->name) + 1;
|
||||
int len = strlen(dst_name) + 1;
|
||||
dst_peer = xcalloc(1, sizeof(*dst_peer) + len);
|
||||
memcpy(dst_peer->name, src->name, len);
|
||||
memcpy(dst_peer->name, dst_name, len);
|
||||
hashcpy(dst_peer->new_sha1, src->new_sha1);
|
||||
link_dst_tail(dst_peer, dst_tail);
|
||||
}
|
||||
dst_peer->peer_ref = src;
|
||||
free_name:
|
||||
free(dst_name);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,82 @@
|
|||
#!/bin/sh
|
||||
|
||||
test_description='fetching and pushing, with or without wildcard'
|
||||
|
||||
. ./test-lib.sh
|
||||
|
||||
D=`pwd`
|
||||
|
||||
mk_empty () {
|
||||
rm -fr testrepo &&
|
||||
mkdir testrepo &&
|
||||
(
|
||||
cd testrepo &&
|
||||
git init
|
||||
)
|
||||
}
|
||||
|
||||
test_expect_success setup '
|
||||
|
||||
: >path1 &&
|
||||
git add path1 &&
|
||||
test_tick &&
|
||||
git commit -a -m repo &&
|
||||
the_commit=$(git show-ref -s --verify refs/heads/master)
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'fetch without wildcard' '
|
||||
mk_empty &&
|
||||
(
|
||||
cd testrepo &&
|
||||
git fetch .. refs/heads/master:refs/remotes/origin/master &&
|
||||
|
||||
r=$(git show-ref -s --verify refs/remotes/origin/master) &&
|
||||
test "z$r" = "z$the_commit" &&
|
||||
|
||||
test 1 = $(git for-each-ref refs/remotes/origin | wc -l)
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'fetch with wildcard' '
|
||||
mk_empty &&
|
||||
(
|
||||
cd testrepo &&
|
||||
git config remote.up.url .. &&
|
||||
git config remote.up.fetch "refs/heads/*:refs/remotes/origin/*" &&
|
||||
git fetch up &&
|
||||
|
||||
r=$(git show-ref -s --verify refs/remotes/origin/master) &&
|
||||
test "z$r" = "z$the_commit" &&
|
||||
|
||||
test 1 = $(git for-each-ref refs/remotes/origin | wc -l)
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'push without wildcard' '
|
||||
mk_empty &&
|
||||
|
||||
git push testrepo refs/heads/master:refs/remotes/origin/master &&
|
||||
(
|
||||
cd testrepo &&
|
||||
r=$(git show-ref -s --verify refs/remotes/origin/master) &&
|
||||
test "z$r" = "z$the_commit" &&
|
||||
|
||||
test 1 = $(git for-each-ref refs/remotes/origin | wc -l)
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'push with wildcard' '
|
||||
mk_empty &&
|
||||
|
||||
git push testrepo "refs/heads/*:refs/remotes/origin/*" &&
|
||||
(
|
||||
cd testrepo &&
|
||||
r=$(git show-ref -s --verify refs/remotes/origin/master) &&
|
||||
test "z$r" = "z$the_commit" &&
|
||||
|
||||
test 1 = $(git for-each-ref refs/remotes/origin | wc -l)
|
||||
)
|
||||
'
|
||||
|
||||
test_done
|
Loading…
Reference in New Issue