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

Re: [PATCHv6 4/7] worktree: get worktrees from submodules

From
Duy Nguyen <pclouds@gmail.com>
Date
Dec 8, 2016, 10:09 UTC
Message-ID
<CACsJy8Bs78ywGq5p6yAFGi1KACAXFEeroyQSJye5-RL5gqOS+Q@mail.gmail.com>
In-Reply-To
<20161208014623.7588-5-sbeller@google.com>
On Thu, Dec 8, 2016 at 8:46 AM, Stefan Beller <sbeller@google.com> wrote:
>
>         worktree = xcalloc(1, sizeof(*worktree));
>         worktree->path = strbuf_detach(&worktree_path, NULL);
> @@ -101,7 +101,8 @@ static struct worktree *get_main_worktree(void)

All the good stuff is outside context lines again.. Somewhere between here we call add_head_info() which calls resolve_ref_unsafe(), which always uses data from current repo, not the submodule we want it to look at.

> @@ -167,7 +168,8 @@ static int compare_worktree(const void *a_, const void *b_)
>         return fspathcmp((*a)->path, (*b)->path);

fspathcmp() reads core.ignorecase from current repo. I guess it's insane to have this key different between repos on the same machine, so it should be ok. But I want to point this out just in case I'm missing something.

Show 11 quoted lines
> @@ -188,7 +190,7 @@ struct worktree **get_worktrees(unsigned flags)
>                         if (is_dot_or_dotdot(d->d_name))
>                                 continue;
>
> -                       if ((linked = get_linked_worktree(d->d_name))) {
> +                       if ((linked = get_linked_worktree(git_common_dir, d->d_name))) {
>                                 ALLOC_GROW(list, counter + 1, alloc);
>                                 list[counter++] = linked;
>                         }
> @@ -209,6 +211,30 @@ struct worktree **get_worktrees(unsigned flags)
>         return list;

Right before this line is mark_current_worktree(), which in turn calls get_git_dir() and not suitable for peeking into another repository the way submodule code does. get_worktree_git_dir() called within that function shares the same problem.

Show 19 quoted lines
>  }
>
> +struct worktree **get_worktrees(unsigned flags)
> +{
> +       return get_worktrees_internal(get_git_common_dir(), flags);
> +}
> +
> +struct worktree **get_submodule_worktrees(const char *path, unsigned flags)
> +{
> +       char *submodule_gitdir;
> +       struct strbuf sb = STRBUF_INIT;
> +       struct worktree **ret;
> +
> +       submodule_gitdir = git_pathdup_submodule(path, "%s", "");
> +       if (!submodule_gitdir)
> +               return NULL;
> +
> +       /* the env would be set for the superproject */
> +       get_common_dir_noenv(&sb, submodule_gitdir);

Technically we need to read submodule_gitdir/.config and see if we can understand core.repositoryformatversion, or find any unrecognized extensions. But the problem is not specific to this code. And fixing it is no small task. But perhaps we could call a dummy validate_submodule_gitdir() here? Then when we implement that function for real, we don't have to search the entire code base to see where to put it.

Kinda off-topic though. Feel free to ignore the above comment.
Show 6 quoted lines
> +       ret = get_worktrees_internal(sb.buf, flags);
> +
> +       strbuf_release(&sb);
> +       free(submodule_gitdir);
> +       return ret;
> +}
-- 
Duy
Previous: Stefan BellerNext: Stefan Beller
Message 8 of 20 in “[PATCHv6 0/7] submodule embedgitdirs”
  1. Stefan BellerDec 8, 2016
  2. 1/7 submodule: use absolute path for computing relative path connectingStefan Beller, Dec 8, 2016
  3. Duy NguyenDec 8, 2016
  4. 2/7 submodule helper: support super prefixStefan Beller, Dec 8, 2016
  5. Duy NguyenDec 8, 2016
  6. Stefan BellerDec 8, 2016
  7. 4/7 worktree: get worktrees from submodulesStefan Beller, Dec 8, 2016
  8. Duy NguyenDec 8, 2016
  9. Stefan BellerDec 8, 2016
  10. Duy NguyenDec 9, 2016
  11. Brandon WilliamsDec 9, 2016
  12. Stefan BellerDec 9, 2016
  13. 7/7 submodule: add absorb-git-dir functionStefan Beller, Dec 8, 2016
  14. Duy NguyenDec 8, 2016
  15. 5/7 worktree: add function to check if worktrees are in useStefan Beller, Dec 8, 2016
  16. Duy NguyenDec 8, 2016
  17. Duy NguyenDec 8, 2016
  18. Stefan BellerDec 8, 2016
  19. 3/7 test-lib-functions.sh: teach test_commit -C <dir>Stefan Beller, Dec 8, 2016
  20. 6/7 move connect_work_tree_and_git_dir to dir.hStefan Beller, Dec 8, 2016

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.