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:
parent
8fa2915971
commit
91b834807b
@ -81,7 +81,7 @@ static void prepare_move_submodule(const char *src, int first,
|
||||
struct strbuf submodule_dotgit = STRBUF_INIT;
|
||||
if (!S_ISGITLINK(active_cache[first]->ce_mode))
|
||||
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"));
|
||||
strbuf_addf(&submodule_dotgit, "%s/.git", src);
|
||||
*submodule_gitfile = read_gitfile(submodule_dotgit.buf);
|
||||
|
@ -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].is_submodule = S_ISGITLINK(ce->ce_mode);
|
||||
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"));
|
||||
}
|
||||
|
||||
|
32
submodule.c
32
submodule.c
@ -37,18 +37,25 @@ static struct oid_array ref_tips_after_fetch;
|
||||
static int gitmodules_is_unmerged;
|
||||
|
||||
/*
|
||||
* This flag is set if the .gitmodules file had unstaged modifications on
|
||||
* startup. This must be checked before allowing modifications to the
|
||||
* .gitmodules file with the intention to stage them later, because when
|
||||
* continuing we would stage the modifications the user didn't stage herself
|
||||
* too. That might change in a future version when we learn to stage the
|
||||
* changes we do ourselves without staging any previous modifications.
|
||||
* Check if the .gitmodules file has unstaged modifications. This must be
|
||||
* checked before allowing modifications to the .gitmodules file with the
|
||||
* intention to stage them later, because when continuing we would stage the
|
||||
* modifications the user didn't stage herself too. That might change in a
|
||||
* future version when we learn to stage the changes we do ourselves without
|
||||
* staging any previous modifications.
|
||||
*/
|
||||
static int gitmodules_is_modified;
|
||||
|
||||
int is_staging_gitmodules_ok(void)
|
||||
int is_staging_gitmodules_ok(const struct index_state *istate)
|
||||
{
|
||||
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))
|
||||
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)
|
||||
|
@ -33,7 +33,7 @@ struct submodule_update_strategy {
|
||||
};
|
||||
#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 remove_path_from_gitmodules(const char *path);
|
||||
extern void stage_updated_gitmodules(void);
|
||||
|
Loading…
Reference in New Issue
Block a user