ls-remote: resurrect pattern limit support
"git ls-remote $remote $name1 $name2..." used to limit the output to refs that end with one of the $name given from the command line, but recent rewrite to C forgot to implement that support. Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
		| @ -6,6 +6,35 @@ | |||||||
| static const char ls_remote_usage[] = | static const char ls_remote_usage[] = | ||||||
| "git-ls-remote [--upload-pack=<git-upload-pack>] [<host>:]<directory>"; | "git-ls-remote [--upload-pack=<git-upload-pack>] [<host>:]<directory>"; | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * pattern is a list of tail-part of accepted refnames.  Is there one | ||||||
|  |  * among them that is a suffix of the path?  Directory boundary must | ||||||
|  |  * be honored when checking 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; | ||||||
|  | } | ||||||
|  |  | ||||||
| int cmd_ls_remote(int argc, const char **argv, const char *prefix) | int cmd_ls_remote(int argc, const char **argv, const char *prefix) | ||||||
| { | { | ||||||
| 	int i; | 	int i; | ||||||
| @ -13,6 +42,7 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix) | |||||||
| 	int nongit = 0; | 	int nongit = 0; | ||||||
| 	unsigned flags = 0; | 	unsigned flags = 0; | ||||||
| 	const char *uploadpack = NULL; | 	const char *uploadpack = NULL; | ||||||
|  | 	const char **pattern = NULL; | ||||||
|  |  | ||||||
| 	struct remote *remote; | 	struct remote *remote; | ||||||
| 	struct transport *transport; | 	struct transport *transport; | ||||||
| @ -50,9 +80,9 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix) | |||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (!dest || i != argc - 1) | 	if (!dest) | ||||||
| 		usage(ls_remote_usage); | 		usage(ls_remote_usage); | ||||||
|  | 	pattern = argv + i + 1; | ||||||
| 	remote = nongit ? NULL : remote_get(dest); | 	remote = nongit ? NULL : remote_get(dest); | ||||||
| 	if (remote && !remote->url_nr) | 	if (remote && !remote->url_nr) | ||||||
| 		die("remote %s has no configured URL", dest); | 		die("remote %s has no configured URL", dest); | ||||||
| @ -65,10 +95,12 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix) | |||||||
| 	if (!ref) | 	if (!ref) | ||||||
| 		return 1; | 		return 1; | ||||||
|  |  | ||||||
| 	while (ref) { | 	for ( ; ref; ref = ref->next) { | ||||||
| 		if (check_ref_type(ref, flags)) | 		if (!check_ref_type(ref, flags)) | ||||||
| 			printf("%s	%s\n", sha1_to_hex(ref->old_sha1), ref->name); | 			continue; | ||||||
| 		ref = ref->next; | 		if (!tail_match(pattern, ref->name)) | ||||||
|  | 			continue; | ||||||
|  | 		printf("%s	%s\n", sha1_to_hex(ref->old_sha1), ref->name); | ||||||
| 	} | 	} | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Junio C Hamano
					Junio C Hamano