]> git.ipfire.org Git - thirdparty/git.git/blobdiff - builtin/worktree.c
Merge branch 'ja/misc-doc-fixes'
[thirdparty/git.git] / builtin / worktree.c
index 8bfb79f3a5febca79a81eb41c407b7e173c766ba..99abaeec6c6edcb5a16e0d5e7439981f81561319 100644 (file)
@@ -4,7 +4,7 @@
 #include "builtin.h"
 #include "dir.h"
 #include "parse-options.h"
-#include "argv-array.h"
+#include "strvec.h"
 #include "branch.h"
 #include "refs.h"
 #include "run-command.h"
@@ -316,7 +316,7 @@ static int add_worktree(const char *path, const char *refname,
        struct strbuf sb = STRBUF_INIT, realpath = STRBUF_INIT;
        const char *name;
        struct child_process cp = CHILD_PROCESS_INIT;
-       struct argv_array child_env = ARGV_ARRAY_INIT;
+       struct strvec child_env = STRVEC_INIT;
        unsigned int counter = 0;
        int len, ret;
        struct strbuf symref = STRBUF_INIT;
@@ -408,32 +408,32 @@ static int add_worktree(const char *path, const char *refname,
        strbuf_addf(&sb, "%s/commondir", sb_repo.buf);
        write_file(sb.buf, "../..");
 
-       argv_array_pushf(&child_env, "%s=%s", GIT_DIR_ENVIRONMENT, sb_git.buf);
-       argv_array_pushf(&child_env, "%s=%s", GIT_WORK_TREE_ENVIRONMENT, path);
+       strvec_pushf(&child_env, "%s=%s", GIT_DIR_ENVIRONMENT, sb_git.buf);
+       strvec_pushf(&child_env, "%s=%s", GIT_WORK_TREE_ENVIRONMENT, path);
        cp.git_cmd = 1;
 
        if (!is_branch)
-               argv_array_pushl(&cp.args, "update-ref", "HEAD",
-                                oid_to_hex(&commit->object.oid), NULL);
+               strvec_pushl(&cp.args, "update-ref", "HEAD",
+                            oid_to_hex(&commit->object.oid), NULL);
        else {
-               argv_array_pushl(&cp.args, "symbolic-ref", "HEAD",
-                                symref.buf, NULL);
+               strvec_pushl(&cp.args, "symbolic-ref", "HEAD",
+                            symref.buf, NULL);
                if (opts->quiet)
-                       argv_array_push(&cp.args, "--quiet");
+                       strvec_push(&cp.args, "--quiet");
        }
 
-       cp.env = child_env.argv;
+       cp.env = child_env.v;
        ret = run_command(&cp);
        if (ret)
                goto done;
 
        if (opts->checkout) {
                cp.argv = NULL;
-               argv_array_clear(&cp.args);
-               argv_array_pushl(&cp.args, "reset", "--hard", "--no-recurse-submodules", NULL);
+               strvec_clear(&cp.args);
+               strvec_pushl(&cp.args, "reset", "--hard", "--no-recurse-submodules", NULL);
                if (opts->quiet)
-                       argv_array_push(&cp.args, "--quiet");
-               cp.env = child_env.argv;
+                       strvec_push(&cp.args, "--quiet");
+               cp.env = child_env.v;
                ret = run_command(&cp);
                if (ret)
                        goto done;
@@ -465,15 +465,15 @@ done:
                        cp.env = env;
                        cp.argv = NULL;
                        cp.trace2_hook_name = "post-checkout";
-                       argv_array_pushl(&cp.args, absolute_path(hook),
-                                        oid_to_hex(&null_oid),
-                                        oid_to_hex(&commit->object.oid),
-                                        "1", NULL);
+                       strvec_pushl(&cp.args, absolute_path(hook),
+                                    oid_to_hex(&null_oid),
+                                    oid_to_hex(&commit->object.oid),
+                                    "1", NULL);
                        ret = run_command(&cp);
                }
        }
 
-       argv_array_clear(&child_env);
+       strvec_clear(&child_env);
        strbuf_release(&sb);
        strbuf_release(&symref);
        strbuf_release(&sb_repo);
@@ -555,7 +555,7 @@ static int add(int ac, const char **av, const char *prefix)
                           N_("create a new branch")),
                OPT_STRING('B', NULL, &new_branch_force, N_("branch"),
                           N_("create or reset a branch")),
-               OPT_BOOL(0, "detach", &opts.detach, N_("detach HEAD at named commit")),
+               OPT_BOOL('d', "detach", &opts.detach, N_("detach HEAD at named commit")),
                OPT_BOOL(0, "checkout", &opts.checkout, N_("populate the new working tree")),
                OPT_BOOL(0, "lock", &opts.keep_locked, N_("keep the new working tree locked")),
                OPT__QUIET(&opts.quiet, N_("suppress progress reporting")),
@@ -619,15 +619,15 @@ static int add(int ac, const char **av, const char *prefix)
        if (new_branch) {
                struct child_process cp = CHILD_PROCESS_INIT;
                cp.git_cmd = 1;
-               argv_array_push(&cp.args, "branch");
+               strvec_push(&cp.args, "branch");
                if (new_branch_force)
-                       argv_array_push(&cp.args, "--force");
+                       strvec_push(&cp.args, "--force");
                if (opts.quiet)
-                       argv_array_push(&cp.args, "--quiet");
-               argv_array_push(&cp.args, new_branch);
-               argv_array_push(&cp.args, branch);
+                       strvec_push(&cp.args, "--quiet");
+               strvec_push(&cp.args, new_branch);
+               strvec_push(&cp.args, branch);
                if (opt_track)
-                       argv_array_push(&cp.args, opt_track);
+                       strvec_push(&cp.args, opt_track);
                if (run_command(&cp))
                        return -1;
                branch = new_branch;
@@ -935,13 +935,13 @@ static void check_clean_worktree(struct worktree *wt,
        validate_no_submodules(wt);
 
        child_process_init(&cp);
-       argv_array_pushf(&cp.env_array, "%s=%s/.git",
-                        GIT_DIR_ENVIRONMENT, wt->path);
-       argv_array_pushf(&cp.env_array, "%s=%s",
-                        GIT_WORK_TREE_ENVIRONMENT, wt->path);
-       argv_array_pushl(&cp.args, "status",
-                        "--porcelain", "--ignore-submodules=none",
-                        NULL);
+       strvec_pushf(&cp.env_array, "%s=%s/.git",
+                    GIT_DIR_ENVIRONMENT, wt->path);
+       strvec_pushf(&cp.env_array, "%s=%s",
+                    GIT_WORK_TREE_ENVIRONMENT, wt->path);
+       strvec_pushl(&cp.args, "status",
+                    "--porcelain", "--ignore-submodules=none",
+                    NULL);
        cp.git_cmd = 1;
        cp.dir = wt->path;
        cp.out = -1;
@@ -1028,6 +1028,34 @@ static int remove_worktree(int ac, const char **av, const char *prefix)
        return ret;
 }
 
+static void report_repair(int iserr, const char *path, const char *msg, void *cb_data)
+{
+       if (!iserr) {
+               printf_ln(_("repair: %s: %s"), msg, path);
+       } else {
+               int *exit_status = (int *)cb_data;
+               fprintf_ln(stderr, _("error: %s: %s"), msg, path);
+               *exit_status = 1;
+       }
+}
+
+static int repair(int ac, const char **av, const char *prefix)
+{
+       const char **p;
+       const char *self[] = { ".", NULL };
+       struct option options[] = {
+               OPT_END()
+       };
+       int rc = 0;
+
+       ac = parse_options(ac, av, prefix, options, worktree_usage, 0);
+       repair_worktrees(report_repair, &rc);
+       p = ac > 0 ? av : self;
+       for (; *p; p++)
+               repair_worktree_at_path(*p, report_repair, &rc);
+       return rc;
+}
+
 int cmd_worktree(int ac, const char **av, const char *prefix)
 {
        struct option options[] = {
@@ -1054,5 +1082,7 @@ int cmd_worktree(int ac, const char **av, const char *prefix)
                return move_worktree(ac - 1, av + 1, prefix);
        if (!strcmp(av[1], "remove"))
                return remove_worktree(ac - 1, av + 1, prefix);
+       if (!strcmp(av[1], "repair"))
+               return repair(ac - 1, av + 1, prefix);
        usage_with_options(worktree_usage, options);
 }