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. Changes since v1: * Split changes into 3 commits. The first commit is removal of git rev-parse in the test above the ones I'm adding. The second is wrapping the "added with --lock" string with _() to mark it for translation. The third commit is the main change. * Reworked the if-else-if-else to if-else if-else * Added test_when_finished ... command to unlock the working tree * Changed test_expect_failure to test_expect_success and embedded test_must_fail and test_path_is_missing commands Note: I don't see how to disambiguate --lock with no --reason from no --lock at all. I still think that the original keep_locked boolean is needed along with the new lock_reason char array. If I don't add lock_reason and change keep_locked to a char array, it will start as NULL. But it will remain NULL if --lock alone is given or if --lock isn't given at all. Stephen Manz (3): t2400: remove unneeded `git rev-parse` from '"add" worktree with lock' test worktree: default lock string should be marked with `_()` for translation worktree: teach `add` to accept --reason <string> with --lock Documentation/git-worktree.txt | 4 ++-- builtin/worktree.c | 9 ++++++++- t/t2400-worktree-add.sh | 14 +++++++++++++- 3 files changed, 23 insertions(+), 4 deletions(-) base-commit: 670b81a890388c60b7032a4f5b879f2ece8c4558 Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-992%2FSRManz%2Flock_reason-v2 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-992/SRManz/lock_reason-v2 Pull-Request: https://github.com/gitgitgadget/git/pull/992 Range-diff vs v1: -: ----------- > 1: 5459e5bb421 t2400: remove unneeded `git rev-parse` from '"add" worktree with lock' test -: ----------- > 2: 30196cc9369 worktree: default lock string should be marked with `_()` for translation 1: 233a580b212 ! 3: 4d17b31921a worktree: teach `add` to accept --reason <string> with --lock @@ builtin/worktree.c: struct add_opts { static int show_only; @@ builtin/worktree.c: static int add_worktree(const char *path, const char *refname, - * after the preparation is over. - */ strbuf_addf(&sb, "%s/locked", sb_repo.buf); -- if (!opts->keep_locked) -+ if (!opts->keep_locked) { + if (!opts->keep_locked) write_file(sb.buf, "initializing"); -- else -- write_file(sb.buf, "added with --lock"); -+ } -+ else { -+ if (opts->lock_reason) -+ write_file(sb.buf, "%s", opts->lock_reason); -+ else -+ write_file(sb.buf, _("added with --lock")); -+ } ++ else if (opts->lock_reason) ++ write_file(sb.buf, "%s", opts->lock_reason); + else + write_file(sb.buf, _("added with --lock")); - strbuf_addf(&sb_git, "%s/.git", path); - if (safe_create_leading_directories_const(sb_git.buf)) @@ builtin/worktree.c: 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")), @@ builtin/worktree.c: static int add(int ac, const char **av, const char *prefix) ## t/t2400-worktree-add.sh ## -@@ t/t2400-worktree-add.sh: test_expect_success '"add" worktree' ' - ' - - test_expect_success '"add" worktree with lock' ' -- git rev-parse HEAD >expect && - git worktree add --detach --lock here-with-lock main && +@@ t/t2400-worktree-add.sh: 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_failure '"add" worktree with reason but no lock' ' -+ git worktree add --detach --reason "why not" here-with-reason-only main && -+ test -f .git/worktrees/here-with-reason-only/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' ' -- gitgitgadget