mirror of
https://github.com/git/git
synced 2024-08-27 11:39:22 +00:00
Merge branch 'sm/worktree-add-lock'
"git worktree add --lock" learned to record why the worktree is locked with a custom message. * sm/worktree-add-lock: worktree: teach `add` to accept --reason <string> with --lock worktree: mark lock strings with `_()` for translation t2400: clean up '"add" worktree with lock' test
This commit is contained in:
commit
01369fdfd3
|
@ -9,7 +9,7 @@ git-worktree - Manage multiple working trees
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
[verse]
|
[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 list' [--porcelain]
|
||||||
'git worktree lock' [--reason <string>] <worktree>
|
'git worktree lock' [--reason <string>] <worktree>
|
||||||
'git worktree move' <worktree> <new-path>
|
'git worktree move' <worktree> <new-path>
|
||||||
|
@ -242,7 +242,7 @@ With `list`, annotate missing working trees as prunable if they are
|
||||||
older than `<time>`.
|
older than `<time>`.
|
||||||
|
|
||||||
--reason <string>::
|
--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>::
|
<worktree>::
|
||||||
Working trees can be identified by path, either relative or
|
Working trees can be identified by path, either relative or
|
||||||
|
|
|
@ -30,7 +30,7 @@ struct add_opts {
|
||||||
int detach;
|
int detach;
|
||||||
int quiet;
|
int quiet;
|
||||||
int checkout;
|
int checkout;
|
||||||
int keep_locked;
|
const char *keep_locked;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int show_only;
|
static int show_only;
|
||||||
|
@ -302,10 +302,10 @@ static int add_worktree(const char *path, const char *refname,
|
||||||
* after the preparation is over.
|
* after the preparation is over.
|
||||||
*/
|
*/
|
||||||
strbuf_addf(&sb, "%s/locked", sb_repo.buf);
|
strbuf_addf(&sb, "%s/locked", sb_repo.buf);
|
||||||
if (!opts->keep_locked)
|
if (opts->keep_locked)
|
||||||
write_file(sb.buf, "initializing");
|
write_file(sb.buf, "%s", opts->keep_locked);
|
||||||
else
|
else
|
||||||
write_file(sb.buf, "added with --lock");
|
write_file(sb.buf, _("initializing"));
|
||||||
|
|
||||||
strbuf_addf(&sb_git, "%s/.git", path);
|
strbuf_addf(&sb_git, "%s/.git", path);
|
||||||
if (safe_create_leading_directories_const(sb_git.buf))
|
if (safe_create_leading_directories_const(sb_git.buf))
|
||||||
|
@ -475,6 +475,8 @@ static int add(int ac, const char **av, const char *prefix)
|
||||||
const char *branch;
|
const char *branch;
|
||||||
const char *new_branch = NULL;
|
const char *new_branch = NULL;
|
||||||
const char *opt_track = NULL;
|
const char *opt_track = NULL;
|
||||||
|
const char *lock_reason = NULL;
|
||||||
|
int keep_locked = 0;
|
||||||
struct option options[] = {
|
struct option options[] = {
|
||||||
OPT__FORCE(&opts.force,
|
OPT__FORCE(&opts.force,
|
||||||
N_("checkout <branch> even if already checked out in other worktree"),
|
N_("checkout <branch> even if already checked out in other worktree"),
|
||||||
|
@ -485,7 +487,9 @@ static int add(int ac, const char **av, const char *prefix)
|
||||||
N_("create or reset a branch")),
|
N_("create or reset a branch")),
|
||||||
OPT_BOOL('d', "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, "checkout", &opts.checkout, N_("populate the new working tree")),
|
||||||
OPT_BOOL(0, "lock", &opts.keep_locked, N_("keep the new working tree locked")),
|
OPT_BOOL(0, "lock", &keep_locked, N_("keep the new working tree locked")),
|
||||||
|
OPT_STRING(0, "reason", &lock_reason, N_("string"),
|
||||||
|
N_("reason for locking")),
|
||||||
OPT__QUIET(&opts.quiet, N_("suppress progress reporting")),
|
OPT__QUIET(&opts.quiet, N_("suppress progress reporting")),
|
||||||
OPT_PASSTHRU(0, "track", &opt_track, NULL,
|
OPT_PASSTHRU(0, "track", &opt_track, NULL,
|
||||||
N_("set up tracking mode (see git-branch(1))"),
|
N_("set up tracking mode (see git-branch(1))"),
|
||||||
|
@ -500,6 +504,13 @@ static int add(int ac, const char **av, const char *prefix)
|
||||||
ac = parse_options(ac, av, prefix, options, worktree_usage, 0);
|
ac = parse_options(ac, av, prefix, options, worktree_usage, 0);
|
||||||
if (!!opts.detach + !!new_branch + !!new_branch_force > 1)
|
if (!!opts.detach + !!new_branch + !!new_branch_force > 1)
|
||||||
die(_("-b, -B, and --detach are mutually exclusive"));
|
die(_("-b, -B, and --detach are mutually exclusive"));
|
||||||
|
if (lock_reason && !keep_locked)
|
||||||
|
die(_("--reason requires --lock"));
|
||||||
|
if (lock_reason)
|
||||||
|
opts.keep_locked = lock_reason;
|
||||||
|
else if (keep_locked)
|
||||||
|
opts.keep_locked = _("added with --lock");
|
||||||
|
|
||||||
if (ac < 1 || ac > 2)
|
if (ac < 1 || ac > 2)
|
||||||
usage_with_options(worktree_usage, options);
|
usage_with_options(worktree_usage, options);
|
||||||
|
|
||||||
|
|
|
@ -67,11 +67,25 @@ test_expect_success '"add" worktree' '
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success '"add" worktree with lock' '
|
test_expect_success '"add" worktree with lock' '
|
||||||
git rev-parse HEAD >expect &&
|
|
||||||
git worktree add --detach --lock here-with-lock main &&
|
git worktree add --detach --lock here-with-lock main &&
|
||||||
|
test_when_finished "git worktree unlock here-with-lock || :" &&
|
||||||
test -f .git/worktrees/here-with-lock/locked
|
test -f .git/worktrees/here-with-lock/locked
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success '"add" worktree with lock and reason' '
|
||||||
|
lock_reason="why not" &&
|
||||||
|
git worktree add --detach --lock --reason "$lock_reason" 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 "$lock_reason" >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' '
|
test_expect_success '"add" worktree from a subdir' '
|
||||||
(
|
(
|
||||||
mkdir sub &&
|
mkdir sub &&
|
||||||
|
|
Loading…
Reference in a new issue