The reception for this series seemed pretty good in v1, so I'm dropping the RFC. Tested: https://github.com/nasamuffin/git/actions/runs/941100646 Sinec v1, mostly platform-friendliness fixes. Also added documentation for the new config option - wordsmithing help is always welcome. - Emily Emily Shaffer (4): t7400-submodule-basic: modernize inspect() helper introduce submodule.superprojectGitDir cache submodule: cache superproject gitdir during absorbgitdirs submodule: cache superproject gitdir during 'update' Documentation/config/submodule.txt | 12 ++++++++ builtin/submodule--helper.c | 4 +++ git-submodule.sh | 10 ++++++ submodule.c | 10 ++++++ t/t7400-submodule-basic.sh | 49 ++++++++++++++---------------- t/t7406-submodule-update.sh | 10 ++++++ t/t7412-submodule-absorbgitdirs.sh | 9 +++++- 7 files changed, 77 insertions(+), 27 deletions(-) Range-diff against v1: 1: d6284438fb = 1: a6718eea80 t7400-submodule-basic: modernize inspect() helper 2: 56470e2eab ! 2: 4cebe7bcb5 introduce submodule.superprojectGitDir cache @@ Commit message Signed-off-by: Emily Shaffer <emilyshaffer@xxxxxxxxxx> + ## Documentation/config/submodule.txt ## +@@ Documentation/config/submodule.txt: submodule.alternateErrorStrategy:: + `ignore`, `info`, `die`. Default is `die`. Note that if set to `ignore` + or `info`, and if there is an error with the computed alternate, the + clone proceeds as if no alternate was specified. ++ ++submodule.superprojectGitDir:: ++ The relative path from the submodule's worktree to the superproject's ++ gitdir. This config should only be present in projects which are ++ submodules, but is not guaranteed to be present in every submodule. It ++ is set automatically during submodule creation. +++ ++ In situations where more than one superproject references the same ++ submodule worktree, the value of this config and the behavior of ++ operations which use it are undefined. To reference a single project ++ from multiple superprojects, it is better to create a worktree of the ++ submodule for each superproject. + ## builtin/submodule--helper.c ## @@ builtin/submodule--helper.c: static int module_clone(int argc, const char **argv, const char *prefix) git_config_set_in_file(p, "submodule.alternateErrorStrategy", 3: 42f954f523 ! 3: df97a9c2bb submodule: cache superproject gitdir during absorbgitdirs @@ submodule.c: static void relocate_single_git_dir_into_superproject(const char *p ## t/t7412-submodule-absorbgitdirs.sh ## @@ t/t7412-submodule-absorbgitdirs.sh: test_expect_success 'absorb the git dir' ' - test -d .git/modules/sub1 && git status >actual.1 && git -C sub1 rev-parse HEAD >actual.2 && -+ test . -ef "$(git -C sub1 config submodule.superprojectGitDir)" && test_cmp expect.1 actual.1 && - test_cmp expect.2 actual.2 +- test_cmp expect.2 actual.2 ++ test_cmp expect.2 actual.2 && ++ ++ # make sure the submodule cached the superproject gitdir correctly ++ test-tool path-utils real_path . >expect && ++ test-tool path-utils real_path \ ++ "$(git -C sub1 config submodule.superprojectGitDir)" >actual && ++ ++ test_cmp expect actual ' + + test_expect_success 'absorbing does not fail for deinitialized submodules' ' 4: 4f55ab42c7 ! 4: a3f3be58ad submodule: cache superproject gitdir during 'update' @@ git-submodule.sh: cmd_update() + # Cache a pointer to the superproject's gitdir. This may have + # changed, so rewrite it unconditionally. Writes it to worktree + # if applicable, otherwise to local. ++ relative_gitdir="$(git rev-parse --path-format=relative \ ++ --prefix "${sm_path}" \ ++ --git-dir)" + -+ sp_gitdir="$(git rev-parse --absolute-git-dir)" -+ relative_gitdir="$(realpath --relative-to "$sm_path" "$sp_gitdir")" + git -C "$sm_path" config --worktree \ + submodule.superprojectgitdir "$relative_gitdir" + @@ git-submodule.sh: cmd_update() ( ## t/t7406-submodule-update.sh ## -@@ t/t7406-submodule-update.sh: test_expect_success 'submodule update --quiet passes quietness to merge/rebase' +@@ t/t7406-submodule-update.sh: test_expect_success 'submodule update --quiet passes quietness to fetch with a s ) ' -- 2.32.0.272.g935e593368-goog