worktree move: refuse to move worktrees with submodules

Submodules contains .git files with relative paths. After a worktree
move, these files need to be updated or they may point to nowhere.

This is a bandage patch to make sure "worktree move" don't break
people's worktrees by accident. When .git file update code is in
place, this validate_no_submodules() could be removed.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Nguyễn Thái Ngọc Duy 2018-02-12 16:49:38 +07:00 committed by Junio C Hamano
parent c64a8d200f
commit 78d986b252
2 changed files with 24 additions and 1 deletions

View file

@ -79,7 +79,7 @@ with `--reason`.
move::
Move a working tree to a new location. Note that the main working tree
cannot be moved.
or linked working trees containing submodules cannot be moved.
prune::

View file

@ -606,6 +606,27 @@ static int unlock_worktree(int ac, const char **av, const char *prefix)
return ret;
}
static void validate_no_submodules(const struct worktree *wt)
{
struct index_state istate = { NULL };
int i, found_submodules = 0;
if (read_index_from(&istate, worktree_git_path(wt, "index")) > 0) {
for (i = 0; i < istate.cache_nr; i++) {
struct cache_entry *ce = istate.cache[i];
if (S_ISGITLINK(ce->ce_mode)) {
found_submodules = 1;
break;
}
}
}
discard_index(&istate);
if (found_submodules)
die(_("working trees containing submodules cannot be moved"));
}
static int move_worktree(int ac, const char **av, const char *prefix)
{
struct option options[] = {
@ -643,6 +664,8 @@ static int move_worktree(int ac, const char **av, const char *prefix)
if (file_exists(dst.buf))
die(_("target '%s' already exists"), dst.buf);
validate_no_submodules(wt);
reason = is_worktree_locked(wt);
if (reason) {
if (*reason)