Commit c67ff958 by Russell Belfer

Fix bug marking submodule diffs as unmodified

There was a bug where submodules whose HEAD had not been moved
were being marked as having an UNMODIFIED delta record instead
of being left MODIFIED.  This fixes that and fixes the tests to
notice if a submodule has been incorrectly marked as UNMODIFIED.
parent c7974b49
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "diff_driver.h" #include "diff_driver.h"
#include "diff_patch.h" #include "diff_patch.h"
#include "diff_xdiff.h" #include "diff_xdiff.h"
#include "fileops.h"
/* cached information about a single span in a diff */ /* cached information about a single span in a diff */
typedef struct diff_patch_line diff_patch_line; 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) ...@@ -175,9 +176,12 @@ static int diff_patch_load(git_diff_patch *patch, git_diff_output *output)
goto cleanup; 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 && if (incomplete_data &&
patch->ofile.file->mode == patch->nfile.file->mode && 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) && 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_MODIFIED) /* not RENAMED/COPIED! */
patch->delta->status = GIT_DELTA_UNMODIFIED; patch->delta->status = GIT_DELTA_UNMODIFIED;
......
...@@ -47,8 +47,10 @@ static void check_diff_patches(git_diff_list *diff, const char **expected) ...@@ -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)) { for (d = 0; d < num_d; ++d, git_diff_patch_free(patch)) {
cl_git_pass(git_diff_get_patch(&patch, &delta, diff, d)); cl_git_pass(git_diff_get_patch(&patch, &delta, diff, d));
if (delta->status == GIT_DELTA_UNMODIFIED && expected[d] == NULL) if (delta->status == GIT_DELTA_UNMODIFIED) {
cl_assert(expected[d] == NULL);
continue; continue;
}
if (expected[d] && !strcmp(expected[d], "<SKIP>")) if (expected[d] && !strcmp(expected[d], "<SKIP>"))
continue; continue;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment