summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Barkalow <barkalow@iabervon.org>2009-03-07 01:11:36 -0500
committerJunio C Hamano <gitster@pobox.com>2009-03-07 12:19:24 -0800
commit08fbdb30438fd7087c5abe15840a22fe21094515 (patch)
tree4c3a23090737b8c858911c1985e219ae9ee1c7ba
parente928213fb40c106650dca2632b5e830cfaffb86a (diff)
downloadgit-08fbdb30438fd7087c5abe15840a22fe21094515.tar.gz
Keep '*' in pattern refspecs
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>
-rw-r--r--refs.c4
-rw-r--r--remote.c33
2 files changed, 19 insertions, 18 deletions
diff --git a/refs.c b/refs.c
index 6eb5f53846..a50ba79270 100644
--- a/refs.c
+++ b/refs.c
@@ -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;
diff --git a/remote.c b/remote.c
index 01b8f91c5b..d596a48651 100644
--- a/remote.c
+++ b/remote.c
@@ -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;
@@ -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;
}
@@ -517,7 +512,7 @@ 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));
@@ -525,7 +520,6 @@ static struct refspec *parse_refspec_internal(int nr_refspec, const char **refsp
if ((rhs && !is_glob) || (!rhs && fetch))
goto invalid;
is_glob = 1;
- llen--;
} else if (rhs && is_glob) {
goto invalid;
}
@@ -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);