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:
committed by
Junio C Hamano
parent
b516968ff6
commit
8558fd9ece
27
refs.c
27
refs.c
@ -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 == '.')
|
||||
|
||||
Reference in New Issue
Block a user