Commit 5fdc41e76591aebdbae3b49440bc2c8b2430718c

Russell Belfer 2012-08-22T13:57:57

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.

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) {