textconv: refactor calls to run_textconv
This patch adds a fill_textconv wrapper, which centralizes some minor logic like error checking and handling the case of no-textconv. In addition to dropping the number of lines, this will make it easier in future patches to handle multiple types of textconv. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
a941d5e395
commit
840383b2c2
66
diff.c
66
diff.c
@ -43,7 +43,8 @@ static char diff_colors[][COLOR_MAXLEN] = {
|
||||
};
|
||||
|
||||
static void diff_filespec_load_driver(struct diff_filespec *one);
|
||||
static char *run_textconv(const char *, struct diff_filespec *, size_t *);
|
||||
static size_t fill_textconv(const char *cmd,
|
||||
struct diff_filespec *df, char **outbuf);
|
||||
|
||||
static int parse_diff_color_slot(const char *var, int ofs)
|
||||
{
|
||||
@ -477,7 +478,7 @@ static void emit_rewrite_diff(const char *name_a,
|
||||
const char *reset = diff_get_color(color_diff, DIFF_RESET);
|
||||
static struct strbuf a_name = STRBUF_INIT, b_name = STRBUF_INIT;
|
||||
const char *a_prefix, *b_prefix;
|
||||
const char *data_one, *data_two;
|
||||
char *data_one, *data_two;
|
||||
size_t size_one, size_two;
|
||||
struct emit_callback ecbdata;
|
||||
|
||||
@ -499,26 +500,8 @@ static void emit_rewrite_diff(const char *name_a,
|
||||
quote_two_c_style(&a_name, a_prefix, name_a, 0);
|
||||
quote_two_c_style(&b_name, b_prefix, name_b, 0);
|
||||
|
||||
diff_populate_filespec(one, 0);
|
||||
diff_populate_filespec(two, 0);
|
||||
if (textconv_one) {
|
||||
data_one = run_textconv(textconv_one, one, &size_one);
|
||||
if (!data_one)
|
||||
die("unable to read files to diff");
|
||||
}
|
||||
else {
|
||||
data_one = one->data;
|
||||
size_one = one->size;
|
||||
}
|
||||
if (textconv_two) {
|
||||
data_two = run_textconv(textconv_two, two, &size_two);
|
||||
if (!data_two)
|
||||
die("unable to read files to diff");
|
||||
}
|
||||
else {
|
||||
data_two = two->data;
|
||||
size_two = two->size;
|
||||
}
|
||||
size_one = fill_textconv(textconv_one, one, &data_one);
|
||||
size_two = fill_textconv(textconv_two, two, &data_two);
|
||||
|
||||
memset(&ecbdata, 0, sizeof(ecbdata));
|
||||
ecbdata.color_diff = color_diff;
|
||||
@ -1717,20 +1700,8 @@ static void builtin_diff(const char *name_a,
|
||||
strbuf_reset(&header);
|
||||
}
|
||||
|
||||
if (textconv_one) {
|
||||
size_t size;
|
||||
mf1.ptr = run_textconv(textconv_one, one, &size);
|
||||
if (!mf1.ptr)
|
||||
die("unable to read files to diff");
|
||||
mf1.size = size;
|
||||
}
|
||||
if (textconv_two) {
|
||||
size_t size;
|
||||
mf2.ptr = run_textconv(textconv_two, two, &size);
|
||||
if (!mf2.ptr)
|
||||
die("unable to read files to diff");
|
||||
mf2.size = size;
|
||||
}
|
||||
mf1.size = fill_textconv(textconv_one, one, &mf1.ptr);
|
||||
mf2.size = fill_textconv(textconv_two, two, &mf2.ptr);
|
||||
|
||||
pe = diff_funcname_pattern(one);
|
||||
if (!pe)
|
||||
@ -3916,3 +3887,26 @@ static char *run_textconv(const char *pgm, struct diff_filespec *spec,
|
||||
|
||||
return strbuf_detach(&buf, outsize);
|
||||
}
|
||||
|
||||
static size_t fill_textconv(const char *cmd,
|
||||
struct diff_filespec *df,
|
||||
char **outbuf)
|
||||
{
|
||||
size_t size;
|
||||
|
||||
if (!cmd) {
|
||||
if (!DIFF_FILE_VALID(df)) {
|
||||
*outbuf = "";
|
||||
return 0;
|
||||
}
|
||||
if (diff_populate_filespec(df, 0))
|
||||
die("unable to read files to diff");
|
||||
*outbuf = df->data;
|
||||
return df->size;
|
||||
}
|
||||
|
||||
*outbuf = run_textconv(cmd, df, &size);
|
||||
if (!*outbuf)
|
||||
die("unable to read files to diff");
|
||||
return size;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user