@@ -204,27 +204,31 @@ geef_diff_tree(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
204204{
205205 int error ;
206206 geef_repository * repo ;
207- geef_object * old_tree ;
208- geef_object * new_tree ;
207+ geef_object * old_tree = NULL ;
208+ geef_object * new_tree = NULL ;
209209 geef_diff * diff ;
210210 git_diff_options diff_opts ;
211211 ERL_NIF_TERM diff_term ;
212212
213213 if (!enif_get_resource (env , argv [0 ], geef_repository_type , (void * * ) & repo ))
214214 return enif_make_badarg (env );
215215
216- if (!enif_get_resource (env , argv [1 ], geef_object_type , (void * * ) & old_tree ))
217- return enif_make_badarg (env );
218-
219- if (!enif_get_resource (env , argv [2 ], geef_object_type , (void * * ) & new_tree ))
216+ if (!enif_get_resource (env , argv [1 ], geef_object_type , (void * * ) & old_tree ) &&
217+ !enif_get_resource (env , argv [2 ], geef_object_type , (void * * ) & new_tree ))
220218 return enif_make_badarg (env );
221219
222220 diff = enif_alloc_resource (geef_diff_type , sizeof (geef_diff ));
223221 if (!diff )
224222 return geef_oom (env );
225223
226224 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 );
225+
226+ if (old_tree == NULL || new_tree == NULL ) {
227+ 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 );
228+ } else {
229+ error = git_diff_tree_to_tree (& diff -> diff , repo -> repo , (git_tree * )old_tree -> obj , (git_tree * )new_tree -> obj , & diff_opts );
230+ }
231+
228232 if (error < 0 ) {
229233 enif_release_resource (diff );
230234 return geef_error_struct (env , error );
0 commit comments