@@ -204,27 +204,31 @@ geef_diff_tree(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
204
204
{
205
205
int error ;
206
206
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 ;
209
209
geef_diff * diff ;
210
210
git_diff_options diff_opts ;
211
211
ERL_NIF_TERM diff_term ;
212
212
213
213
if (!enif_get_resource (env , argv [0 ], geef_repository_type , (void * * ) & repo ))
214
214
return enif_make_badarg (env );
215
215
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 ))
220
218
return enif_make_badarg (env );
221
219
222
220
diff = enif_alloc_resource (geef_diff_type , sizeof (geef_diff ));
223
221
if (!diff )
224
222
return geef_oom (env );
225
223
226
224
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
+
228
232
if (error < 0 ) {
229
233
enif_release_resource (diff );
230
234
return geef_error_struct (env , error );
0 commit comments