Extend rmdir_or_warn() to remove the directories of those submodules which are scheduled for removal. Also teach verify_clean_submodule() to check that a submodule configured to be removed is not modified before scheduling it for removal. Signed-off-by: Stefan Beller <sbeller@xxxxxxxxxx> --- unpack-trees.c | 6 ++---- wrapper.c | 4 ++++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/unpack-trees.c b/unpack-trees.c index ea6bdd2..576e1d5 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -9,6 +9,7 @@ #include "refs.h" #include "attr.h" #include "split-index.h" +#include "submodule.h" #include "dir.h" /* @@ -1361,15 +1362,12 @@ static void invalidate_ce_path(const struct cache_entry *ce, /* * Check that checking out ce->sha1 in subdir ce->name is not * going to overwrite any working files. - * - * Currently, git does not checkout subprojects during a superproject - * checkout, so it is not going to overwrite anything. */ static int verify_clean_submodule(const struct cache_entry *ce, enum unpack_trees_error_types error_type, struct unpack_trees_options *o) { - return 0; + return submodule_is_interesting(ce->name, null_sha1) && is_submodule_modified(ce->name, 0); } static int verify_clean_subdirectory(const struct cache_entry *ce, diff --git a/wrapper.c b/wrapper.c index e7f1979..17c08de 100644 --- a/wrapper.c +++ b/wrapper.c @@ -2,6 +2,7 @@ * Various trivial helper wrappers around standard functions */ #include "cache.h" +#include "submodule.h" static void do_nothing(size_t size) { @@ -592,6 +593,9 @@ int unlink_or_warn(const char *file) int rmdir_or_warn(const char *file) { + if (submodule_is_interesting(file, null_sha1) + && depopulate_submodule(file)) + return -1; return warn_if_unremovable("rmdir", file, rmdir(file)); } -- 2.10.1.469.g00a8914