@@ -2880,6 +2880,16 @@ static struct diff_tempfile *prepare_temp_file(const char *name,
2880
2880
return temp ;
2881
2881
}
2882
2882
2883
+ static void add_external_diff_name (struct argv_array * argv ,
2884
+ const char * name ,
2885
+ struct diff_filespec * df )
2886
+ {
2887
+ struct diff_tempfile * temp = prepare_temp_file (name , df );
2888
+ argv_array_push (argv , temp -> name );
2889
+ argv_array_push (argv , temp -> hex );
2890
+ argv_array_push (argv , temp -> mode );
2891
+ }
2892
+
2883
2893
/* An external diff command takes:
2884
2894
*
2885
2895
* diff-cmd name infile1 infile1-sha1 infile1-mode \
@@ -2896,48 +2906,32 @@ static void run_external_diff(const char *pgm,
2896
2906
struct diff_options * o )
2897
2907
{
2898
2908
struct argv_array argv = ARGV_ARRAY_INIT ;
2899
- int retval ;
2909
+ struct argv_array env = ARGV_ARRAY_INIT ;
2900
2910
struct diff_queue_struct * q = & diff_queued_diff ;
2901
- const char * env [ 3 ] = { NULL };
2902
- char env_counter [ 50 ] ;
2903
- char env_total [ 50 ] ;
2911
+
2912
+ argv_array_push ( & argv , pgm ) ;
2913
+ argv_array_push ( & argv , name ) ;
2904
2914
2905
2915
if (one && two ) {
2906
- struct diff_tempfile * temp_one , * temp_two ;
2907
- const char * othername = (other ? other : name );
2908
- temp_one = prepare_temp_file (name , one );
2909
- temp_two = prepare_temp_file (othername , two );
2910
- argv_array_push (& argv , pgm );
2911
- argv_array_push (& argv , name );
2912
- argv_array_push (& argv , temp_one -> name );
2913
- argv_array_push (& argv , temp_one -> hex );
2914
- argv_array_push (& argv , temp_one -> mode );
2915
- argv_array_push (& argv , temp_two -> name );
2916
- argv_array_push (& argv , temp_two -> hex );
2917
- argv_array_push (& argv , temp_two -> mode );
2918
- if (other ) {
2916
+ add_external_diff_name (& argv , name , one );
2917
+ if (!other )
2918
+ add_external_diff_name (& argv , name , two );
2919
+ else {
2920
+ add_external_diff_name (& argv , other , two );
2919
2921
argv_array_push (& argv , other );
2920
2922
argv_array_push (& argv , xfrm_msg );
2921
2923
}
2922
- } else {
2923
- argv_array_push (& argv , pgm );
2924
- argv_array_push (& argv , name );
2925
2924
}
2926
- fflush (NULL );
2927
2925
2928
- env [ 0 ] = env_counter ;
2929
- snprintf ( env_counter , sizeof ( env_counter ), "GIT_DIFF_PATH_COUNTER =%d" ,
2930
- ++ o -> diff_path_counter );
2931
- env [ 1 ] = env_total ;
2932
- snprintf ( env_total , sizeof ( env_total ), "GIT_DIFF_PATH_TOTAL=%d" , q -> nr );
2926
+ argv_array_pushf ( & env , "GIT_DIFF_PATH_COUNTER=%d" , ++ o -> diff_path_counter ) ;
2927
+ argv_array_pushf ( & env , "GIT_DIFF_PATH_TOTAL =%d" , q -> nr );
2928
+
2929
+ if ( run_command_v_opt_cd_env ( argv . argv , RUN_USING_SHELL , NULL , env . argv ))
2930
+ die ( _ ( "external diff died, stopping at %s" ), name );
2933
2931
2934
- retval = run_command_v_opt_cd_env (argv .argv , RUN_USING_SHELL , NULL , env );
2935
2932
remove_tempfile ();
2936
2933
argv_array_clear (& argv );
2937
- if (retval ) {
2938
- fprintf (stderr , "external diff died, stopping at %s.\n" , name );
2939
- exit (1 );
2940
- }
2934
+ argv_array_clear (& env );
2941
2935
}
2942
2936
2943
2937
static int similarity_index (struct diff_filepair * p )
0 commit comments