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;
|
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);
|
||||||
|
@ -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"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
32
submodule.c
32
submodule.c
@ -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)
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user