Skip to content

Commit f59f096

Browse files
Merge pull request #670 from libgit2/arthur/fix-tree-to-tree-diff
Fix `Rugged::Tree.diff` with first tree being `nil`
2 parents 4b0361b + a5c45e6 commit f59f096

File tree

2 files changed

+47
-1
lines changed

2 files changed

+47
-1
lines changed

ext/rugged/rugged_tree.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,9 @@ static VALUE rb_git_diff_tree_to_tree(VALUE self, VALUE rb_repo, VALUE rb_tree,
391391
struct nogvl_diff_args args;
392392

393393
Data_Get_Struct(rb_repo, git_repository, repo);
394-
Data_Get_Struct(rb_tree, git_tree, tree);
394+
395+
if(RTEST(rb_tree))
396+
Data_Get_Struct(rb_tree, git_tree, tree);
395397

396398
if(RTEST(rb_other_tree))
397399
Data_Get_Struct(rb_other_tree, git_tree, other_tree);

test/diff_test.rb

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1188,6 +1188,50 @@ def test_other_is_wrong_type
11881188
assert_equal "A Rugged::Commit, Rugged::Tree or Rugged::Index instance is required", ex.message
11891189
end
11901190

1191+
def test_self_is_nil_other_is_tree_does_not_fail
1192+
repo = FixtureRepo.from_libgit2("diff")
1193+
1194+
a = repo.lookup("d70d245ed97ed2aa596dd1af6536e4bfdb047b69")
1195+
1196+
diff = Rugged::Tree.diff(repo, nil, a.tree)
1197+
assert_equal 2, diff.size
1198+
assert_equal 2, diff.deltas.size
1199+
1200+
delta = diff.deltas[0]
1201+
assert_equal({
1202+
oid: "0000000000000000000000000000000000000000",
1203+
path: "another.txt",
1204+
size: 0,
1205+
flags: 4,
1206+
mode: 0
1207+
}, delta.old_file)
1208+
1209+
assert_equal({
1210+
oid: "3e5bcbad2a68e5bc60a53b8388eea53a1a7ab847",
1211+
path: "another.txt",
1212+
size: 0,
1213+
flags: 12,
1214+
mode: 0100644
1215+
}, delta.new_file)
1216+
1217+
delta = diff.deltas[1]
1218+
assert_equal({
1219+
oid: "0000000000000000000000000000000000000000",
1220+
path: "readme.txt",
1221+
size: 0,
1222+
flags: 4,
1223+
mode: 0
1224+
}, delta.old_file)
1225+
1226+
assert_equal({
1227+
oid: "7b808f723a8ca90df319682c221187235af76693",
1228+
path: "readme.txt",
1229+
size: 0,
1230+
flags: 12,
1231+
mode: 0100644
1232+
}, delta.new_file)
1233+
end
1234+
11911235
def test_other_tree_is_an_index_but_tree_is_nil
11921236
repo = FixtureRepo.from_libgit2("diff")
11931237

0 commit comments

Comments
 (0)