From: K Jayatheerth Date: Tue, 25 Aug 2026 17:58:11 GMT Subject: [GSoC Patch v5 0/7] add more path keys to git repo info Message-ID: <20260825175818.645579-1-jayatheerthkulkarni2005@gmail.com> 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 v4: * Add path.cdup in git repo. * Drop unused header cleanup patch as it will be sent in the next set of cleanup only patches. 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 ++++++++++++++++++++++++++++++ t/t1900-repo-info.sh | 177 +++++++++++++++++++++++++++++++++++- 3 files changed, 388 insertions(+), 2 deletions(-) Range-diff against v4: 1: db54cf2177 = 1: 3880485020 repo: add path.toplevel with absolute and relative suffix formatting 2: 5f5ab2b844 = 2: 1b7b0d286c repo: add path.superproject-root with absolute and relative suffixes 3: a8c3526958 = 3: 517f621eb0 repo: add path.hooks with absolute and relative suffixes 4: a419389911 = 4: 37d28712de repo: add path.index with absolute and relative suffixes 5: a5a28f2e92 = 5: d88340f5a6 repo: add path.grafts with absolute and relative suffixes 6: 39775f8d2f = 6: 38b19d8bfd repo: add path.git-prefix 7: 74dbca6f17 ! 7: d6ce98e25e repo: remove unused setup.h include @@ Metadata Author: K Jayatheerth ## Commit message ## - repo: remove unused setup.h include + repo: add path.cdup - The repository prefix is now stored in `struct repository`, so - builtin/repo.c no longer uses any declarations from setup.h. + Scripts sometimes need the relative path from the current working + directory to the repository's working tree root (cdup). While this + information can be retrieved through `git rev-parse --show-cdup`, + `git repo info` does not currently expose it as a scriptable key. - Remove the now-unused include. + Introduce the `path.cdup` key to `git repo info`. The key returns the + path from the current working directory to the root of the working tree, + returning the empty string when invoked from the working tree root. Mentored-by: Justin Tobler Mentored-by: Lucas Seiki Oshiro Signed-off-by: K Jayatheerth + ## Documentation/git-repo.adoc ## +@@ Documentation/git-repo.adoc: values that they return: + `object.format`:: + The object format (hash algorithm) used in the repository. + ++`path.cdup`:: ++ The path to the root of the working tree relative to the current ++ working directory. Returns the empty string when the current ++ working directory is the root of the working tree. ++ + `path.commondir.absolute`:: + The canonical absolute path to the Git repository's common + directory (the shared `.git` directory containing objects, + ## builtin/repo.c ## -@@ - #include "ref-filter.h" - #include "refs.h" - #include "revision.h" --#include "setup.h" - #include "strbuf.h" - #include "string-list.h" - #include "shallow.h" +@@ builtin/repo.c: static int get_object_format(struct repository *repo, struct strbuf *buf) + return 0; + } + ++static int get_path_cdup(struct repository *repo, struct strbuf *buf) ++{ ++ const char *pfx = repo->prefix; ++ ++ while (pfx) { ++ pfx = strchr(pfx, '/'); ++ if (pfx) { ++ pfx++; ++ strbuf_addstr(buf, "../"); ++ } ++ } ++ return 0; ++} ++ + static int get_path_commondir_absolute(struct repository *repo, struct strbuf *buf) + { + const char *common_dir = repo_get_common_dir(repo); +@@ builtin/repo.c: static const struct repo_info_field repo_info_field[] = { + { "layout.bare", get_layout_bare }, + { "layout.shallow", get_layout_shallow }, + { "object.format", get_object_format }, ++ { "path.cdup", get_path_cdup }, + { "path.commondir.absolute", get_path_commondir_absolute }, + { "path.commondir.relative", get_path_commondir_relative }, + { "path.git-prefix", get_path_git_prefix }, + + ## t/t1900-repo-info.sh ## +@@ t/t1900-repo-info.sh: test_repo_info_path 'commondir with only GIT_DIR' 'commondir' \ + '.git' \ + 'GIT_DIR="../.git" && export GIT_DIR' + ++test_expect_success 'path.cdup at repository root' ' ++ test_when_finished "rm -rf repo" && ++ git init repo && ++ ( ++ cd repo && ++ echo "path.cdup=" >expect && ++ git repo info path.cdup >actual && ++ test_cmp expect actual ++ ) ++' ++ ++test_expect_success 'path.cdup in subdirectory' ' ++ test_when_finished "rm -rf repo" && ++ git init repo && ++ mkdir -p repo/sub/dir && ++ ( ++ cd repo/sub/dir && ++ echo "path.cdup=../../" >expect && ++ git repo info path.cdup >actual && ++ test_cmp expect actual ++ ) ++' ++ + test_expect_success 'path.git-prefix at repository root' ' + test_when_finished "rm -rf repo" && + git init repo && -- 2.55.GIT