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/g
This commit is contained in:
Junio C Hamano 2018-06-28 12:53:29 -07:00
commit a909726903
4 changed files with 15 additions and 7 deletions

View File

@ -1077,7 +1077,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
if (option_required_reference.nr || option_optional_reference.nr)
setup_reference();
refspec_item_init(&refspec, value.buf, REFSPEC_FETCH);
refspec_item_init_or_die(&refspec, value.buf, REFSPEC_FETCH);
strbuf_reset(&value);

View File

@ -684,7 +684,7 @@ static const char *get_tracking_branch(const char *remote, const char *refspec)
const char *spec_src;
const char *merge_branch;
refspec_item_init(&spec, refspec, REFSPEC_FETCH);
refspec_item_init_or_die(&spec, refspec, REFSPEC_FETCH);
spec_src = spec.src;
if (!*spec_src || !strcmp(spec_src, "HEAD"))
spec_src = "HEAD";

View File

@ -124,11 +124,16 @@ static int parse_refspec(struct refspec_item *item, const char *refspec, int fet
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));
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);
}
@ -152,7 +157,7 @@ void refspec_append(struct refspec *rs, const char *refspec)
{
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);
rs->items[rs->nr++] = item;
@ -191,7 +196,7 @@ void refspec_clear(struct refspec *rs)
int valid_fetch_refspec(const char *fetch_refspec_str)
{
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);
return ret;
}

View File

@ -32,7 +32,10 @@ struct refspec {
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_init(struct refspec *rs, int fetch);
void refspec_append(struct refspec *rs, const char *refspec);