run_external_diff: refactor cmdline setup logic

The current logic makes it hard to see what gets put onto
the command line in which cases. Pulling out a helper
function lets us see that we have two sets of file data, and
the second set either uses the original name, or the "other"
renamed/copy name.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2014-04-19 15:22:25 -04:00 committed by Junio C Hamano
parent 0d4217d92e
commit f3efe78782

26
diff.c
View File

@ -2892,6 +2892,16 @@ static struct diff_tempfile *prepare_temp_file(const char *name,
return temp; return temp;
} }
static void add_external_diff_name(struct argv_array *argv,
const char *name,
struct diff_filespec *df)
{
struct diff_tempfile *temp = prepare_temp_file(name, df);
argv_array_push(argv, temp->name);
argv_array_push(argv, temp->hex);
argv_array_push(argv, temp->mode);
}
/* An external diff command takes: /* An external diff command takes:
* *
* diff-cmd name infile1 infile1-sha1 infile1-mode \ * diff-cmd name infile1 infile1-sha1 infile1-mode \
@ -2915,17 +2925,11 @@ static void run_external_diff(const char *pgm,
argv_array_push(&argv, name); argv_array_push(&argv, name);
if (one && two) { if (one && two) {
struct diff_tempfile *temp_one, *temp_two; add_external_diff_name(&argv, name, one);
const char *othername = (other ? other : name); if (!other)
temp_one = prepare_temp_file(name, one); add_external_diff_name(&argv, name, two);
temp_two = prepare_temp_file(othername, two); else {
argv_array_push(&argv, temp_one->name); add_external_diff_name(&argv, other, two);
argv_array_push(&argv, temp_one->hex);
argv_array_push(&argv, temp_one->mode);
argv_array_push(&argv, temp_two->name);
argv_array_push(&argv, temp_two->hex);
argv_array_push(&argv, temp_two->mode);
if (other) {
argv_array_push(&argv, other); argv_array_push(&argv, other);
argv_array_push(&argv, xfrm_msg); argv_array_push(&argv, xfrm_msg);
} }