Re: [PATCH] Restore ls-remote reference pattern matching
- From
Sergey Vlasov <vsu@altlinux.ru>
- Date
- Dec 9, 2007, 13:26 UTC
- Message-ID
- <20071209162632.a16bfd6e.vsu@altlinux.ru>
- In-Reply-To
- <7v8x44tl7q.fsf@gitster.siamese.dyndns.org>
On Sat, 08 Dec 2007 22:51:05 -0800 Junio C Hamano wrote:
[...]
Show 8 quoted lines
> for pat > do > case "/$path" in > */$pat ) > match=yes > break ;; > esac > done
[...]
Show 28 quoted lines
> +/*
> + * pattern is a list of tail-part of accepted refnames. Is there one
> + * among then that is a suffix of the path? Directory boundary must
> + * be honored when doing this match. IOW, patterns "master" and
> + * "sa/master" both match path "refs/hold/sa/master". On the other
> + * hand, path "refs/hold/foosa/master" is matched by "master" but not
> + * by "sa/master".
> + */
> +
> +static int tail_match(const char **pattern, const char *path)
> +{
> + int pathlen;
> + const char *p;
> +
> + if (!*pattern)
> + return 1; /* no restriction */
> +
> + for (pathlen = strlen(path); (p = *pattern); pattern++) {
> + int pfxlen = pathlen - strlen(p);
> + if (pfxlen < 0)
> + continue; /* pattern is longer, will never match */
> + if (strcmp(path + pfxlen, p))
> + continue; /* no tail match */
> + if (!pfxlen || path[pfxlen - 1] == '/')
> + return 1; /* fully match at directory boundary */
> + }
> + return 0;
> +}This still does not match the behavior of the old shell implementation completely - because $pat was not quoted, shell pattern characters in $pat worked, and things like "git ls-remote . 'refs/heads/something--*'" were possible (and used in some of my scripts), so a full fnmatch() call is still needed.