From: K Jayatheerth <jayatheerthkulkarni2005@gmail.com>
To: jayatheerthkulkarni2005@gmail.com
Cc: git@vger.kernel.org, jltobler@gmail.com,
lucasseikioshiro@gmail.com, gitster@pobox.com
Subject: [GSoC Patch v6 0/7] add more path keys to git repo info
Date: Fri, 11 Sep 2026 20:15:12 +0530 [thread overview]
Message-ID: <20260911144519.1011780-1-jayatheerthkulkarni2005@gmail.com> (raw)
In-Reply-To: <20260716012138.6714-1-jayatheerthkulkarni2005@gmail.com>
Series adds keys to git repo info.
Keys output paths of repository components:
* path.toplevel: repository tree.
* path.superproject-root: superproject tree from submodules.
* path.hooks: repository hooks.
* path.index: repository index.
* path.grafts: repository grafts.
* path.git-prefix: prefix offset.
* path.cdup: relative path to top level from subdirectory.
Keys support suffixes for format.
Commits contain documentation and tests.
changes since v5:
* Refactored get_superproject_working_tree(struct repository *r, ...): Updated
function signature and callers (builtin/rev-parse.c, builtin/repo.c)
to accept repo, eliminating xgetcwd().
Note on path.cdup duplication:
As discussed in v5, path.cdup currently duplicates the prefix-counting
logic from rev-parse to keep this feature arc self-contained.
A follow-up refactoring series will be sent immediately after this
to introduce a shared repo-info helper library, deduplicating this
and other overlapping path logic across repo and rev-parse.
K Jayatheerth (7):
repo: add path.toplevel with absolute and relative suffix formatting
repo: add path.superproject-root with absolute and relative suffixes
repo: add path.hooks with absolute and relative suffixes
repo: add path.index with absolute and relative suffixes
repo: add path.grafts with absolute and relative suffixes
repo: add path.git-prefix
repo: add path.cdup
Documentation/git-repo.adoc | 62 ++++++++++++
builtin/repo.c | 151 ++++++++++++++++++++++++++++
builtin/rev-parse.c | 2 +-
submodule.c | 43 ++++----
submodule.h | 2 +-
t/t1900-repo-info.sh | 195 +++++++++++++++++++++++++++++++++++-
6 files changed, 430 insertions(+), 25 deletions(-)
Range-diff against v5:
1: 4ce9dcb24e = 1: 3880485020 repo: add path.toplevel with absolute and relative suffix formatting
2: c431008d40 ! 2: e75e17b44e repo: add path.superproject-root with absolute and relative suffixes
@@ builtin/repo.c: static int get_path_gitdir_relative(struct repository *repo, str
return 0;
}
-+static int get_path_superproject_absolute(struct repository *repo UNUSED, struct strbuf *buf)
++static int get_path_superproject_absolute(struct repository *repo, struct strbuf *buf)
+{
+ struct strbuf superproject = STRBUF_INIT;
+
-+ if (!get_superproject_working_tree(&superproject)) {
++ if (!get_superproject_working_tree(repo, &superproject)) {
+ strbuf_release(&superproject);
+ return 0;
+ }
@@ builtin/repo.c: static int get_path_gitdir_relative(struct repository *repo, str
+{
+ struct strbuf superproject = STRBUF_INIT;
+
-+ if (!get_superproject_working_tree(&superproject)) {
++ if (!get_superproject_working_tree(repo, &superproject)) {
+ strbuf_release(&superproject);
+ return 0;
+ }
@@ builtin/repo.c: static const struct repo_info_field repo_info_field[] = {
{ "path.toplevel.relative", get_path_toplevel_relative },
{ "references.format", get_references_format },
+ ## builtin/rev-parse.c ##
+@@ builtin/rev-parse.c: int cmd_rev_parse(int argc,
+ }
+ if (!strcmp(arg, "--show-superproject-working-tree")) {
+ struct strbuf superproject = STRBUF_INIT;
+- if (get_superproject_working_tree(&superproject))
++ if (get_superproject_working_tree(the_repository, &superproject))
+ print_path(superproject.buf, prefix, format, DEFAULT_UNMODIFIED);
+ strbuf_release(&superproject);
+ continue;
+
+ ## submodule.c ##
+@@ submodule.c: void absorb_git_dir_into_superproject(const char *path,
+ absorb_git_dir_into_superproject_recurse(path, super_prefix);
+ }
+
+-int get_superproject_working_tree(struct strbuf *buf)
++int get_superproject_working_tree(struct repository *r, struct strbuf *buf)
+ {
+ struct child_process cp = CHILD_PROCESS_INIT;
+ struct strbuf sb = STRBUF_INIT;
+ struct strbuf one_up = STRBUF_INIT;
+- char *cwd = xgetcwd();
++ struct strbuf target_wt = STRBUF_INIT;
++ const char *worktree;
+ int ret = 0;
+ const char *subpath;
+ int code;
+ ssize_t len;
+
+- if (!is_inside_work_tree(the_repository))
+- /*
+- * FIXME:
+- * We might have a superproject, but it is harder
+- * to determine.
+- */
++ worktree = repo_get_work_tree(r);
++ if (!worktree)
++ goto out;
++
++ if (!strbuf_realpath(&target_wt, worktree, 0))
+ goto out;
+
+- if (!strbuf_realpath(&one_up, "../", 0))
++ strbuf_addf(&one_up, "%s/..", target_wt.buf);
++ if (!strbuf_realpath(&one_up, one_up.buf, 0))
+ goto out;
+
+- subpath = relative_path(cwd, one_up.buf, &sb);
++ subpath = relative_path(target_wt.buf, one_up.buf, &sb);
+
+ prepare_submodule_repo_env(&cp.env);
+ strvec_pop(&cp.env);
+
+- strvec_pushl(&cp.args, "--literal-pathspecs", "-C", "..",
++ strvec_pushl(&cp.args, "--literal-pathspecs", "-C", one_up.buf,
+ "ls-files", "-z", "--stage", "--full-name", "--",
+ subpath, NULL);
+ strbuf_reset(&sb);
+@@ submodule.c: int get_superproject_working_tree(struct strbuf *buf)
+ cp.git_cmd = 1;
+
+ if (start_command(&cp))
+- die(_("could not start ls-files in .."));
++ die(_("could not start ls-files in %s"), one_up.buf);
+
+ len = strbuf_read(&sb, cp.out, PATH_MAX);
+ close(cp.out);
+
+ if (starts_with(sb.buf, "160000")) {
+ int super_sub_len;
+- int cwd_len = strlen(cwd);
++ int wt_len = target_wt.len;
+ char *super_sub, *super_wt;
+
+ /*
+@@ submodule.c: int get_superproject_working_tree(struct strbuf *buf)
+ super_sub = strchr(sb.buf, '\t') + 1;
+ super_sub_len = strlen(super_sub);
+
+- if (super_sub_len > cwd_len ||
+- strcmp(&cwd[cwd_len - super_sub_len], super_sub))
+- BUG("returned path string doesn't match cwd?");
++ if (super_sub_len > wt_len ||
++ strcmp(&target_wt.buf[wt_len - super_sub_len], super_sub))
++ BUG("returned path string doesn't match worktree?");
+
+- super_wt = xstrdup(cwd);
+- super_wt[cwd_len - super_sub_len] = '\0';
++ super_wt = xstrdup(target_wt.buf);
++ super_wt[wt_len - super_sub_len] = '\0';
+
+ strbuf_realpath(buf, super_wt, 1);
+ ret = 1;
+@@ submodule.c: int get_superproject_working_tree(struct strbuf *buf)
+ code = finish_command(&cp);
+
+ if (code == 128)
+- /* '../' is not a git repository */
++ /* parent directory is not a git repository */
+ ret = 0;
+ else if (code == 0 && len == 0)
+- /* There is an unrelated git repository at '../' */
++ /* There is an unrelated git repository at parent directory */
+ ret = 0;
+ else if (code)
+ die(_("ls-tree returned unexpected return code %d"), code);
+@@ submodule.c: int get_superproject_working_tree(struct strbuf *buf)
+ out:
+ strbuf_release(&sb);
+ strbuf_release(&one_up);
+- free(cwd);
++ strbuf_release(&target_wt);
+ return ret;
+ }
+
+
+ ## submodule.h ##
+@@ submodule.h: void absorb_git_dir_into_superproject(const char *path,
+ * project is a submodule of. If this repository is not a submodule of
+ * another repository, return 0.
+ */
+-int get_superproject_working_tree(struct strbuf *buf);
++int get_superproject_working_tree(struct repository *r, struct strbuf *buf);
+
+ #endif
+
## t/t1900-repo-info.sh ##
@@ t/t1900-repo-info.sh: test_repo_info_path 'gitdir with explicit GIT_DIR' 'gitdir' \
'.git' \
@@ t/t1900-repo-info.sh: test_repo_info_path 'gitdir with explicit GIT_DIR' 'gitdir
test_expect_success 'path.toplevel absolute and relative' '
test_when_finished "rm -rf repo" &&
git init repo &&
+@@ t/t1900-repo-info.sh: test_expect_success 'path.toplevel absolute and relative in a bare repository' '
+ )
+ '
+
++test_expect_success 'path.superproject-root works with --git-dir' '
++ 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" &&
++
++ SUPER_ROOT="$(test-tool path-utils real_path .)" &&
++ MODULE_DIR="$SUPER_ROOT/.git/modules/sub" &&
++
++ echo "path.superproject-root.absolute=$SUPER_ROOT" >expect &&
++ git --git-dir="$MODULE_DIR" repo info path.superproject-root.absolute >actual &&
++ test_cmp expect actual
++ )
++'
+ test_done
3: 8664f8aaae ! 3: ae8a2592b3 repo: add path.hooks with absolute and relative suffixes
@@ builtin/repo.c: static int get_path_gitdir_relative(struct repository *repo, str
+ return 0;
+}
+
- static int get_path_superproject_absolute(struct repository *repo UNUSED, struct strbuf *buf)
+ static int get_path_superproject_absolute(struct repository *repo, struct strbuf *buf)
{
struct strbuf superproject = STRBUF_INIT;
@@ builtin/repo.c: static const struct repo_info_field repo_info_field[] = {
4: 438f7e4e16 ! 4: 7f27bf14b9 repo: add path.index with absolute and relative suffixes
@@ builtin/repo.c: static int get_path_hooks_relative(struct repository *repo, stru
+ return 0;
+}
+
- static int get_path_superproject_absolute(struct repository *repo UNUSED, struct strbuf *buf)
+ static int get_path_superproject_absolute(struct repository *repo, struct strbuf *buf)
{
struct strbuf superproject = STRBUF_INIT;
@@ builtin/repo.c: static const struct repo_info_field repo_info_field[] = {
5: 82be68426c = 5: cc52587980 repo: add path.grafts with absolute and relative suffixes
6: 346f1654d3 = 6: 77bf284a05 repo: add path.git-prefix
7: 3ccdd9b5e4 = 7: e30d98f5da repo: add path.cdup
--
2.55.GIT
next prev parent reply other threads:[~2026-09-11 14:46 UTC|newest]
Thread overview: 82+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-16 1:21 [GSoC Patch 0/7] repo: add more path keys to git repo info K Jayatheerth
2026-07-16 1:21 ` [GSoC Patch 1/7] repo: add path.toplevel with absolute and relative suffix formatting K Jayatheerth
2026-08-15 23:06 ` Lucas Seiki Oshiro
2026-08-18 16:09 ` K Jayatheerth
2026-07-16 1:21 ` [GSoC Patch 2/7] repo: add path.superproject-working-tree with absolute and relative suffixes K Jayatheerth
2026-07-16 1:21 ` [GSoC Patch 3/7] repo: add path.objects with absolute and relative suffix formatting K Jayatheerth
2026-07-16 1:21 ` [GSoC Patch 4/7] repo: add path.hooks " K Jayatheerth
2026-07-16 1:21 ` [GSoC Patch 5/7] repo: add path.index " K Jayatheerth
2026-07-16 1:21 ` [GSoC Patch 6/7] repo: add path.grafts " K Jayatheerth
2026-07-16 1:21 ` [GSoC Patch 7/7] repo: add path.git-prefix path key validation K Jayatheerth
2026-07-16 3:23 ` Junio C Hamano
2026-07-16 15:36 ` K Jayatheerth
2026-07-17 13:30 ` [GSoC Patch v2 0/7] repo: add more path keys to git repo info K Jayatheerth
2026-07-17 13:30 ` [GSoC Patch v2 1/7] repo: add path.toplevel with absolute and relative suffix formatting K Jayatheerth
2026-07-17 13:30 ` [GSoC Patch v2 2/7] repo: add path.superproject-working-tree with absolute and relative suffixes K Jayatheerth
2026-07-17 13:30 ` [GSoC Patch v2 3/7] repo: add path.objects with absolute and relative suffix formatting K Jayatheerth
2026-07-17 13:30 ` [GSoC Patch v2 4/7] repo: add path.hooks " K Jayatheerth
2026-07-17 13:30 ` [GSoC Patch v2 5/7] repo: add path.index " K Jayatheerth
2026-07-20 0:35 ` Lucas Seiki Oshiro
2026-07-24 17:49 ` K Jayatheerth
2026-07-24 19:21 ` Junio C Hamano
2026-07-17 13:30 ` [GSoC Patch v2 6/7] repo: add path.grafts " K Jayatheerth
2026-07-20 0:20 ` Lucas Seiki Oshiro
2026-07-20 4:01 ` Junio C Hamano
2026-07-21 2:19 ` K Jayatheerth
2026-07-17 13:30 ` [GSoC Patch v2 7/7] repo: add path.git-prefix path key K Jayatheerth
2026-07-26 10:43 ` [GSoC Patch v3 0/7] repo: add more path keys to git repo info K Jayatheerth
2026-07-26 10:43 ` [PATCH v3 1/7] repo: add path.toplevel with absolute and relative suffix formatting K Jayatheerth
2026-07-27 8:45 ` Junio C Hamano
2026-07-28 1:21 ` K Jayatheerth
2026-07-28 16:36 ` Justin Tobler
2026-07-29 16:36 ` K Jayatheerth
2026-07-26 10:43 ` [PATCH v3 2/7] repo: add path.superproject-working-tree with absolute and relative suffixes K Jayatheerth
2026-07-28 16:43 ` Justin Tobler
2026-07-26 10:43 ` [PATCH v3 3/7] repo: add path.objects with absolute and relative suffix formatting K Jayatheerth
2026-07-28 17:12 ` Justin Tobler
2026-07-26 10:43 ` [PATCH v3 4/7] repo: add path.hooks " K Jayatheerth
2026-07-28 19:00 ` Justin Tobler
2026-07-26 10:43 ` [PATCH v3 5/7] repo: add path.index " K Jayatheerth
2026-07-26 10:43 ` [PATCH v3 6/7] repo: add path.grafts " K Jayatheerth
2026-07-26 10:43 ` [PATCH v3 7/7] repo: add path.git-prefix path key K Jayatheerth
2026-07-26 16:29 ` [GSoC Patch v3 0/7] repo: add more path keys to git repo info Junio C Hamano
2026-07-26 17:00 ` K Jayatheerth
2026-07-27 0:57 ` Lucas Seiki Oshiro
2026-07-27 5:55 ` Junio C Hamano
2026-08-06 10:15 ` [GSoC PATCH v4 " K Jayatheerth
2026-08-06 10:15 ` [GSoC PATCH v4 1/7] repo: add path.toplevel with absolute and relative suffix formatting K Jayatheerth
2026-08-06 10:15 ` [GSoC PATCH v4 2/7] repo: add path.superproject-root with absolute and relative suffixes K Jayatheerth
2026-08-06 10:15 ` [GSoC PATCH v4 3/7] repo: add path.hooks " K Jayatheerth
2026-08-06 10:15 ` [GSoC PATCH v4 4/7] repo: add path.index " K Jayatheerth
2026-08-06 10:15 ` [GSoC PATCH v4 5/7] repo: add path.grafts " K Jayatheerth
2026-08-06 10:15 ` [GSoC PATCH v4 6/7] repo: add path.git-prefix K Jayatheerth
2026-08-16 0:53 ` Lucas Seiki Oshiro
2026-08-18 16:33 ` K Jayatheerth
2026-08-18 17:09 ` Junio C Hamano
2026-08-21 14:08 ` K Jayatheerth
2026-08-06 10:15 ` [GSoC PATCH v4 7/7] repo: remove unused setup.h include K Jayatheerth
2026-08-25 17:58 ` [GSoC Patch v5 0/7] add more path keys to git repo info K Jayatheerth
2026-08-25 17:58 ` [GSoC Patch v5 1/7] repo: add path.toplevel with absolute and relative suffix formatting K Jayatheerth
2026-08-25 17:58 ` [GSoC Patch v5 2/7] repo: add path.superproject-root with absolute and relative suffixes K Jayatheerth
2026-09-04 22:09 ` Junio C Hamano
2026-09-05 10:01 ` K Jayatheerth
2026-08-25 17:58 ` [GSoC Patch v5 3/7] repo: add path.hooks " K Jayatheerth
2026-08-25 17:58 ` [GSoC Patch v5 4/7] repo: add path.index " K Jayatheerth
2026-08-25 17:58 ` [GSoC Patch v5 5/7] repo: add path.grafts " K Jayatheerth
2026-08-25 17:58 ` [GSoC Patch v5 6/7] repo: add path.git-prefix K Jayatheerth
2026-08-25 17:58 ` [GSoC Patch v5 7/7] repo: add path.cdup K Jayatheerth
2026-08-25 19:31 ` Junio C Hamano
2026-09-04 14:37 ` K Jayatheerth
2026-08-26 7:23 ` [GSoC Patch v5 0/7] add more path keys to git repo info SZEDER Gábor
2026-08-26 14:18 ` Junio C Hamano
2026-09-11 14:45 ` K Jayatheerth [this message]
2026-09-11 14:45 ` [GSoC Patch v6 1/7] repo: add path.toplevel with absolute and relative suffix formatting K Jayatheerth
2026-09-11 14:45 ` [GSoC Patch v6 2/7] repo: add path.superproject-root with absolute and relative suffixes K Jayatheerth
2026-09-11 22:08 ` Junio C Hamano
2026-09-11 14:45 ` [GSoC Patch v6 3/7] repo: add path.hooks " K Jayatheerth
2026-09-11 14:45 ` [GSoC Patch v6 4/7] repo: add path.index " K Jayatheerth
2026-09-11 16:55 ` Junio C Hamano
2026-09-11 14:45 ` [GSoC Patch v6 5/7] repo: add path.grafts " K Jayatheerth
2026-09-11 14:45 ` [GSoC Patch v6 6/7] repo: add path.git-prefix K Jayatheerth
2026-09-11 14:45 ` [GSoC Patch v6 7/7] repo: add path.cdup K Jayatheerth
2026-09-11 17:37 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260911144519.1011780-1-jayatheerthkulkarni2005@gmail.com \
--to=jayatheerthkulkarni2005@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jltobler@gmail.com \
--cc=lucasseikioshiro@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.