On Tue, 25 Mar 2008, Junio C Hamano wrote:
This however has unintended side effect of allowing
[remote "bour"]
url = ../neighbour
fetch = refs/heads/*
at the syntax level. I do not know offhand the fetch backends are
prepared to deal with such wildcard patterns.
Daniel?
It's not a matter of the backends, which don't implement any of the
control flow in the fetch direction; it's get_expanded_map(), which needs
to be told that you can have something match a pattern but not have a
local tracking ref.
OTOH, the only use for such a pattern is an octopus merge of whatever
branches a remote happens to have, right? I remember thinking this was a
non-useful refspec when I was dealing with the fetch code (and then
forgetting that it was useful for push). It might be better to just
disallow it in the direction-specific semantic checks.
Here's the patch to make it work, anyway:
----
commit 6a8bcb917e1aa9b3c972f14f618ab573e457ebee
Author: Daniel Barkalow [off-list ref]
Date: Wed Mar 26 01:39:07 2008 -0400
Support fetching refspecs like "refs/heads/*"
Signed-off-by: Daniel Barkalow [off-list ref]
diff --git a/remote.c b/remote.c
index a027bca..f8f4b34 100644
--- a/remote.c
+++ b/remote.c
@@ -998,22 +998,24 @@ static struct ref *get_expanded_map(const struct ref *remote_refs,
struct ref **tail = &ret;
int remote_prefix_len = strlen(refspec->src);
- int local_prefix_len = strlen(refspec->dst);
+ int local_prefix_len = refspec->dst ? strlen(refspec->dst) : 0;
for (ref = remote_refs; ref; ref = ref->next) {
if (strchr(ref->name, '^'))
continue; /* a dereference item */
if (!prefixcmp(ref->name, refspec->src)) {
- const char *match;
struct ref *cpy = copy_ref(ref);
- match = ref->name + remote_prefix_len;
-
- cpy->peer_ref = alloc_ref(local_prefix_len +
- strlen(match) + 1);
- sprintf(cpy->peer_ref->name, "%s%s",
- refspec->dst, match);
- if (refspec->force)
- cpy->peer_ref->force = 1;
+
+ if (refspec->dst) {
+ const char *match = ref->name +
+ remote_prefix_len;
+ cpy->peer_ref = alloc_ref(local_prefix_len +
+ strlen(match) + 1);
+ sprintf(cpy->peer_ref->name, "%s%s",
+ refspec->dst, match);
+ if (refspec->force)
+ cpy->peer_ref->force = 1;
+ }
*tail = cpy;
tail = &cpy->next;
}