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
This commit is contained in:
commit
726f89c2dd
@ -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"));
|
||||
|
@ -112,6 +112,26 @@ test_expect_success 'move locked worktree (force)' '
|
||||
git worktree move --force --force flump ploof
|
||||
'
|
||||
|
||||
test_expect_success 'move a repo with uninitialized submodule' '
|
||||
git init withsub &&
|
||||
(
|
||||
cd withsub &&
|
||||
test_commit initial &&
|
||||
git submodule add "$PWD"/.git sub &&
|
||||
git commit -m withsub &&
|
||||
git worktree add second HEAD &&
|
||||
git worktree move second third
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'not move a repo with initialized submodule' '
|
||||
(
|
||||
cd withsub &&
|
||||
git -C third submodule update &&
|
||||
test_must_fail git worktree move third forth
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'remove main worktree' '
|
||||
test_must_fail git worktree remove .
|
||||
'
|
||||
@ -185,4 +205,21 @@ test_expect_success 'remove cleans up .git/worktrees when empty' '
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'remove a repo with uninitialized submodule' '
|
||||
(
|
||||
cd withsub &&
|
||||
git worktree add to-remove HEAD &&
|
||||
git worktree remove to-remove
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'not remove a repo with initialized submodule' '
|
||||
(
|
||||
cd withsub &&
|
||||
git worktree add to-remove HEAD &&
|
||||
git -C to-remove submodule update &&
|
||||
test_must_fail git worktree remove to-remove
|
||||
)
|
||||
'
|
||||
|
||||
test_done
|
||||
|
Loading…
Reference in New Issue
Block a user