Minor bug fixes in diff code In looking at PR #878, I found a few small bugs in the diff code, mostly related to work that can be avoided when processing tree- to-tree diffs that was always being carried out. This commit has some small fixes in it.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
diff --git a/src/diff.c b/src/diff.c
index a5bf07a..9abf8b9 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -470,7 +470,8 @@ static int maybe_modified(
/* on platforms with no symlinks, preserve mode of existing symlinks */
if (S_ISLNK(omode) && S_ISREG(nmode) &&
- !(diff->diffcaps & GIT_DIFFCAPS_HAS_SYMLINKS))
+ !(diff->diffcaps & GIT_DIFFCAPS_HAS_SYMLINKS) &&
+ new_iter->type == GIT_ITERATOR_WORKDIR)
nmode = omode;
/* on platforms with no execmode, just preserve old mode */
diff --git a/src/diff_output.c b/src/diff_output.c
index bd8e8ed..d269a4c 100644
--- a/src/diff_output.c
+++ b/src/diff_output.c
@@ -162,7 +162,7 @@ static int file_is_binary_by_attr(
mirror_new = (delta->new_file.path == delta->old_file.path ||
strcmp(delta->new_file.path, delta->old_file.path) == 0);
if (mirror_new)
- delta->new_file.flags &= (delta->old_file.flags & BINARY_DIFF_FLAGS);
+ delta->new_file.flags |= (delta->old_file.flags & BINARY_DIFF_FLAGS);
else
error = update_file_is_binary_by_attr(diff->repo, &delta->new_file);
@@ -397,6 +397,7 @@ int git_diff_foreach(
if (error < 0)
goto cleanup;
+ delta->new_file.flags |= GIT_DIFF_FILE_VALID_OID;
/* since we did not have the definitive oid, we may have
* incorrect status and need to skip this item.
diff --git a/tests-clar/diff/diff_helpers.c b/tests-clar/diff/diff_helpers.c
index 18daa08..7b39126 100644
--- a/tests-clar/diff/diff_helpers.c
+++ b/tests-clar/diff/diff_helpers.c
@@ -30,7 +30,8 @@ int diff_file_fn(
GIT_UNUSED(progress);
- e-> at_least_one_of_them_is_binary = delta->binary;
+ if (delta->binary)
+ e->at_least_one_of_them_is_binary = true;
e->files++;
switch (delta->status) {