Merge branch 'ab/refspec-init-fix'
Make refspec parsing codepath more robust. * ab/refspec-init-fix: refspec: initalize `refspec_item` in `valid_fetch_refspec()` refspec: add back a refspec_item_init() function refspec: s/refspec_item_init/&_or_die/gmaint
commit
a909726903
|
@ -1077,7 +1077,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
|
||||||
if (option_required_reference.nr || option_optional_reference.nr)
|
if (option_required_reference.nr || option_optional_reference.nr)
|
||||||
setup_reference();
|
setup_reference();
|
||||||
|
|
||||||
refspec_item_init(&refspec, value.buf, REFSPEC_FETCH);
|
refspec_item_init_or_die(&refspec, value.buf, REFSPEC_FETCH);
|
||||||
|
|
||||||
strbuf_reset(&value);
|
strbuf_reset(&value);
|
||||||
|
|
||||||
|
|
|
@ -684,7 +684,7 @@ static const char *get_tracking_branch(const char *remote, const char *refspec)
|
||||||
const char *spec_src;
|
const char *spec_src;
|
||||||
const char *merge_branch;
|
const char *merge_branch;
|
||||||
|
|
||||||
refspec_item_init(&spec, refspec, REFSPEC_FETCH);
|
refspec_item_init_or_die(&spec, refspec, REFSPEC_FETCH);
|
||||||
spec_src = spec.src;
|
spec_src = spec.src;
|
||||||
if (!*spec_src || !strcmp(spec_src, "HEAD"))
|
if (!*spec_src || !strcmp(spec_src, "HEAD"))
|
||||||
spec_src = "HEAD";
|
spec_src = "HEAD";
|
||||||
|
|
13
refspec.c
13
refspec.c
|
@ -124,11 +124,16 @@ static int parse_refspec(struct refspec_item *item, const char *refspec, int fet
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void refspec_item_init(struct refspec_item *item, const char *refspec, int fetch)
|
int refspec_item_init(struct refspec_item *item, const char *refspec, int fetch)
|
||||||
{
|
{
|
||||||
memset(item, 0, sizeof(*item));
|
memset(item, 0, sizeof(*item));
|
||||||
|
return parse_refspec(item, refspec, fetch);
|
||||||
|
}
|
||||||
|
|
||||||
if (!parse_refspec(item, refspec, fetch))
|
void refspec_item_init_or_die(struct refspec_item *item, const char *refspec,
|
||||||
|
int fetch)
|
||||||
|
{
|
||||||
|
if (!refspec_item_init(item, refspec, fetch))
|
||||||
die("Invalid refspec '%s'", refspec);
|
die("Invalid refspec '%s'", refspec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -152,7 +157,7 @@ void refspec_append(struct refspec *rs, const char *refspec)
|
||||||
{
|
{
|
||||||
struct refspec_item item;
|
struct refspec_item item;
|
||||||
|
|
||||||
refspec_item_init(&item, refspec, rs->fetch);
|
refspec_item_init_or_die(&item, refspec, rs->fetch);
|
||||||
|
|
||||||
ALLOC_GROW(rs->items, rs->nr + 1, rs->alloc);
|
ALLOC_GROW(rs->items, rs->nr + 1, rs->alloc);
|
||||||
rs->items[rs->nr++] = item;
|
rs->items[rs->nr++] = item;
|
||||||
|
@ -191,7 +196,7 @@ void refspec_clear(struct refspec *rs)
|
||||||
int valid_fetch_refspec(const char *fetch_refspec_str)
|
int valid_fetch_refspec(const char *fetch_refspec_str)
|
||||||
{
|
{
|
||||||
struct refspec_item refspec;
|
struct refspec_item refspec;
|
||||||
int ret = parse_refspec(&refspec, fetch_refspec_str, REFSPEC_FETCH);
|
int ret = refspec_item_init(&refspec, fetch_refspec_str, REFSPEC_FETCH);
|
||||||
refspec_item_clear(&refspec);
|
refspec_item_clear(&refspec);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,10 @@ struct refspec {
|
||||||
int fetch;
|
int fetch;
|
||||||
};
|
};
|
||||||
|
|
||||||
void refspec_item_init(struct refspec_item *item, const char *refspec, int fetch);
|
int refspec_item_init(struct refspec_item *item, const char *refspec,
|
||||||
|
int fetch);
|
||||||
|
void refspec_item_init_or_die(struct refspec_item *item, const char *refspec,
|
||||||
|
int fetch);
|
||||||
void refspec_item_clear(struct refspec_item *item);
|
void refspec_item_clear(struct refspec_item *item);
|
||||||
void refspec_init(struct refspec *rs, int fetch);
|
void refspec_init(struct refspec *rs, int fetch);
|
||||||
void refspec_append(struct refspec *rs, const char *refspec);
|
void refspec_append(struct refspec *rs, const char *refspec);
|
||||||
|
|
Loading…
Reference in New Issue