From: Victoria Dye <vdye@xxxxxxxxxx> Update 'read_index_info()' to return INDEX_INFO_UNRECOGNIZED_LINE (value 1), rather than die()-ing when the function encounters a line that cannot be parsed according to one of the accepted formats. This grants the caller the flexibility to fall back on custom handling for such lines rather than a returning a catch-all error. In the case of 'update-index', we'll still exit with a "malformed input line" error. However, when 'read_index_info()' is used to process the input to 'mktree' in a later patch, an empty line return value will signal a new tree in --batch mode. Signed-off-by: Victoria Dye <vdye@xxxxxxxxxx> --- builtin/update-index.c | 9 +++++++-- index-info.c | 16 +++++++++------- index-info.h | 5 ++++- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/builtin/update-index.c b/builtin/update-index.c index fddf59b54c1..8d0b40a6fd6 100644 --- a/builtin/update-index.c +++ b/builtin/update-index.c @@ -787,11 +787,16 @@ static enum parse_opt_result stdin_cacheinfo_callback( ret = error("option '%s' must be the last argument", opt->long_name); } else { int *nul_term_line = opt->value; + struct strbuf line = STRBUF_INIT; allow_add = allow_replace = allow_remove = 1; - ret = read_index_info(*nul_term_line, apply_index_info, NULL); - if (ret) + ret = read_index_info(*nul_term_line, apply_index_info, NULL, &line); + + if (ret == INDEX_INFO_UNRECOGNIZED_LINE) + ret = error("malformed input line '%s'", line.buf); + else if (ret) ret = -1; + strbuf_release(&line); } return ret; diff --git a/index-info.c b/index-info.c index 8ccaac5487b..7a02f66426a 100644 --- a/index-info.c +++ b/index-info.c @@ -5,16 +5,16 @@ #include "strbuf.h" #include "quote.h" -int read_index_info(int nul_term_line, each_index_info_fn fn, void *cbdata) +int read_index_info(int nul_term_line, each_index_info_fn fn, void *cbdata, + struct strbuf *line) { const int hexsz = the_hash_algo->hexsz; - struct strbuf buf = STRBUF_INIT; struct strbuf uq = STRBUF_INIT; strbuf_getline_fn getline_fn; int ret = 0; getline_fn = nul_term_line ? strbuf_getline_nul : strbuf_getline_lf; - while (getline_fn(&buf, stdin) != EOF) { + while (getline_fn(line, stdin) != EOF) { char *ptr, *tab; char *path_name; struct object_id oid; @@ -39,8 +39,8 @@ int read_index_info(int nul_term_line, each_index_info_fn fn, void *cbdata) * index file and matches "git ls-files --stage" output. */ errno = 0; - ul = strtoul(buf.buf, &ptr, 8); - if (ptr == buf.buf || *ptr != ' ' + ul = strtoul(line->buf, &ptr, 8); + if (ptr == line->buf || *ptr != ' ' || errno || (unsigned int) ul != ul) goto bad_line; mode = ul; @@ -81,10 +81,12 @@ int read_index_info(int nul_term_line, each_index_info_fn fn, void *cbdata) continue; bad_line: - die("malformed input line '%s'", buf.buf); + ret = INDEX_INFO_UNRECOGNIZED_LINE; + break; } - strbuf_release(&buf); strbuf_release(&uq); + if (!ret) + strbuf_reset(line); return ret; } diff --git a/index-info.h b/index-info.h index d650498325a..9258011462d 100644 --- a/index-info.h +++ b/index-info.h @@ -5,7 +5,10 @@ typedef int (*each_index_info_fn)(unsigned int, struct object_id *, int, const char *, void *); +#define INDEX_INFO_UNRECOGNIZED_LINE 1 + /* Iterate over parsed index info from stdin */ -int read_index_info(int nul_term_line, each_index_info_fn fn, void *cbdata); +int read_index_info(int nul_term_line, each_index_info_fn fn, void *cbdata, + struct strbuf *line); #endif /* INDEX_INFO_H */ -- gitgitgadget