@@ -203,9 +203,10 @@ ERL_NIF_TERM
203
203
geef_diff_tree (ErlNifEnv * env , int argc , const ERL_NIF_TERM argv [])
204
204
{
205
205
int error ;
206
+ int nums_of_null_tree = 0 ;
206
207
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 ;
209
210
geef_diff * diff ;
210
211
git_diff_options diff_opts ;
211
212
ERL_NIF_TERM diff_term ;
@@ -214,17 +215,27 @@ geef_diff_tree(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
214
215
return enif_make_badarg (env );
215
216
216
217
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 ;
218
219
219
220
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
+ }
221
226
222
227
diff = enif_alloc_resource (geef_diff_type , sizeof (geef_diff ));
223
228
if (!diff )
224
229
return geef_oom (env );
225
230
226
231
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
+
228
239
if (error < 0 ) {
229
240
enif_release_resource (diff );
230
241
return geef_error_struct (env , error );
0 commit comments