git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] worktree add: be tolerant of corrupt worktrees

From
SHShaheed Haque <shaheedhaque@gmail.com>
Date
May 13, 2019, 12:42 UTC
Message-ID
<CAHAc2jeFva3MLpuXEiBbwa7U5HuZiaqawkc3udsyPCaFR4FAnA@mail.gmail.com>
In-Reply-To
<20190513104944.20367-1-pclouds@gmail.com>
Hi Nguyễn,

Thanks for the quick response. While I leave the code to the experts, I can confirm that restoring the missing directory (but no content in it) does allow "worktree add" to function again.

One point may be worth clarifying...
On Mon, 13 May 2019 at 11:50, Nguyễn Thái Ngọc Duy <pclouds@gmail.com> wrote:
Show 12 quoted lines
>
> find_worktree() can die() unexpectedly because it uses real_path()
> instead of the gentler version. When it's used in 'git worktree add' [1]
> and there's a bad worktree, this die() could prevent people from adding
> new worktrees.
>
> The "bad" condition to trigger this is when a parent of the worktree's
> location is deleted. Then real_path() will complain.
>
> Use the other version so that bad worktrees won't affect 'worktree
> add'. The bad ones will eventually be pruned, we just have to tolerate
> them for a bit.

...as I mentioned, from my experiments, trying a "worktree prune" did NOT resolve the issue for me. But since I don't know the logic that prune uses, there may have been some other reason for this.

Thanks again, Shaheed
Show 54 quoted lines
> [1] added in cb56f55c16 (worktree: disallow adding same path multiple
>     times, 2018-08-28), or since v2.20.0. Though the real bug in
>     find_worktree() is much older.
>
> Reported-by: Shaheed Haque <shaheedhaque@gmail.com>
> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
> ---
>  t/t2025-worktree-add.sh | 12 ++++++++++++
>  worktree.c              |  7 +++++--
>  2 files changed, 17 insertions(+), 2 deletions(-)
>
> diff --git a/t/t2025-worktree-add.sh b/t/t2025-worktree-add.sh
> index 286bba35d8..d83a9f0fdc 100755
> --- a/t/t2025-worktree-add.sh
> +++ b/t/t2025-worktree-add.sh
> @@ -570,4 +570,16 @@ test_expect_success '"add" an existing locked but missing worktree' '
>         git worktree add --force --force --detach gnoo
>  '
>
> +test_expect_success '"add" should not fail because of another bad worktree' '
> +       git init add-fail &&
> +       (
> +               cd add-fail &&
> +               test_commit first &&
> +               mkdir sub &&
> +               git worktree add sub/to-be-deleted &&
> +               rm -rf sub &&
> +               git worktree add second
> +       )
> +'
> +
>  test_done
> diff --git a/worktree.c b/worktree.c
> index d6a0ee7f73..c79b3e42bb 100644
> --- a/worktree.c
> +++ b/worktree.c
> @@ -222,9 +222,12 @@ struct worktree *find_worktree(struct worktree **list,
>                 free(to_free);
>                 return NULL;
>         }
> -       for (; *list; list++)
> -               if (!fspathcmp(path, real_path((*list)->path)))
> +       for (; *list; list++) {
> +               const char *wt_path = real_path_if_valid((*list)->path);
> +
> +               if (wt_path && !fspathcmp(path, wt_path))
>                         break;
> +       }
>         free(path);
>         free(to_free);
>         return *list;
> --
> 2.21.0.1141.gd54ac2cb17
>
Previous: Nguyễn Thái Ngọc DuyNext: Eric Sunshine
Message 7 of 10 in “"add worktree" fails with "fatal: Invalid path" error”
  1. Shaheed HaqueMay 12, 2019
  2. Duy NguyenMay 13, 2019
  3. Shaheed HaqueMay 13, 2019
  4. Duy NguyenMay 14, 2019
  5. Shaheed HaqueMay 14, 2019
  6. worktree add: be tolerant of corrupt worktreesNguyễn Thái Ngọc Duy, May 13, 2019
  7. Shaheed HaqueMay 13, 2019
  8. Eric SunshineMay 17, 2019
  9. Duy NguyenMay 18, 2019
  10. Shaheed HaqueJun 1, 2019

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.