Re: [PATCH] remote.c: Fix overtight refspec validation
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Mar 26, 2008, 04:11 UTC
- Message-ID
- <7vfxuejf9d.fsf@gitster.siamese.dyndns.org>
- In-Reply-To
- <7vod92jh3u.fsf@gitster.siamese.dyndns.org>
Junio C Hamano <gitster@pobox.com> writes:
> Especially that "refs/tags/*" is sad in that it is leaking an internal > implementation detail. I do not think the original code ever used > wildcards on the push side, and it probably was a good idea to allow > wildcards when the code was rewritten.
Having thought about this a bit more, I think this patch would be more useful. Please discard the previous patch to builtin-push.c and replace with this patch.
Now it allows you to say:
[remote "neigh"]
url = ../neighbour
push = refs/tags/*to propagate all tags one-to-one, without having to say "refs/tags/*:refs/tags/*".
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?
--- remote.c | 18 +++++++++++------- 1 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/remote.c b/remote.c index 40ed246..c39d831 100644 --- a/remote.c +++ b/remote.c @@ -417,17 +417,21 @@ static struct refspec *parse_refspec_internal(int nr_refspec, const char **refsp rhs++; rlen = strlen(rhs); is_glob = (2 <= rlen && !strcmp(rhs + rlen - 2, "/*")); - rs[i].dst = xstrndup(rhs, rlen - is_glob * 2); + if (is_glob) + rlen -= 2; + rs[i].dst = xstrndup(rhs, rlen); } llen = (rhs ? (rhs - lhs - 1) : strlen(lhs)); - if (is_glob != (2 <= llen && !memcmp(lhs + llen - 2, "/*", 2))) - goto invalid; - - if (is_glob) { + if (2 <= llen && !memcmp(lhs + llen - 2, "/*", 2)) { + if (rhs && !is_glob) + goto invalid; + is_glob = 1; llen -= 2; - rlen -= 2; + } else if (rhs && is_glob) { + goto invalid; } + rs[i].pattern = is_glob; rs[i].src = xstrndup(lhs, llen); @@ -446,7 +450,7 @@ static struct refspec *parse_refspec_internal(int nr_refspec, const char **refsp } /* * RHS - * - missing is allowed. + * - missing is ok, and is same as empty. * - empty is ok; it means not to store. * - otherwise it must be a valid looking ref. */