Commit c8a39f9ee3ce8aa73a489b72006f0e3c27cc5911

Russell Belfer 2013-06-27T11:11:12

Merge pull request #1684 from libgit2/fix-dirty-submodule-diff Dirty submodules do not correctly appear in diffs

diff --git a/src/diff_patch.c b/src/diff_patch.c
index 9060d0a..1b4adac 100644
--- a/src/diff_patch.c
+++ b/src/diff_patch.c
@@ -10,6 +10,7 @@
 #include "diff_driver.h"
 #include "diff_patch.h"
 #include "diff_xdiff.h"
+#include "fileops.h"
 
 /* cached information about a single span in a diff */
 typedef struct diff_patch_line diff_patch_line;
@@ -175,9 +176,12 @@ static int diff_patch_load(git_diff_patch *patch, git_diff_output *output)
 			goto cleanup;
 	}
 
-	/* if we were previously missing an oid, update MODIFIED->UNMODIFIED */
+	/* if previously missing an oid, and now that we have it the two sides
+	 * are the same (and not submodules), update MODIFIED -> UNMODIFIED
+	 */
 	if (incomplete_data &&
 		patch->ofile.file->mode == patch->nfile.file->mode &&
+		patch->ofile.file->mode != GIT_FILEMODE_COMMIT &&
 		git_oid_equal(&patch->ofile.file->oid, &patch->nfile.file->oid) &&
 		patch->delta->status == GIT_DELTA_MODIFIED) /* not RENAMED/COPIED! */
 		patch->delta->status = GIT_DELTA_UNMODIFIED;
diff --git a/tests-clar/diff/submodules.c b/tests-clar/diff/submodules.c
index 6e52a63..5de4673 100644
--- a/tests-clar/diff/submodules.c
+++ b/tests-clar/diff/submodules.c
@@ -47,8 +47,10 @@ static void check_diff_patches(git_diff_list *diff, const char **expected)
 	for (d = 0; d < num_d; ++d, git_diff_patch_free(patch)) {
 		cl_git_pass(git_diff_get_patch(&patch, &delta, diff, d));
 
-		if (delta->status == GIT_DELTA_UNMODIFIED)
+		if (delta->status == GIT_DELTA_UNMODIFIED) {
+			cl_assert(expected[d] == NULL);
 			continue;
+		}
 
 		if (expected[d] && !strcmp(expected[d], "<SKIP>"))
 			continue;