Skip to content

Commit

Permalink
run_external_diff: use an argv_array for the environment
Browse files Browse the repository at this point in the history
We currently use static buffers and a static array for
formatting the environment passed to the external diff.
There's nothing wrong in the code, but it is much easier to
verify that it is correct if we use a dynamic argv_array.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Apr 21, 2014
1 parent 82fbf26 commit ae049c9
Showing 1 changed file with 5 additions and 9 deletions.
14 changes: 5 additions & 9 deletions diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -2908,11 +2908,9 @@ static void run_external_diff(const char *pgm,
struct diff_options *o)
{
struct argv_array argv = ARGV_ARRAY_INIT;
struct argv_array env = ARGV_ARRAY_INIT;
int retval;
struct diff_queue_struct *q = &diff_queued_diff;
const char *env[3] = { NULL };
char env_counter[50];
char env_total[50];

if (one && two) {
struct diff_tempfile *temp_one, *temp_two;
Expand All @@ -2937,15 +2935,13 @@ static void run_external_diff(const char *pgm,
}
fflush(NULL);

env[0] = env_counter;
snprintf(env_counter, sizeof(env_counter), "GIT_DIFF_PATH_COUNTER=%d",
++o->diff_path_counter);
env[1] = env_total;
snprintf(env_total, sizeof(env_total), "GIT_DIFF_PATH_TOTAL=%d", q->nr);
argv_array_pushf(&env, "GIT_DIFF_PATH_COUNTER=%d", ++o->diff_path_counter);
argv_array_pushf(&env, "GIT_DIFF_PATH_TOTAL=%d", q->nr);

retval = run_command_v_opt_cd_env(argv.argv, RUN_USING_SHELL, NULL, env);
retval = run_command_v_opt_cd_env(argv.argv, RUN_USING_SHELL, NULL, env.argv);
remove_tempfile();
argv_array_clear(&argv);
argv_array_clear(&env);
if (retval) {
fprintf(stderr, "external diff died, stopping at %s.\n", name);
exit(1);
Expand Down

0 comments on commit ae049c9

Please sign in to comment.