Skip to content

Commit

Permalink
Keep '*' in pattern refspecs
Browse files Browse the repository at this point in the history
In order to do anything more capable with refspecs, the first step is
to keep the entire input. Additionally, validate patterns by checking
for the ref matching the rules for a pattern as given by
check_ref_format(). This requires a slight change to
check_ref_format() to make it enforce the requirement that the '*'
immediately follow a '/'.

Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Daniel Barkalow authored and Junio C Hamano committed Mar 7, 2009
1 parent e928213 commit 08fbdb3
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 18 deletions.
4 changes: 1 addition & 3 deletions refs.c
Original file line number Diff line number Diff line change
Expand Up @@ -718,9 +718,7 @@ int check_ref_format(const char *ref)
while ((ch = *cp++) != 0) {
bad_type = bad_ref_char(ch);
if (bad_type) {
return (bad_type == 2 && !*cp)
? CHECK_REF_FORMAT_WILDCARD
: CHECK_REF_FORMAT_ERROR;
return CHECK_REF_FORMAT_ERROR;
}
if (ch == '/')
break;
Expand Down
33 changes: 18 additions & 15 deletions remote.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ static struct refspec s_tag_refspec = {
0,
1,
0,
"refs/tags/",
"refs/tags/"
"refs/tags/*",
"refs/tags/*"
};

const struct refspec *tag_refspec = &s_tag_refspec;
Expand Down Expand Up @@ -451,16 +451,11 @@ static void read_config(void)
*/
static int verify_refname(char *name, int is_glob)
{
int result, len = -1;
int result;

if (is_glob) {
len = strlen(name);
assert(name[len - 1] == '/');
name[len - 1] = '\0';
}
result = check_ref_format(name);
if (is_glob)
name[len - 1] = '/';
if (is_glob && result == CHECK_REF_FORMAT_WILDCARD)
result = CHECK_REF_FORMAT_OK;
return result;
}

Expand Down Expand Up @@ -517,15 +512,14 @@ static struct refspec *parse_refspec_internal(int nr_refspec, const char **refsp
if (rhs) {
size_t rlen = strlen(++rhs);
is_glob = (2 <= rlen && !strcmp(rhs + rlen - 2, "/*"));
rs[i].dst = xstrndup(rhs, rlen - is_glob);
rs[i].dst = xstrndup(rhs, rlen);
}

llen = (rhs ? (rhs - lhs - 1) : strlen(lhs));
if (2 <= llen && !memcmp(lhs + llen - 2, "/*", 2)) {
if ((rhs && !is_glob) || (!rhs && fetch))
goto invalid;
is_glob = 1;
llen--;
} else if (rhs && is_glob) {
goto invalid;
}
Expand Down Expand Up @@ -722,10 +716,19 @@ int remote_has_url(struct remote *remote, const char *url)
static int match_name_with_pattern(const char *key, const char *name,
const char *value, char **result)
{
size_t klen = strlen(key);
int ret = !strncmp(key, name, klen);
const char *kstar = strchr(key, '*');
size_t klen;
int ret;
if (!kstar)
die("Key '%s' of pattern had no '*'", key);
klen = kstar - key;
ret = !strncmp(key, name, klen);
if (ret && value) {
size_t vlen = strlen(value);
const char *vstar = strchr(value, '*');
size_t vlen;
if (!vstar)
die("Value '%s' of pattern has no '*'", value);
vlen = vstar - value;
*result = xmalloc(vlen +
strlen(name) -
klen + 1);
Expand Down

0 comments on commit 08fbdb3

Please sign in to comment.