Move refspec pattern matching to match_refs().

This means that send-pack and http-push will support pattern refspecs,
so builtin-push.c doesn't have to expand them, and also git push can
just turn --tags into "refs/tags/*", further simplifying
builtin-push.c

check_ref_format() gets a third "conditionally okay" result for
something that's valid as a pattern but not as a particular ref.

Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Daniel Barkalow
2007-05-25 01:20:56 -04:00
committed by Junio C Hamano
parent b516968ff6
commit 8558fd9ece
4 changed files with 70 additions and 122 deletions

27
refs.c
View File

@ -603,15 +603,20 @@ int get_ref_sha1(const char *ref, unsigned char *sha1)
static inline int bad_ref_char(int ch)
{
return (((unsigned) ch) <= ' ' ||
ch == '~' || ch == '^' || ch == ':' ||
/* 2.13 Pattern Matching Notation */
ch == '?' || ch == '*' || ch == '[');
if (((unsigned) ch) <= ' ' ||
ch == '~' || ch == '^' || ch == ':')
return 1;
/* 2.13 Pattern Matching Notation */
if (ch == '?' || ch == '[') /* Unsupported */
return 1;
if (ch == '*') /* Supported at the end */
return 2;
return 0;
}
int check_ref_format(const char *ref)
{
int ch, level;
int ch, level, bad_type;
const char *cp = ref;
level = 0;
@ -622,13 +627,19 @@ int check_ref_format(const char *ref)
return -1; /* should not end with slashes */
/* we are at the beginning of the path component */
if (ch == '.' || bad_ref_char(ch))
if (ch == '.')
return -1;
bad_type = bad_ref_char(ch);
if (bad_type) {
return (bad_type == 2 && !*cp) ? -3 : -1;
}
/* scan the rest of the path component */
while ((ch = *cp++) != 0) {
if (bad_ref_char(ch))
return -1;
bad_type = bad_ref_char(ch);
if (bad_type) {
return (bad_type == 2 && !*cp) ? -3 : -1;
}
if (ch == '/')
break;
if (ch == '.' && *cp == '.')