Re: [PATCH v3 2/7] repo: add path.superproject-working-tree with absolute and relative suffixes
Justin Tobler <[email protected]> Tue, 28 Jul 2026 11:43:43 -0500
| Newsgroups | org.kernel.vger.git |
|---|---|
| Message-ID | <amjazXbdRXtH7CoJ@denethor> |
On 26/07/26 04:13PM, K Jayatheerth wrote: > Scripts working in multi-repository setups often need to identify the > top-level working tree of a superproject from within a submodule. > Currently, this is only exposed via `git rev-parse > --show-superproject-working-tree`. > > Introduce `path.superproject-working-tree.absolute` and > `path.superproject-working-tree.relative` keys to `git repo info`. > This exposes the core submodule context via a scriptable config-like key > using standard format rules. Ok, this also seems like a good fit to include as a key in git-repo-info, but "superproject-working-tree" is a bit of a mouthful IMO. An alternative could potentially be "superproject-root"? Maybe its best to just be consistent with the option name in git-rev-parse(1) and keep it the same though. > If requested when not inside a submodule, the command returns an empty > string. > > Mentored-by: Justin Tobler <[email protected]> > Mentored-by: Lucas Seiki Oshiro <[email protected]> > Signed-off-by: K Jayatheerth <[email protected]> > --- > Documentation/git-repo.adoc | 10 ++++++++++ > builtin/repo.c | 33 +++++++++++++++++++++++++++++++++ > t/t1900-repo-info.sh | 34 ++++++++++++++++++++++++++++++++++ > 3 files changed, 77 insertions(+) > > diff --git a/Documentation/git-repo.adoc b/Documentation/git-repo.adoc > index e34abe5fea..03aa57942f 100644 > --- a/Documentation/git-repo.adoc > +++ b/Documentation/git-repo.adoc > @@ -119,6 +119,16 @@ values that they return: > `path.gitdir.relative`:: > The path to the Git repository directory relative to the current working directory. > > +`path.superproject-working-tree.absolute`:: > + The canonical absolute path to the working tree root of the superproject > + if the current repository is an initialized submodule. Outputs an empty > + string if not in a submodule. > + > +`path.superproject-working-tree.relative`:: > + The path to the working tree root of the superproject relative to the > + current working directory if the current repository is an initialized > + submodule. Outputs an empty string if not in a submodule. > + > `path.toplevel.absolute`:: > The canonical absolute path to the top-level directory of the > repository's working tree. Outputs an empty string if the repository > diff --git a/builtin/repo.c b/builtin/repo.c > index 194757eb18..82359473e9 100644 > --- a/builtin/repo.c > +++ b/builtin/repo.c > @@ -18,6 +18,7 @@ > #include "strbuf.h" > #include "string-list.h" > #include "shallow.h" > +#include "submodule.h" > #include "tree.h" > #include "tree-walk.h" > #include "utf8.h" > @@ -121,6 +122,36 @@ static int get_path_gitdir_relative(struct repository *repo, struct strbuf *buf) > return 0; > } > > +static int get_path_superproject_absolute(struct repository *repo UNUSED, struct strbuf *buf) > +{ > + struct strbuf superproject = STRBUF_INIT; > + > + if (!get_superproject_working_tree(&superproject)) { > + strbuf_release(&superproject); > + strbuf_addstr(buf, ""); Same comment here as in the previous patch... > + return 0; > + } > + > + format_path(buf, superproject.buf, startup_info->prefix, PATH_FORMAT_CANONICAL); > + strbuf_release(&superproject); > + return 0; > +} > + > +static int get_path_superproject_relative(struct repository *repo UNUSED, struct strbuf *buf) > +{ > + struct strbuf superproject = STRBUF_INIT; > + > + if (!get_superproject_working_tree(&superproject)) { > + strbuf_release(&superproject); > + strbuf_addstr(buf, ""); ...and here as well... > + return 0; > + } > + > + format_path(buf, superproject.buf, startup_info->prefix, PATH_FORMAT_RELATIVE); > + strbuf_release(&superproject); > + return 0; > +} > + > static int get_path_toplevel_absolute(struct repository *repo, struct strbuf *buf) > { > const char *work_tree = repo_get_work_tree(repo); > @@ -163,6 +194,8 @@ static const struct repo_info_field repo_info_field[] = { > { "path.commondir.relative", get_path_commondir_relative }, > { "path.gitdir.absolute", get_path_gitdir_absolute }, > { "path.gitdir.relative", get_path_gitdir_relative }, > + { "path.superproject-working-tree.absolute", get_path_superproject_absolute }, > + { "path.superproject-working-tree.relative", get_path_superproject_relative }, > { "path.toplevel.absolute", get_path_toplevel_absolute }, > { "path.toplevel.relative", get_path_toplevel_relative }, > { "references.format", get_references_format }, > diff --git a/t/t1900-repo-info.sh b/t/t1900-repo-info.sh > index fbb9063ee5..220b3d4d3d 100755 > --- a/t/t1900-repo-info.sh > +++ b/t/t1900-repo-info.sh > @@ -213,6 +213,40 @@ test_repo_info_path 'gitdir with explicit GIT_DIR' 'gitdir' \ > '.git' \ > 'GIT_DIR="../.git" && export GIT_DIR' > > +test_expect_success 'path.superproject-working-tree absolute and relative' ' > + test_when_finished "rm -rf sub super" && > + git init sub && > + test_commit -C sub initial && > + git init super && > + ( > + cd super && > + git -c protocol.file.allow=always submodule add "../sub" sub && > + git commit -m "add submodule" && > + > + cd sub && > + ROOT="$(test-tool path-utils real_path ..)" && > + > + echo "path.superproject-working-tree.absolute=$ROOT" >expect.abs && > + git repo info path.superproject-working-tree.absolute >actual.abs && > + test_cmp expect.abs actual.abs && > + > + echo "path.superproject-working-tree.relative=../" >expect.rel && > + git repo info path.superproject-working-tree.relative >actual.rel && > + test_cmp expect.rel actual.rel > + ) > +' > + > +test_expect_success 'path.superproject-working-tree returns empty when not in a submodule' ' > + test_when_finished "rm -rf repo" && > + git init repo && > + ( > + cd repo && > + echo "path.superproject-working-tree.absolute=" >expect && > + git repo info path.superproject-working-tree.absolute >actual && > + test_cmp expect actual ... and here as well. :) -Justin