Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@gmail.com>
---
 builtin/worktree.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 45 insertions(+)

diff --git a/builtin/worktree.c b/builtin/worktree.c
index 3ebb9e9..80a8b80 100644
--- a/builtin/worktree.c
+++ b/builtin/worktree.c
@@ -477,9 +477,52 @@ static int list(int ac, const char **av, const char 
*prefix)
        return 0;
 }
 
+static int move_gitdir(int ac, const char **av, const char *prefix)
+{
+       struct string_list paths = STRING_LIST_INIT_NODUP;
+       struct strbuf dst = STRBUF_INIT;
+       struct strbuf src = STRBUF_INIT;
+       struct worktree **worktrees, *mwt = NULL;
+       int i, ret = 0;
+
+       if (ac != 1)
+               die(_("--repository requires one argument"));
+
+       strbuf_addstr(&src, real_path(get_git_common_dir()));
+       strbuf_addstr(&dst, real_path(prefix_filename(prefix, strlen(prefix), 
av[0])));
+
+       worktrees = get_worktrees();
+       for (i = 0; worktrees[i]; i++) {
+               if (is_main_worktree(worktrees[i]))
+                       mwt = worktrees[i];
+               string_list_append(&paths,
+                                  get_worktree_git_dir(worktrees[i]));
+       }
+
+       if (mwt)
+               die(_("converting main worktree is not supported"));
+
+       ret = copy_dir_recursively(src.buf, dst.buf);
+       if (ret)
+               die(_("failed to copy '%s' to '%s'"), src.buf, dst.buf);
+
+       for (i = 0; paths.nr; i++)
+               if (update_worktree_gitfile(paths.items[i].string, dst.buf,
+                                           worktrees[i]->id))
+                       ret = -1;
+
+       if (!ret)
+               ret = remove_dir_recursively(&src, 0);
+
+       string_list_clear(&paths, 0);
+       return ret;
+}
+
 static int move(int ac, const char **av, const char *prefix)
 {
+       int move_repo = 0;
        struct option options[] = {
+               OPT_BOOL(0, "repository", &move_repo, N_("move repository")),
                OPT_END()
        };
        struct worktree **worktrees, *wt;
@@ -487,6 +530,8 @@ static int move(int ac, const char **av, const char *prefix)
        struct strbuf src = STRBUF_INIT;
 
        ac = parse_options(ac, av, prefix, options, worktree_usage, 0);
+       if (move_repo)
+               return move_gitdir(ac, av, prefix);
        if (ac != 2)
                usage_with_options(worktree_usage, options);
 
-- 
2.7.0.377.g4cd97dd

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to