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

Fwd: [RFC PATCH] git-submodule.sh:cmd_update: if submodule branch exists, fetch that instead of default

From
Eddy Petrișor <eddy.petrisor@gmail.com>
Date
Mar 29, 2018, 20:54 UTC
Message-ID
<CAK0XTWdxsUwWB7932yqo8+4PQqtEVJ8W_R9b3RK1oLVA6ZWkOg@mail.gmail.com>
In-Reply-To
<CAK0XTWd7QGtVDwm8FDXejZfbgVH6-1NprGY0xxAnC33QH8aCCQ@mail.gmail.com>
mar., 27 mar. 2018, 02:07 Stefan Beller <sbeller@google.com> a scris:
Show 11 quoted lines
>
> [snipped the cc list as well]
>
> On Tue, Mar 6, 2018 at 12:06 PM Eddy Petrișor <eddy.petrisor@gmail.com>
> wrote:
>
> > Signed-off-by: Eddy Petrișor <eddy.petrisor@gmail.com>
> > ---
>
> Did this go anywhere?
> (I just came back from a longer vacation, sorry for the delay on my site)
Not really. I am still unsure how is best to proceed. Details below.
Show 16 quoted lines
> > There are projects such as llvm/clang which use several repositories, and
> they
> > might be forked for providing support for various features such as adding
> Redox
> > awareness to the toolchain. This typically means the superproject will use
> > another branch than master, occasionally even use an old commit from that
> > non-master branch.
>
> > Combined with the fact that when incorporating such a hierachy of
> repositories
> > usually the user is interested in just the exact commit specified in the
> > submodule info, it follows that a desireable usecase is to be also able to
> > provide '--depth 1' to avoid waiting for ages for the clone operation to
> > finish.
>
> Very sensible.

The only change is that I realized that hard coding the depth is not necessary because the client can fetch more and more from the branch until the commit hash is found or the entire history was fetched and it wasn't found.

This is more robust but has a variable performance penalty and is probably slower than single branch fetching from the start.

Show 10 quoted lines
> > Git submodule seems to be very stubborn and cloning master, although the
> > wrapper script and the gitmodules-helper could work together to clone
> directly
> > the branch specified in the .gitmodules file, if specified.
>
> Also very sensible.
>
> So far so good, could you move these paragraphs before the triple dashed
> line
> and sign off so we record it as the commit message?
Sure, as long as the implementation and design makes sense.
Show 13 quoted lines
> > Another wrinkle is that when the commit is not the tip of the branch, the
> depth
> > parameter should somehow be stored in the .gitmodules info, but any
> change in
> > the submodule will break the supermodule submodule depth info sooner or
> later,
> > which is definitly frigile.
>
> ... which is why I would not include that.
>
> git-fetch knows about --shallow-since or even better
> shallow-exclude which could be set to the (depth+1)-th commit
> (the boundary commit) recorded in the shallow information.

I am unsure what that means. Without yet looking in the docs, would this --shallow-since be better than the try-until-found algorithm explained above?

Show 27 quoted lines
> > I tried digging into this section of the code and debugging with bashdb
> to see
> > where --depth might fit, but I got stuck on the shell-to-helper
> interaction and
> > the details of the submodule implementation, so I want to lay out this
> first
> > patch as starting point for the discussion in the hope somebody else
> picks it
> > up or can provide some inputs. I have the feeling there are multiple code
> paths
> > that are being ran, depending on the moment (initial clone, submodule
> > recursive, post-clone update etc.) and I have a gut feeling there
> shouldn't be
> > any code duplication just because the operation is different.
>
> > This first patch is only trying to use a non-master branch, I have some
> changes
> > for the --depth part, but I stopped working on it due to the "default
> depth"
> > issue above.
>
> > Does any of this sound reasonable?
> > Is this patch idea usable or did I managed to touch the part of the code
> that
> > should not be touched?
>
> This sounds reasonable. Thanks for writing the patch!
OK. Now I need to make it good, which is the hard part :)
Show 21 quoted lines
> > diff --git a/git-submodule.sh b/git-submodule.sh
> > index 2491496..370f19e 100755
> > --- a/git-submodule.sh
> > +++ b/git-submodule.sh
> > @@ -589,8 +589,11 @@ cmd_update()
> >                          branch=$(git submodule--helper remote-branch
> "$sm_path")
> >                          if test -z "$nofetch"
> >                          then
> > +                               # non-default branch
> > +                               rbranch=$(git config -f .gitmodules
> submodule.$sm_path.branch)
> > +
> br_refspec=${rbanch:+"refs/heads/$rbranch:refs/heads/$rbranch"}
>
> Wouldn't we want to fetch into a remote tracking branch instead?
> Instead of computing all this by yourself, these two lines could be
>
>      br_refspec=$(git submodule--helper remote-branch $sm_path)
>
> I would think.
I wasn't aware of this, will implement I  the next version and see what happens.
Show 16 quoted lines
>
>
> >                                  # Fetch remote before determining
> tracking $sha1
> > -                               fetch_in_submodule "$sm_path" $depth ||
> > +                               fetch_in_submodule "$sm_path" $depth
> $br_refspec ||
> >                                  die "$(eval_gettext "Unable to fetch in
> submodule path '\$sm_path'")"
> >                          fi
> >                          remote_name=$(sanitize_submodule_env; cd
> "$sm_path" && get_default_remote)
>
> It would be awesome if you could write a little test for this feature, too.
> Look for the tests in regarding --remote in t7406 (in the t/ directory) as
> a starting point, please.

Coming up with a test case is probably a better way to explain what I want the behaviour to be. Thanks for pointing out the test case area to look into.

> Thanks!
> Stefan
-- 
Eddy Petrișor
Previous: Stefan BellerNext: Eddy Petrișor
Message 9 of 29 in “Re: [RFC PATCH] git-submodule.sh:cmd_update: if submodule branch exists, fetch that instead of default”
  1. Jonathan NiederMar 6, 2018
  2. Eddy PetrișorMar 8, 2018
  3. Eddy PetrișorMar 8, 2018
  4. Thomas GummererMar 16, 2018
  5. Eric SunshineMar 16, 2018
  6. Thomas GummererMar 17, 2018
  7. Eric SunshineMar 18, 2018
  8. Stefan BellerMar 26, 2018
  9. Fwd: [RFC PATCH] git-submodule.sh:cmd_update: if submodule branch exists, fetch that instead of defaultEddy Petrișor, Mar 29, 2018
  10. Eddy PetrișorMar 29, 2018
  11. 1/2 git-submodule.sh:cmd_update: if submodule branch exists, fetch that instead of defaultEddy Petrișor, Apr 3, 2018
  12. 2/2 t7406: add test for non-default branch in submoduleEddy Petrișor, Apr 3, 2018
  13. Eddy PetrișorApr 3, 2018
  14. Stefan BellerApr 4, 2018
  15. Eddy PetrișorApr 4, 2018
  16. Stefan BellerApr 4, 2018
  17. 1/9 git-submodule.sh:cmd_update: if submodule branch exists, fetch that instead of defaultEddy Petrișor, Apr 18, 2018
  18. 2/9 t7406: add test for non-default branch in submoduleEddy Petrișor, Apr 18, 2018
  19. 3/9 fixup:t7406: use test_commit instead of echo/add/commit as suggested by Stefan BellerEddy Petrișor, Apr 18, 2018
  20. 5/9 fixup:t7406:cleanup chained submodules after test is doneEddy Petrișor, Apr 18, 2018
  21. 4/9 fixup:t7404:use 'git -C' instead of cd .. && gitEddy Petrișor, Apr 18, 2018
  22. 6/9 fixup:t7406:don't call init after add, is redundantEddy Petrișor, Apr 18, 2018
  23. 7/9 fixup:t7406:supr5 commit is done before submodules chainingEddy Petrișor, Apr 18, 2018
  24. 9/9 fixup:t7406:change branches in submodules after the link is doneEddy Petrișor, Apr 18, 2018
  25. 8/9 fixup:t7406:use super_w instead of the existing superEddy Petrișor, Apr 18, 2018
  26. Stefan BellerApr 18, 2018
  27. Eddy PetrișorApr 19, 2018
  28. Eddy PetrișorApr 19, 2018
  29. Stefan BellerApr 19, 2018

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.