[PATCH] worktree: allow "-" short-hand for @{-1} in add command

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

[PATCH] worktree: allow "-" short-hand for @{-1} in add command

Jordan DE GEA-2
From: Jordan DE GEA <[hidden email]>

Since `git worktree add` uses `git checkout` when `[<branch>]` is used,
and `git checkout -` is already supported, it makes sense to allow the
same shortcut in `git worktree add`.

Signed-off-by: Matthieu Moy <[hidden email]>
Signed-off-by: Jordan DE GEA <[hidden email]>
---
 Documentation/git-worktree.txt |  3 ++-
 builtin/worktree.c             |  3 +++
 t/t2025-worktree-add.sh        | 18 ++++++++++++++++++
 3 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.txt
index c622345..48e5fdf 100644
--- a/Documentation/git-worktree.txt
+++ b/Documentation/git-worktree.txt
@@ -48,7 +48,8 @@ add <path> [<branch>]::
 
 Create `<path>` and checkout `<branch>` into it. The new working directory
 is linked to the current repository, sharing everything except working
-directory specific files such as HEAD, index, etc.
+directory specific files such as HEAD, index, etc. The last branch you
+were on can be specify with `-` as `<branch>` which is synonymous with `"@{-1}"`.
 +
 If `<branch>` is omitted and neither `-b` nor `-B` nor `--detached` used,
 then, as a convenience, a new branch based at HEAD is created automatically,
diff --git a/builtin/worktree.c b/builtin/worktree.c
index d8e3795..d800d47 100644
--- a/builtin/worktree.c
+++ b/builtin/worktree.c
@@ -340,6 +340,9 @@ static int add(int ac, const char **av, const char *prefix)
  path = prefix ? prefix_filename(prefix, strlen(prefix), av[0]) : av[0];
  branch = ac < 2 ? "HEAD" : av[1];
 
+ if (!strcmp(branch, "-"))
+ branch = "@{-1}";
+
  opts.force_new_branch = !!new_branch_force;
  if (opts.force_new_branch) {
  struct strbuf symref = STRBUF_INIT;
diff --git a/t/t2025-worktree-add.sh b/t/t2025-worktree-add.sh
index 3acb992..b713efb 100755
--- a/t/t2025-worktree-add.sh
+++ b/t/t2025-worktree-add.sh
@@ -18,6 +18,24 @@ test_expect_success '"add" an existing empty worktree' '
  git worktree add --detach existing_empty master
 '
 
+test_expect_success '"add" using shorthand - fails when no previous branch' '
+ test_must_fail git worktree add existing -
+'
+
+test_expect_success '"add" using - shorthand' '
+ git checkout -b newbranch &&
+ echo hello >myworld &&
+ git add myworld &&
+ git commit -m myworld &&
+ git checkout master &&
+ git worktree add short-hand - &&
+ cd short-hand &&
+ test $(git rev-parse --symbolic-full-name HEAD) = "refs/heads/newbranch"
+ branch=$(cd short-hand && git rev-parse --symbolic-full-name HEAD) &&
+ test "$branch" = refs/heads/newbranch &&
+ cd ..
+'
+
 test_expect_success '"add" refuses to checkout locked branch' '
  test_must_fail git worktree add zere master &&
  ! test -d zere &&
--
2.7.4 (Apple Git-66)

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [hidden email]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: [PATCH] worktree: allow "-" short-hand for @{-1} in add command

Junio C Hamano
Jordan DE GEA <[hidden email]> writes:

> From: Jordan DE GEA <[hidden email]>
>
> Since `git worktree add` uses `git checkout` when `[<branch>]` is used,
> and `git checkout -` is already supported, it makes sense to allow the
> same shortcut in `git worktree add`.

OK.

>
> Signed-off-by: Matthieu Moy <[hidden email]>
> Signed-off-by: Jordan DE GEA <[hidden email]>
> ---
>  Documentation/git-worktree.txt |  3 ++-
>  builtin/worktree.c             |  3 +++
>  t/t2025-worktree-add.sh        | 18 ++++++++++++++++++
>  3 files changed, 23 insertions(+), 1 deletion(-)
>
> diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.txt
> index c622345..48e5fdf 100644
> --- a/Documentation/git-worktree.txt
> +++ b/Documentation/git-worktree.txt
> @@ -48,7 +48,8 @@ add <path> [<branch>]::
>  
>  Create `<path>` and checkout `<branch>` into it. The new working directory
>  is linked to the current repository, sharing everything except working
> -directory specific files such as HEAD, index, etc.
> +directory specific files such as HEAD, index, etc. The last branch you
> +were on can be specify with `-` as `<branch>` which is synonymous with `"@{-1}"`.

You meant "can be specified", I think.  Fixing it would make the
line a bit too long, so fold it around the word "synonymous".

> diff --git a/t/t2025-worktree-add.sh b/t/t2025-worktree-add.sh
> index 3acb992..b713efb 100755
> --- a/t/t2025-worktree-add.sh
> +++ b/t/t2025-worktree-add.sh
> @@ -18,6 +18,24 @@ test_expect_success '"add" an existing empty worktree' '
>   git worktree add --detach existing_empty master
>  '
>  
> +test_expect_success '"add" using shorthand - fails when no previous branch' '
> + test_must_fail git worktree add existing -
> +'

Just an observation, but the error message we would see here might
be interesting.

> +test_expect_success '"add" using - shorthand' '
> + git checkout -b newbranch &&
> + echo hello >myworld &&
> + git add myworld &&
> + git commit -m myworld &&
> + git checkout master &&
> + git worktree add short-hand - &&


> + cd short-hand &&
> + test $(git rev-parse --symbolic-full-name HEAD) = "refs/heads/newbranch"

Broken &&-chain.

> + branch=$(cd short-hand && git rev-parse --symbolic-full-name HEAD) &&
> + test "$branch" = refs/heads/newbranch &&
> + cd ..

If any of the command between "cd short-hand" and "cd .." failed,
after correcting the broken &&-chain, the next test will end up
running in short-hand directory, which it is not expecting.  A
canonical way to avoid this problem is to replace the above with:

        ...
        git worktree add short-hand - &&
        (
                cd short-hand &&
                ...
                test "$branch" = refs/heads/newbranch
        )

In this particular case, alternatively, you could also do something
like this:

        git worktree add short-hand - &&
        echo refs/heads/newbranch >expect &&
        git -C short-hand rev-parse --symbolic-full-name HEAD >actual &&
        test_cmp expect actual

and it would be sufficient.

It is not immediately obvious to me why you have two copies of the
same test in your patch to see where HEAD points at.  If the reason
is because you suspect that "git -C $there" form may give subtly
different behaviour and wanted to test both, then you could do
something like this:

        git worktree add short-hand - &&
        echo refs/heads/newbranch >expect &&
        git -C short-hand rev-parse --symbolic-full-name HEAD >actual &&
        test_cmp expect actual &&
        (cd short-hand && git rev-parse --symbolic-full-name HEAD) >actual &&
        test_cmp expect actual

but I do not think that is necessary.  This test is not about "does
rev-parse --symbolic-full-name work correctly with 'git -C $there'?"

Thanks.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [hidden email]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Loading...