repo: add path.cdup

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.

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 <jltobler@gmail.com>
Mentored-by: Lucas Seiki Oshiro <lucasseikioshiro@gmail.com>
Signed-off-by: K Jayatheerth <jayatheerthkulkarni2005@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
seen
K Jayatheerth 2026-08-25 23:28:18 +05:30 committed by Junio C Hamano
parent 5a6afc2ec4
commit 94acbee610
3 changed files with 43 additions and 0 deletions

View File

@ -104,6 +104,11 @@ 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,

View File

@ -78,6 +78,20 @@ 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);
@ -258,6 +272,7 @@ 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 },

View File

@ -215,6 +215,29 @@ 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 &&