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:
@ -9,6 +9,7 @@
|
|||||||
#include "refs.h"
|
#include "refs.h"
|
||||||
#include "run-command.h"
|
#include "run-command.h"
|
||||||
#include "sigchain.h"
|
#include "sigchain.h"
|
||||||
|
#include "submodule.h"
|
||||||
#include "refs.h"
|
#include "refs.h"
|
||||||
#include "utf8.h"
|
#include "utf8.h"
|
||||||
#include "worktree.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)
|
static void validate_no_submodules(const struct worktree *wt)
|
||||||
{
|
{
|
||||||
struct index_state istate = { NULL };
|
struct index_state istate = { NULL };
|
||||||
|
struct strbuf path = STRBUF_INIT;
|
||||||
int i, found_submodules = 0;
|
int i, found_submodules = 0;
|
||||||
|
|
||||||
if (read_index_from(&istate, worktree_git_path(wt, "index"),
|
if (is_directory(worktree_git_path(wt, "modules"))) {
|
||||||
get_worktree_git_dir(wt)) > 0) {
|
/*
|
||||||
|
* 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++) {
|
for (i = 0; i < istate.cache_nr; i++) {
|
||||||
struct cache_entry *ce = istate.cache[i];
|
struct cache_entry *ce = istate.cache[i];
|
||||||
|
int err;
|
||||||
|
|
||||||
if (S_ISGITLINK(ce->ce_mode)) {
|
if (!S_ISGITLINK(ce->ce_mode))
|
||||||
found_submodules = 1;
|
continue;
|
||||||
break;
|
|
||||||
}
|
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);
|
discard_index(&istate);
|
||||||
|
strbuf_release(&path);
|
||||||
|
|
||||||
if (found_submodules)
|
if (found_submodules)
|
||||||
die(_("working trees containing submodules cannot be moved or removed"));
|
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
|
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_expect_success 'remove main worktree' '
|
||||||
test_must_fail git worktree remove .
|
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
|
test_done
|
||||||
|
Reference in New Issue
Block a user