Re: [PATCH] Restore ls-remote reference pattern matching

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, 08 Dec 2007 22:51:05 -0800 Junio C Hamano wrote:

[...]
> 	for pat
> 	do
> 		case "/$path" in
> 		*/$pat )
> 			match=yes
> 			break ;;
> 		esac
> 	done
[...]
> +/*
> + * 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.

Attachment: pgpZDkcNhpaMK.pgp
Description: PGP signature


[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux