summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell Belfer <rb@github.com>2013-06-29 13:20:45 -0700
committerRussell Belfer <rb@github.com>2013-07-10 12:14:13 -0700
commit2e3e273e33894bc1089cfc09d89bd2cb144b108d (patch)
tree832f6867648828164eae1bf3beb42cde4da88943
parent1aad6137d218830bc280c4327595182019164515 (diff)
downloadlibgit2-2e3e273e33894bc1089cfc09d89bd2cb144b108d.tar.gz
Update diff to new internal submodule status API
Submodules now expose an internal status API that allows diff to get back the OID values from the submodule very easily and also to avoiding caching issues and to override the ignore setting for the submodule.
-rw-r--r--src/diff.c14
-rw-r--r--tests-clar/diff/submodules.c7
2 files changed, 8 insertions, 13 deletions
diff --git a/src/diff.c b/src/diff.c
index cc7be451f..2b018188e 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -13,6 +13,7 @@
#include "pathspec.h"
#include "index.h"
#include "odb.h"
+#include "submodule.h"
#define DIFF_FLAG_IS_SET(DIFF,FLAG) (((DIFF)->opts.flags & (FLAG)) != 0)
#define DIFF_FLAG_ISNT_SET(DIFF,FLAG) (((DIFF)->opts.flags & (FLAG)) == 0)
@@ -595,7 +596,6 @@ static int maybe_modified_submodule(
int error = 0;
git_submodule *sub;
unsigned int sm_status = 0;
- const git_oid *sm_oid;
*status = GIT_DELTA_UNMODIFIED;
@@ -603,7 +603,9 @@ static int maybe_modified_submodule(
!(error = git_submodule_lookup(
&sub, diff->repo, info->nitem->path)) &&
git_submodule_ignore(sub) != GIT_SUBMODULE_IGNORE_ALL &&
- !(error = git_submodule_status(&sm_status, sub)))
+ !(error = git_submodule__status(
+ &sm_status, NULL, NULL, found_oid, sub,
+ GIT_SUBMODULE_IGNORE_DEFAULT)))
{
/* check IS_WD_UNMODIFIED because this case is only used
* when the new side of the diff is the working directory
@@ -611,10 +613,10 @@ static int maybe_modified_submodule(
if (!GIT_SUBMODULE_STATUS_IS_WD_UNMODIFIED(sm_status))
*status = GIT_DELTA_MODIFIED;
- /* grab OID while we are here */
- if (git_oid_iszero(&info->nitem->oid) &&
- (sm_oid = git_submodule_wd_id(sub)) != NULL)
- git_oid_cpy(found_oid, sm_oid);
+ /* now that we have a HEAD OID, check if HEAD moved */
+ if ((sm_status & GIT_SUBMODULE_STATUS_IN_WD) != 0 &&
+ !git_oid_equal(&info->oitem->oid, found_oid))
+ *status = GIT_DELTA_MODIFIED;
}
/* GIT_EEXISTS means a dir with .git in it was found - ignore it */
diff --git a/tests-clar/diff/submodules.c b/tests-clar/diff/submodules.c
index c94fd57c6..4a40affb2 100644
--- a/tests-clar/diff/submodules.c
+++ b/tests-clar/diff/submodules.c
@@ -333,8 +333,6 @@ void test_diff_submodules__invalid_cache(void)
check_diff_patches(diff, expected_unchanged);
git_diff_list_free(diff);
- sleep(2);
-
/* commit changed index of submodule */
{
git_object *parent;
@@ -357,11 +355,6 @@ void test_diff_submodules__invalid_cache(void)
git_signature_free(sig);
}
- /* THIS RELOAD SHOULD NOT BE REQUIRED
- cl_git_pass(git_submodule_reload_all(g_repo));
- cl_git_pass(git_submodule_lookup(&sm, g_repo, smpath));
- */
-
git_submodule_set_ignore(sm, GIT_SUBMODULE_IGNORE_DIRTY);
cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts));