@@ -203,9 +203,10 @@ ERL_NIF_TERM
203203geef_diff_tree (ErlNifEnv * env , int argc , const ERL_NIF_TERM argv [])
204204{
205205 int error ;
206+ int nums_of_null_tree = 0 ;
206207 geef_repository * repo ;
207- geef_object * old_tree ;
208- geef_object * new_tree ;
208+ geef_object * old_tree = NULL ;
209+ geef_object * new_tree = NULL ;
209210 geef_diff * diff ;
210211 git_diff_options diff_opts ;
211212 ERL_NIF_TERM diff_term ;
@@ -214,17 +215,27 @@ geef_diff_tree(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
214215 return enif_make_badarg (env );
215216
216217 if (!enif_get_resource (env , argv [1 ], geef_object_type , (void * * ) & old_tree ))
217- return enif_make_badarg ( env ) ;
218+ nums_of_null_tree += 1 ;
218219
219220 if (!enif_get_resource (env , argv [2 ], geef_object_type , (void * * ) & new_tree ))
220- return enif_make_badarg (env );
221+ nums_of_null_tree += 1 ;
222+
223+ if (nums_of_null_tree > 1 ) {
224+ return enif_make_badarg (env );
225+ }
221226
222227 diff = enif_alloc_resource (geef_diff_type , sizeof (geef_diff ));
223228 if (!diff )
224229 return geef_oom (env );
225230
226231 diff_opts = diff_opts_atom2type (env , argv [3 ]);
227- error = git_diff_tree_to_tree (& diff -> diff , repo -> repo , (git_tree * )old_tree -> obj , (git_tree * )new_tree -> obj , & diff_opts );
232+
233+ if (old_tree == NULL || new_tree == NULL ) {
234+ error = git_diff_tree_to_tree (& diff -> diff , repo -> repo , old_tree ? (git_tree * )old_tree -> obj : NULL , new_tree ? (git_tree * )new_tree -> obj : NULL , & diff_opts );
235+ } else {
236+ error = git_diff_tree_to_tree (& diff -> diff , repo -> repo , (git_tree * )old_tree -> obj , (git_tree * )new_tree -> obj , & diff_opts );
237+ }
238+
228239 if (error < 0 ) {
229240 enif_release_resource (diff );
230241 return geef_error_struct (env , error );
0 commit comments