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

Re: [PATCH v7 4/8] worktree: simplify find_shared_symref() memory ownership model

From
Eric Sunshine <sunshine@sunshineco.com>
Date
Dec 1, 2021, 23:10 UTC
Message-ID
<CAPig+cSNP-RBmsWWfT690-shFUCZ3J0X+FBiNjCqg=AkoBMBqQ@mail.gmail.com>
In-Reply-To
<20211201221547.1796213-5-andersk@mit.edu>
On Wed, Dec 1, 2021 at 5:16 PM Anders Kaseorg <andersk@mit.edu> wrote:
Show 19 quoted lines
> Storing the worktrees list in a static variable meant that
> find_shared_symref() had to rebuild the list on each call (which is
> inefficient when the call site is in a loop), and also that each call
> invalidated the pointer returned by the previous call (which is
> confusing).
>
> Instead, make it the caller’s responsibility to pass in the worktrees
> list and manage its lifetime.
>
> Signed-off-by: Anders Kaseorg <andersk@mit.edu>
> ---
> diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
> @@ -1486,12 +1486,17 @@ static const char *update(struct command *cmd, struct shallow_info *si)
> -       const struct worktree *worktree = is_bare_repository() ? NULL : find_shared_symref("HEAD", name);
> +       struct worktree **worktrees = get_worktrees();
> +       const struct worktree *worktree =
> +               is_bare_repository() ?
> +                       NULL :
> +                       find_shared_symref(worktrees, "HEAD", name);

As far as I can see, this code only cares whether find_shared_symref() returned a result; it doesn't actually consult the returned worktree at all, thus it semantically considers `worktree` as a boolean, not as a `struct worktree`. I see in [7/8] that you do add an access to the `worktree.is_bare` field, but that also is used purely in a boolean fashion. If my understanding is correct, then it seems as if it would be cleaner and make for a much less noisy patch if you did this instead:

    struct worktree **worktrees = get_worktrees();
    int has_worktree = 0;
    if (!is_bare_repository()) {
        struct worktree *w = find_shared_symref(worktrees, ...);
        has_worktree = !!w;
    }
    free_worktrees(worktrees);
    ...
    if (has_worktree) {
        ...
    }
and in patch [7/8] augment that to:
    int is_worktree_bare = 0;
    if (!is_bare_repository()) {
        struct worktree *w = find_shared_symref(worktrees, ...);
        if (w) {
            has_worktree = 1;
            is_worktree_bare = w->is_bare;
        }
    }
    free_worktrees(worktrees);
which would then allow you to...
Show 6 quoted lines
>         if (!starts_with(name, "refs/") || check_refname_format(name + 5, 0)) {
>                 rp_error("refusing to create funny ref '%s' remotely", name);
> -               return "funny refname";
> +               ret = "funny refname";
> +               goto out;
>         }

... drop this change and all the other similar changes to this file since `worktrees` gets cleaned up as soon as `has_worktree` and `is_worktree_bare` have been determined, so there's no need to introduce an `out` label just to clean up `worktrees` at the end of the function.

Previous: Anders KaseorgNext: Anders Kaseorg
Message 5 of 20 in “protect branches checked out in all worktrees”
  1. 0/8 protect branches checked out in all worktreesAnders Kaseorg, Dec 1, 2021
  2. 1/8 fetch: lowercase error messagesAnders Kaseorg, Dec 1, 2021
  3. 3/8 branch: lowercase error messagesAnders Kaseorg, Dec 1, 2021
  4. 4/8 worktree: simplify find_shared_symref() memory ownership modelAnders Kaseorg, Dec 1, 2021
  5. Eric SunshineDec 1, 2021
  6. Anders KaseorgDec 1, 2021
  7. Eric SunshineDec 2, 2021
  8. Eric SunshineDec 2, 2021
  9. Anders KaseorgDec 2, 2021
  10. Eric SunshineDec 2, 2021
  11. 2/8 receive-pack: lowercase error messagesAnders Kaseorg, Dec 1, 2021
  12. 5/8 fetch: protect branches checked out in all worktreesAnders Kaseorg, Dec 1, 2021
  13. Eric SunshineDec 2, 2021
  14. Anders KaseorgDec 2, 2021
  15. 6/8 receive-pack: clean dead code from update_worktree()Anders Kaseorg, Dec 1, 2021
  16. 7/8 receive-pack: protect current branch for bare repository worktreeAnders Kaseorg, Dec 1, 2021
  17. 8/8 branch: protect branches checked out in all worktreesAnders Kaseorg, Dec 1, 2021
  18. Jiang XinDec 23, 2021
  19. Jiang XinJan 12, 2022
  20. Junio C HamanoJan 12, 2022

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.