diff options
author | Junio C Hamano <gitster@pobox.com> | 2019-01-19 00:49:54 +0300 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2019-01-19 00:49:54 +0300 |
commit | 726f89c2dd9c909f990eedf65d2519a043e5ad03 (patch) | |
tree | 1711e9818904abf56b8f94ab4bdf44c36e08bd52 /builtin | |
parent | bb20dbbc2089b33bd3ed83fb700fa5dfe76a5c0e (diff) | |
parent | 00a6d4d1d2260a07ca1372acfae692d9821f165f (diff) |
Merge branch 'nd/worktree-remove-with-uninitialized-submodules'
"git worktree remove" and "git worktree move" refused to work when
there is a submodule involved. This has been loosened to ignore
uninitialized submodules.
* nd/worktree-remove-with-uninitialized-submodules:
worktree: allow to (re)move worktrees with uninitialized submodules
Diffstat (limited to 'builtin')
-rw-r--r-- | builtin/worktree.c | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/builtin/worktree.c b/builtin/worktree.c index 5e840261772..3f9907fcc99 100644 --- a/builtin/worktree.c +++ b/builtin/worktree.c @@ -9,6 +9,7 @@ #include "refs.h" #include "run-command.h" #include "sigchain.h" +#include "submodule.h" #include "refs.h" #include "utf8.h" #include "worktree.h" @@ -724,20 +725,36 @@ static int unlock_worktree(int ac, const char **av, const char *prefix) static void validate_no_submodules(const struct worktree *wt) { struct index_state istate = { NULL }; + struct strbuf path = STRBUF_INIT; int i, found_submodules = 0; - if (read_index_from(&istate, worktree_git_path(wt, "index"), - get_worktree_git_dir(wt)) > 0) { + if (is_directory(worktree_git_path(wt, "modules"))) { + /* + * There could be false positives, e.g. the "modules" + * directory exists but is empty. But it's a rare case and + * this simpler check is probably good enough for now. + */ + found_submodules = 1; + } else if (read_index_from(&istate, worktree_git_path(wt, "index"), + get_worktree_git_dir(wt)) > 0) { for (i = 0; i < istate.cache_nr; i++) { struct cache_entry *ce = istate.cache[i]; + int err; - if (S_ISGITLINK(ce->ce_mode)) { - found_submodules = 1; - break; - } + if (!S_ISGITLINK(ce->ce_mode)) + continue; + + strbuf_reset(&path); + strbuf_addf(&path, "%s/%s", wt->path, ce->name); + if (!is_submodule_populated_gently(path.buf, &err)) + continue; + + found_submodules = 1; + break; } } discard_index(&istate); + strbuf_release(&path); if (found_submodules) die(_("working trees containing submodules cannot be moved or removed")); |