diff options
author | Nguyễn Thái Ngọc Duy <pclouds@gmail.com> | 2018-02-12 16:49:38 +0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2018-02-12 13:13:35 -0800 |
commit | 78d986b252359351a579dc2629c8384d5c8eb8ff (patch) | |
tree | 92c841e91108f7fa8656c232fdf59219a3b8bd77 /builtin | |
parent | c64a8d200f4109df86c6d4716ea4da58df450e34 (diff) | |
download | git-78d986b252359351a579dc2629c8384d5c8eb8ff.tar.gz |
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>
Diffstat (limited to 'builtin')
-rw-r--r-- | builtin/worktree.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/builtin/worktree.c b/builtin/worktree.c index 6fe41313c9..4789cebe11 100644 --- a/builtin/worktree.c +++ b/builtin/worktree.c @@ -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) |