Thread (71 messages) flat view 71 messages, 5 authors, 18h ago

Re: [GSoC Patch v5 2/7] repo: add path.superproject-root with absolute and relative suffixes

From: K Jayatheerth <hidden>
Date: 2026-09-05 10:01:26

On Sat, Sep 5, 2026 at 3:39 AM Junio C Hamano [off-list ref] wrote:
K Jayatheerth [off-list ref] writes:
quoted
+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);
+             return 0;
+     }
+
+     format_path(buf, superproject.buf, "", PATH_FORMAT_CANONICAL);
+     strbuf_release(&superproject);
+     return 0;
+}
+
+static int get_path_superproject_relative(struct repository *repo, struct strbuf *buf)
+{
+     struct strbuf superproject = STRBUF_INIT;
+
+     if (!get_superproject_working_tree(&superproject)) {
+             strbuf_release(&superproject);
+             return 0;
+     }
Here get_superproject_working_tree() does not care what repository
we are working on.  Shouldn't it be updated to take "repo" as a
parameter?

Since it begins like this:

    int get_superproject_working_tree(struct strbuf *buf)
    {
            struct child_process cp = CHILD_PROCESS_INIT;
            struct strbuf sb = STRBUF_INIT;
            struct strbuf one_up = STRBUF_INIT;
            char *cwd = xgetcwd();
            int ret = 0;

I suspect that it based its decision on where you happen to be.

It means that when I have a checkout of "git", with a submodule
"sha1collisiondetection" at its top level already populated, in,
say, /var/tmp/x/ directory, the following happens.

    $ cd /var/tmp/x/git
    $ git repo info path.gitdir.absolute
    path.gitdir.absolute=/var/tmp/x/git/.git
    $ git -C sha1collisiondetection repo info path.gitdir.absolute
    path.gitdir.absolute=/var/tmp/x/git/.git/modules/sha1collisiondetection

    $ D=/var/tmp/x/git/.git/modules/sha1collisiondetection
    $ git --git-dir="$D" repo info path.superproject-root.absolute
    path.superproject-root.absolute=
    $ git -C sha1collisiondetection repo info path.superproject-root.absolute
    path.superproject-root.absolute=/var/tmp/x/git

The last two ought to match, but only the latter works correctly.

Before this series starts reporting path.superproject-root,
get_superproject_working_tree() needs to be corrected to work on the
repository in question (instead of relying on where the process
happens to be), no?
Yes, precisely.
I didn't think of it that way.

`get_superproject_working_tree()` currently relies on xgetcwd() rather
than inspecting the target repository, which causes explicit repository
contexts like --git-dir to break.

I will update `get_superproject_working_tree()` to take repo
and update its callers accordingly, along with adding test coverage for
--git-dir in v6.

Regards,
- K Jayatheerth
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help