make sure parsed wildcard refspec ends with slash
commitb2a56276512885f0c7d159543395769168c9f599
authorJunio C Hamano <gitster@pobox.com>
Sun, 27 Jul 2008 06:15:51 +0000 (26 23:15 -0700)
committerJunio C Hamano <gitster@pobox.com>
Sat, 2 Aug 2008 05:41:15 +0000 (1 22:41 -0700)
treefa584ed1882229b4b540d6a63f00bb8f0d6534f2
parentd65d2b2fb44a8bc0fc917aaca973ab7ad14d13b4
make sure parsed wildcard refspec ends with slash

A wildcard refspec is internally parsed into a refspec structure with src
and dst strings.  Many parts of the code assumed that these do not include
the trailing "/*" when matching the wildcard pattern with an actual ref we
see at the remote.  What this meant was that we needed to make sure not
just that the prefix matched, and also that a slash followed the part that
matched.

But a codepath that scans the result from ls-remote and finds matching
refs forgot to check the "matching part must be followed by a slash" rule.
This resulted in "refs/heads/b1" from the remote side to mistakenly match
the source side of "refs/heads/b/*:refs/remotes/b/*" refspec.

Worse, the refspec crafted internally by "git-clone", and a hardcoded
preparsed refspec that is used to implement "git-fetch --tags", violated
this "parsed widcard refspec does not end with slash" rule; simply adding
the "matching part must be followed by a slash" rule then would have
broken codepaths that use these refspecs.

This commit changes the rule to require a trailing slash to parsed
wildcard refspecs.  IOW, "refs/heads/b/*:refs/remotes/b/*" is parsed as
src = "refs/heads/b/" and dst = "refs/remotes/b/".  This allows us to
simplify the matching logic because we only need to do a prefixcmp() to
notice "refs/heads/b/one" matches and "refs/heads/b1" does not.

Acked-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
remote.c
t/t5513-fetch-track.sh [new file with mode: 0755]