Commit 2e3e273e by Russell Belfer

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.
parent 1aad6137
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "pathspec.h" #include "pathspec.h"
#include "index.h" #include "index.h"
#include "odb.h" #include "odb.h"
#include "submodule.h"
#define DIFF_FLAG_IS_SET(DIFF,FLAG) (((DIFF)->opts.flags & (FLAG)) != 0) #define DIFF_FLAG_IS_SET(DIFF,FLAG) (((DIFF)->opts.flags & (FLAG)) != 0)
#define DIFF_FLAG_ISNT_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( ...@@ -595,7 +596,6 @@ static int maybe_modified_submodule(
int error = 0; int error = 0;
git_submodule *sub; git_submodule *sub;
unsigned int sm_status = 0; unsigned int sm_status = 0;
const git_oid *sm_oid;
*status = GIT_DELTA_UNMODIFIED; *status = GIT_DELTA_UNMODIFIED;
...@@ -603,7 +603,9 @@ static int maybe_modified_submodule( ...@@ -603,7 +603,9 @@ static int maybe_modified_submodule(
!(error = git_submodule_lookup( !(error = git_submodule_lookup(
&sub, diff->repo, info->nitem->path)) && &sub, diff->repo, info->nitem->path)) &&
git_submodule_ignore(sub) != GIT_SUBMODULE_IGNORE_ALL && 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 /* check IS_WD_UNMODIFIED because this case is only used
* when the new side of the diff is the working directory * when the new side of the diff is the working directory
...@@ -611,10 +613,10 @@ static int maybe_modified_submodule( ...@@ -611,10 +613,10 @@ static int maybe_modified_submodule(
if (!GIT_SUBMODULE_STATUS_IS_WD_UNMODIFIED(sm_status)) if (!GIT_SUBMODULE_STATUS_IS_WD_UNMODIFIED(sm_status))
*status = GIT_DELTA_MODIFIED; *status = GIT_DELTA_MODIFIED;
/* grab OID while we are here */ /* now that we have a HEAD OID, check if HEAD moved */
if (git_oid_iszero(&info->nitem->oid) && if ((sm_status & GIT_SUBMODULE_STATUS_IN_WD) != 0 &&
(sm_oid = git_submodule_wd_id(sub)) != NULL) !git_oid_equal(&info->oitem->oid, found_oid))
git_oid_cpy(found_oid, sm_oid); *status = GIT_DELTA_MODIFIED;
} }
/* GIT_EEXISTS means a dir with .git in it was found - ignore it */ /* GIT_EEXISTS means a dir with .git in it was found - ignore it */
......
...@@ -333,8 +333,6 @@ void test_diff_submodules__invalid_cache(void) ...@@ -333,8 +333,6 @@ void test_diff_submodules__invalid_cache(void)
check_diff_patches(diff, expected_unchanged); check_diff_patches(diff, expected_unchanged);
git_diff_list_free(diff); git_diff_list_free(diff);
sleep(2);
/* commit changed index of submodule */ /* commit changed index of submodule */
{ {
git_object *parent; git_object *parent;
...@@ -357,11 +355,6 @@ void test_diff_submodules__invalid_cache(void) ...@@ -357,11 +355,6 @@ void test_diff_submodules__invalid_cache(void)
git_signature_free(sig); 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); git_submodule_set_ignore(sm, GIT_SUBMODULE_IGNORE_DIRTY);
cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts)); cl_git_pass(git_diff_index_to_workdir(&diff, g_repo, NULL, &opts));
......
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