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

Re: [PATCH v9 0/3] teach submodules to know they're submodules

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
Mar 11, 2022, 09:09 UTC
Message-ID
<220311.8635joj0lf.gmgdl@evledraar.gmail.com>
In-Reply-To
<20220310004423.2627181-1-emilyshaffer@google.com>
On Wed, Mar 09 2022, Emily Shaffer wrote:
Show 50 quoted lines
> For the original cover letter, see
> https://lore.kernel.org/git/20210611225428.1208973-1-emilyshaffer%40google.com.
>
> CI run: https://github.com/nasamuffin/git/actions/runs/1954710601
>
> Since v8:
>
> Only a couple of minor fixes.
>
> Junio pointed out that I could write the tests better using --type=bool
> and 'test_cmp_config', and that we could be a little more careful about
> when to give up on 'git rev-parse --show-superproject-working-dir'.
>
> Glen mentioned that builtin/submodule--helper.c:run_update_procedure() is called
> unconditionally earlier in the same function where I had added the
> config in git-submodule.sh. So, I moved the config set into
> submodule--helper.c to reduce possible edge cases where the config might
> not be set.
>
> Otherwise, this series is pretty much unchanged.
>
> Since v7:
>
> Actually a fairly large rework. Rather than keeping the path from gitdir
> to gitdir, just keep a boolean under 'submodule.hasSuperproject'. The
> idea is that from this boolean, we can decide whether to traverse the
> filesystem looking for a superproject.
>
> Because this simplifies the implementation, I compressed the three
> middle commits into one. As proof-of-concept, I added a patch at the end
> to check for this boolean when running `git rev-parse
> --show-superproject-working-tree`.
>
> One thing I'm not sure about: in the tests, I check whether the config
> is set, but not what the boolean value of it is. Is there a better way
> to do that? For example, I could imagine someone deciding to set
> `submodule.hasSuperproject = false` and the tests would not function
> correctly in that case. I think we don't really normalize the value on a
> boolean config like that, so I didn't want to write a lot of comparison
> to check if the value is 1 or true or True or TRUE or Yes or .... Am I
> overthinking it?
>
> The other thing I'm not sure about: since it's just a bool, we're not
> restricted to setting this config only when we have both gitdir paths
> available. That makes me want to set the config any time we are doing
> something with submodules anyway, like any time 'git-submodule--helper'
> is used. But that helper seems to be called in the context of the
> superproject, not of the submodules, so adding this config for each
> submodule we touch would be a second child process. Is there some other
> common entry point for submodules that we can use?

I really don't mean to bring up the same points again, but I'm still genuinely unsure what this is intended to solve in the end.

I.e. from the original RFC we went from it being for optimizations for the shellscript "git rev-parse", to suggestions that the configured path would be "canonical" in a way we couldn't discover on-the-fly (i.e. some of Jonathan's noted edge cases [1]).

But now it's a boolean indicating "it's there, discover it", and the implied (but not really explicitly stated) reason in 2/3 is that it's purely for optimization purposes at this point.

But it's an optimization without a benchmark.

In [1] Jonathan (if I understood it correctly, see [2]) might have suggested this is important to deal with some Google in-house NFS-a-like auto-mounting software, i.e. the "walking up" is truly expensive in some scenarios.

I do worry a bit that we'll be creating behavior edge cases related to this, and if the problem being solved is for a relatively obscure setup is it worth it, and in that case perhaps there should be a "I need this optimization" setting guarding it?

But I don't know, a concrete case where this series makes a difference would really help.

I tried to come up with one before[3] and all I could find was fleeting cases we'd see go away with the migration of the remaining parts of git-submodule.sh to C, which we already have in-flight patches for (or rather, Glen is AFAIK at series 1/2 of submitting those, with 1/2 in-flight).

In any case I think lifting the bits of [3] where we assert that this doesn't introduce any behavior change with a GIT_TEST_* knob would be valuable.

I.e. as long a the intent isn't a behavior change let's test that get_superproject_working_tree() doesn't need this across the entire test suite, with specific tests that opt-in to the behavior (or do a whole test suite run in that mode), rather than the default being opt-out.

An opt-out is just a recipe for growing accidental implicit dependencies, which explicitly isn't what we want for a "just an optimization" knob. We do the same sort of opt-in/out-out testing for e.g. split index, untracked cache etc (see the GIT_TEST_* bits in ci/run-build-and-tests.sh). AFAICT a fix-up of just adding the git_env_bool() here to this code in your 3/3 would do it:

	if (!git_env_bool("GIT_TEST_NO_SUBMODULE_HAS_SUPERPROJECT", 0) &&
	    !git_config_get_bool("submodule.hassuperproject", &has_superproject_cfg)
	    && !has_superproject_cfg)

And then adding GIT_TEST_NO_SUBMODULE_HAS_SUPERPROJECT=true to linux-TEST-vars in ci/run-build-and-tests.sh. The tests that do rely on submodule.hassuperproject would need to set GIT_TEST_NO_SUBMODULE_HAS_SUPERPROJECT=false of course...

1. https://lore.kernel.org/git/YgF5V2Y0Btr8B4cd@google.com/
2. https://lore.kernel.org/git/220212.864k53yfws.gmgdl@evledraar.gmail.com/
3. https://lore.kernel.org/git/RFC-cover-0.2-00000000000-20211117T113134Z-avarab@gmail.com/
Previous: Eric SunshineNext: Junio C Hamano
Message 63 of 64 in “teach submodules to know they're submodules”
  1. 0/5 teach submodules to know they're submodulesEmily Shaffer, Nov 17, 2021
  2. 1/5 t7400-submodule-basic: modernize inspect() helperEmily Shaffer, Nov 17, 2021
  3. 2/5 introduce submodule.superprojectGitDir recordEmily Shaffer, Nov 17, 2021
  4. Jonathan TanNov 17, 2021
  5. 3/5 submodule: record superproject gitdir during absorbgitdirsEmily Shaffer, Nov 17, 2021
  6. 4/5 submodule: record superproject gitdir during 'update'Emily Shaffer, Nov 17, 2021
  7. 5/5 submodule: use config to find superproject worktreeEmily Shaffer, Nov 17, 2021
  8. 0/2 submodule: test what happens if submodule.superprojectGitDir isn't aroundÆvar Arnfjörð Bjarmason, Nov 17, 2021
  9. 1/2 submodule tests: fix potentially broken "config .. --unset"Ævar Arnfjörð Bjarmason, Nov 17, 2021
  10. 2/2 submodule: add test mode for checking absence of "superProjectGitDir"Ævar Arnfjörð Bjarmason, Nov 17, 2021
  11. Emily ShafferNov 23, 2021
  12. Ævar Arnfjörð BjarmasonNov 24, 2021
  13. Jonathan TanNov 17, 2021
  14. Emily ShafferNov 23, 2021
  15. 0/5 teach submodules to know they're submodulesEmily Shaffer, Feb 3, 2022
  16. 1/4 t7400-submodule-basic: modernize inspect() helperEmily Shaffer, Feb 3, 2022
  17. 2/4 introduce submodule.superprojectGitDir recordEmily Shaffer, Feb 3, 2022
  18. 3/4 submodule: record superproject gitdir during absorbgitdirsEmily Shaffer, Feb 3, 2022
  19. 4/4 submodule: record superproject gitdir during 'update'Emily Shaffer, Feb 3, 2022
  20. Junio C HamanoFeb 3, 2022
  21. Ævar Arnfjörð BjarmasonFeb 4, 2022
  22. Junio C HamanoFeb 4, 2022
  23. Jonathan NiederFeb 7, 2022
  24. Junio C HamanoFeb 7, 2022
  25. Jonathan NiederFeb 8, 2022
  26. Junio C HamanoFeb 8, 2022
  27. Emily ShafferFeb 10, 2022
  28. Jonathan NiederFeb 10, 2022
  29. Ævar Arnfjörð BjarmasonFeb 12, 2022
  30. Junio C HamanoFeb 13, 2022
  31. 0/3 teach submodules to know they're submodulesEmily Shaffer, Mar 1, 2022
  32. 1/3 t7400-submodule-basic: modernize inspect() helperEmily Shaffer, Mar 1, 2022
  33. 2/3 introduce submodule.hasSuperproject recordEmily Shaffer, Mar 1, 2022
  34. Junio C HamanoMar 1, 2022
  35. Emily ShafferMar 8, 2022
  36. Glen ChooMar 8, 2022
  37. Glen ChooMar 8, 2022
  38. 3/3 rev-parse: short-circuit superproject worktree when config unsetEmily Shaffer, Mar 1, 2022
  39. Junio C HamanoMar 1, 2022
  40. Emily ShafferMar 9, 2022
  41. Junio C HamanoMar 1, 2022
  42. Emily ShafferMar 8, 2022
  43. 0/3 teach submodules to know they're submodulesEmily Shaffer, Mar 10, 2022
  44. 1/3 t7400-submodule-basic: modernize inspect() helperEmily Shaffer, Mar 10, 2022
  45. 2/3 introduce submodule.hasSuperproject recordEmily Shaffer, Mar 10, 2022
  46. Junio C HamanoMar 10, 2022
  47. Glen ChooMar 10, 2022
  48. Glen ChooMar 10, 2022
  49. Junio C HamanoMar 10, 2022
  50. Glen ChooMar 10, 2022
  51. Glen ChooMar 10, 2022
  52. Emily ShafferMar 15, 2022
  53. Emily ShafferMar 15, 2022
  54. Glen ChooMar 15, 2022
  55. Emily ShafferMar 15, 2022
  56. Junio C HamanoMar 15, 2022
  57. Junio C HamanoMar 10, 2022
  58. Glen ChooMar 10, 2022
  59. Emily ShafferMar 15, 2022
  60. 3/3 rev-parse: short-circuit superproject worktree when config unsetEmily Shaffer, Mar 10, 2022
  61. Junio C HamanoMar 10, 2022
  62. Eric SunshineMar 10, 2022
  63. Ævar Arnfjörð BjarmasonMar 11, 2022
  64. Junio C HamanoMar 13, 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.