From: Stephen Manz <smanz@xxxxxxxxxxxx> The default reason stored in the lock file, "added with --lock", is unlikely to be what the user would have given in a separate `git worktree lock` command. Allowing `--reason` to be specified along with `--lock` when adding a working tree gives the user control over the reason for locking without needing a second command. Signed-off-by: Stephen Manz <smanz@xxxxxxxxxxxx> --- Documentation/git-worktree.txt | 4 ++-- builtin/worktree.c | 7 +++++++ t/t2400-worktree-add.sh | 13 +++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.txt index f1bb1fa5f5a..720663746ba 100644 --- a/Documentation/git-worktree.txt +++ b/Documentation/git-worktree.txt @@ -9,7 +9,7 @@ git-worktree - Manage multiple working trees SYNOPSIS -------- [verse] -'git worktree add' [-f] [--detach] [--checkout] [--lock] [-b <new-branch>] <path> [<commit-ish>] +'git worktree add' [-f] [--detach] [--checkout] [--lock [--reason <string>]] [-b <new-branch>] <path> [<commit-ish>] 'git worktree list' [--porcelain] 'git worktree lock' [--reason <string>] <worktree> 'git worktree move' <worktree> <new-path> @@ -242,7 +242,7 @@ With `list`, annotate missing working trees as prunable if they are older than `<time>`. --reason <string>:: - With `lock`, an explanation why the working tree is locked. + With `lock` or with `add --lock`, an explanation why the working tree is locked. <worktree>:: Working trees can be identified by path, either relative or diff --git a/builtin/worktree.c b/builtin/worktree.c index 448ec69e745..074169508d0 100644 --- a/builtin/worktree.c +++ b/builtin/worktree.c @@ -31,6 +31,7 @@ struct add_opts { int quiet; int checkout; int keep_locked; + const char *lock_reason; }; static int show_only; @@ -304,6 +305,8 @@ static int add_worktree(const char *path, const char *refname, strbuf_addf(&sb, "%s/locked", sb_repo.buf); if (!opts->keep_locked) write_file(sb.buf, "initializing"); + else if (opts->lock_reason) + write_file(sb.buf, "%s", opts->lock_reason); else write_file(sb.buf, _("added with --lock")); @@ -486,6 +489,8 @@ static int add(int ac, const char **av, const char *prefix) 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_STRING(0, "reason", &opts.lock_reason, N_("string"), + N_("reason for locking")), OPT__QUIET(&opts.quiet, N_("suppress progress reporting")), OPT_PASSTHRU(0, "track", &opt_track, NULL, N_("set up tracking mode (see git-branch(1))"), @@ -500,6 +505,8 @@ static int add(int ac, const char **av, const char *prefix) ac = parse_options(ac, av, prefix, options, worktree_usage, 0); if (!!opts.detach + !!new_branch + !!new_branch_force > 1) die(_("-b, -B, and --detach are mutually exclusive")); + if (opts.lock_reason && !opts.keep_locked) + die(_("--reason requires --lock")); if (ac < 1 || ac > 2) usage_with_options(worktree_usage, options); diff --git a/t/t2400-worktree-add.sh b/t/t2400-worktree-add.sh index 874a61dbfa7..de904448e59 100755 --- a/t/t2400-worktree-add.sh +++ b/t/t2400-worktree-add.sh @@ -71,6 +71,19 @@ test_expect_success '"add" worktree with lock' ' test -f .git/worktrees/here-with-lock/locked ' +test_expect_success '"add" worktree with lock and reason' ' + git worktree add --detach --lock --reason "why not" here-with-lock-reason main && + test_when_finished "git worktree unlock here-with-lock-reason || :" && + test -f .git/worktrees/here-with-lock-reason/locked && + echo why not >expect && + test_cmp expect .git/worktrees/here-with-lock-reason/locked +' + +test_expect_success '"add" worktree with reason but no lock' ' + test_must_fail git worktree add --detach --reason "why not" here-with-reason-only main && + test_path_is_missing .git/worktrees/here-with-reason-only/locked +' + test_expect_success '"add" worktree from a subdir' ' ( mkdir sub && -- gitgitgadget