Merge branch 'jk/refspec-parse-wildcard'
Allow an asterisk as a substring (as opposed to the entirety) of a path component for both side of a refspec, e.g. "refs/heads/o*:refs/remotes/heads/i*". * jk/refspec-parse-wildcard: refs: loosen restriction on wildcard "*" refspecs refs: cleanup comments regarding check_refname_component()
This commit is contained in:
44
refs.c
44
refs.c
@ -19,12 +19,14 @@ struct ref_lock {
|
||||
* 1: End-of-component
|
||||
* 2: ., look for a preceding . to reject .. in refs
|
||||
* 3: {, look for a preceding @ to reject @{ in refs
|
||||
* 4: A bad character: ASCII control characters, "~", "^", ":" or SP
|
||||
* 4: A bad character: ASCII control characters, and
|
||||
* ":", "?", "[", "\", "^", "~", SP, or TAB
|
||||
* 5: *, reject unless REFNAME_REFSPEC_PATTERN is set
|
||||
*/
|
||||
static unsigned char refname_disposition[256] = {
|
||||
1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
||||
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
||||
4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 2, 1,
|
||||
4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 2, 1,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 0,
|
||||
@ -75,12 +77,14 @@ static unsigned char refname_disposition[256] = {
|
||||
*
|
||||
* - any path component of it begins with ".", or
|
||||
* - it has double dots "..", or
|
||||
* - it has ASCII control character, "~", "^", ":" or SP, anywhere, or
|
||||
* - it ends with a "/".
|
||||
* - it ends with ".lock"
|
||||
* - it contains a "\" (backslash)
|
||||
* - it has ASCII control characters, or
|
||||
* - it has ":", "?", "[", "\", "^", "~", SP, or TAB anywhere, or
|
||||
* - it has "*" anywhere unless REFNAME_REFSPEC_PATTERN is set, or
|
||||
* - it ends with a "/", or
|
||||
* - it ends with ".lock", or
|
||||
* - it contains a "@{" portion
|
||||
*/
|
||||
static int check_refname_component(const char *refname, int flags)
|
||||
static int check_refname_component(const char *refname, int *flags)
|
||||
{
|
||||
const char *cp;
|
||||
char last = '\0';
|
||||
@ -101,6 +105,16 @@ static int check_refname_component(const char *refname, int flags)
|
||||
break;
|
||||
case 4:
|
||||
return -1;
|
||||
case 5:
|
||||
if (!(*flags & REFNAME_REFSPEC_PATTERN))
|
||||
return -1; /* refspec can't be a pattern */
|
||||
|
||||
/*
|
||||
* Unset the pattern flag so that we only accept
|
||||
* a single asterisk for one side of refspec.
|
||||
*/
|
||||
*flags &= ~ REFNAME_REFSPEC_PATTERN;
|
||||
break;
|
||||
}
|
||||
last = ch;
|
||||
}
|
||||
@ -125,18 +139,10 @@ int check_refname_format(const char *refname, int flags)
|
||||
|
||||
while (1) {
|
||||
/* We are at the start of a path component. */
|
||||
component_len = check_refname_component(refname, flags);
|
||||
if (component_len <= 0) {
|
||||
if ((flags & REFNAME_REFSPEC_PATTERN) &&
|
||||
refname[0] == '*' &&
|
||||
(refname[1] == '\0' || refname[1] == '/')) {
|
||||
/* Accept one wildcard as a full refname component. */
|
||||
flags &= ~REFNAME_REFSPEC_PATTERN;
|
||||
component_len = 1;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
component_len = check_refname_component(refname, &flags);
|
||||
if (component_len <= 0)
|
||||
return -1;
|
||||
|
||||
component_count++;
|
||||
if (refname[component_len] == '\0')
|
||||
break;
|
||||
|
Reference in New Issue
Block a user