1
0
mirror of https://github.com/git/git synced 2024-07-07 19:39:27 +00:00

submodule: check for unstaged .gitmodules outside of config parsing

Teach 'is_staging_gitmodules_ok()' to be able to determine in the
'.gitmodules' file has unstaged changes based on the passed in index
instead of relying on a global variable which is set during the
submodule-config parsing.

Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Brandon Williams 2017-08-02 12:49:20 -07:00 committed by Junio C Hamano
parent 8fa2915971
commit 91b834807b
4 changed files with 20 additions and 18 deletions

View File

@ -81,7 +81,7 @@ static void prepare_move_submodule(const char *src, int first,
struct strbuf submodule_dotgit = STRBUF_INIT; struct strbuf submodule_dotgit = STRBUF_INIT;
if (!S_ISGITLINK(active_cache[first]->ce_mode)) if (!S_ISGITLINK(active_cache[first]->ce_mode))
die(_("Directory %s is in index and no submodule?"), src); die(_("Directory %s is in index and no submodule?"), src);
if (!is_staging_gitmodules_ok()) if (!is_staging_gitmodules_ok(&the_index))
die(_("Please stage your changes to .gitmodules or stash them to proceed")); die(_("Please stage your changes to .gitmodules or stash them to proceed"));
strbuf_addf(&submodule_dotgit, "%s/.git", src); strbuf_addf(&submodule_dotgit, "%s/.git", src);
*submodule_gitfile = read_gitfile(submodule_dotgit.buf); *submodule_gitfile = read_gitfile(submodule_dotgit.buf);

View File

@ -286,7 +286,7 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
list.entry[list.nr].name = xstrdup(ce->name); list.entry[list.nr].name = xstrdup(ce->name);
list.entry[list.nr].is_submodule = S_ISGITLINK(ce->ce_mode); list.entry[list.nr].is_submodule = S_ISGITLINK(ce->ce_mode);
if (list.entry[list.nr++].is_submodule && if (list.entry[list.nr++].is_submodule &&
!is_staging_gitmodules_ok()) !is_staging_gitmodules_ok(&the_index))
die (_("Please stage your changes to .gitmodules or stash them to proceed")); die (_("Please stage your changes to .gitmodules or stash them to proceed"));
} }

View File

@ -37,18 +37,25 @@ static struct oid_array ref_tips_after_fetch;
static int gitmodules_is_unmerged; static int gitmodules_is_unmerged;
/* /*
* This flag is set if the .gitmodules file had unstaged modifications on * Check if the .gitmodules file has unstaged modifications. This must be
* startup. This must be checked before allowing modifications to the * checked before allowing modifications to the .gitmodules file with the
* .gitmodules file with the intention to stage them later, because when * intention to stage them later, because when continuing we would stage the
* continuing we would stage the modifications the user didn't stage herself * modifications the user didn't stage herself too. That might change in a
* too. That might change in a future version when we learn to stage the * future version when we learn to stage the changes we do ourselves without
* changes we do ourselves without staging any previous modifications. * staging any previous modifications.
*/ */
static int gitmodules_is_modified; int is_staging_gitmodules_ok(const struct index_state *istate)
int is_staging_gitmodules_ok(void)
{ {
return !gitmodules_is_modified; int pos = index_name_pos(istate, GITMODULES_FILE, strlen(GITMODULES_FILE));
if ((pos >= 0) && (pos < istate->cache_nr)) {
struct stat st;
if (lstat(GITMODULES_FILE, &st) == 0 &&
ce_match_stat(istate->cache[pos], &st, 0) & DATA_CHANGED)
return 0;
}
return 1;
} }
/* /*
@ -231,11 +238,6 @@ void gitmodules_config(void)
!memcmp(ce->name, GITMODULES_FILE, 11)) !memcmp(ce->name, GITMODULES_FILE, 11))
gitmodules_is_unmerged = 1; gitmodules_is_unmerged = 1;
} }
} else if (pos < active_nr) {
struct stat st;
if (lstat(GITMODULES_FILE, &st) == 0 &&
ce_match_stat(active_cache[pos], &st, 0) & DATA_CHANGED)
gitmodules_is_modified = 1;
} }
if (!gitmodules_is_unmerged) if (!gitmodules_is_unmerged)

View File

@ -33,7 +33,7 @@ struct submodule_update_strategy {
}; };
#define SUBMODULE_UPDATE_STRATEGY_INIT {SM_UPDATE_UNSPECIFIED, NULL} #define SUBMODULE_UPDATE_STRATEGY_INIT {SM_UPDATE_UNSPECIFIED, NULL}
extern int is_staging_gitmodules_ok(void); extern int is_staging_gitmodules_ok(const struct index_state *istate);
extern int update_path_in_gitmodules(const char *oldpath, const char *newpath); extern int update_path_in_gitmodules(const char *oldpath, const char *newpath);
extern int remove_path_from_gitmodules(const char *path); extern int remove_path_from_gitmodules(const char *path);
extern void stage_updated_gitmodules(void); extern void stage_updated_gitmodules(void);