]> git.ipfire.org Git - thirdparty/git.git/commitdiff
repo: add path.git-prefix path key
authorK Jayatheerth <jayatheerthkulkarni2005@gmail.com>
Sun, 26 Jul 2026 10:43:43 +0000 (16:13 +0530)
committerJunio C Hamano <gitster@pobox.com>
Sun, 26 Jul 2026 14:13:32 +0000 (07:13 -0700)
Scripts and command-line prompt integrations frequently need to know their
relative depth inside a repository working tree layout. Currently, this
is retrieved using `git rev-parse --show-prefix`.

Introduce the `path.git-prefix` key to `git repo info`. This mirrors the
prefix location tracking framework as a standalone key, returning the
exact relative path offset complete with a trailing slash, or an empty
string if run directly at the repository 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>
Documentation/git-repo.adoc
builtin/repo.c
t/t1900-repo-info.sh

index def888da91dbb824a170874a435db3a6711729ad..98282ea6683e75d26e2723e8e03ccfbdd10e7135 100644 (file)
@@ -113,6 +113,11 @@ values that they return:
        The path to the Git repository's common directory relative to
        the current working directory.
 
+`path.git-prefix`::
+       The relative path from the top-level directory of the working tree to
+       the current working directory (including a trailing slash). Outputs an
+       empty string if executed at the root of the working tree.
+
 `path.gitdir.absolute`::
        The canonical absolute path to the Git repository directory (the `.git` directory).
 
index a97ad7164956a80cb67b9e1568a3fa7f81c4d2e2..b93c140c741aa65cd4b81bd0f46c67de6b6036da 100644 (file)
@@ -100,6 +100,16 @@ static int get_path_commondir_relative(struct repository *repo, struct strbuf *b
        return 0;
 }
 
+static int get_path_git_prefix(struct repository *repo UNUSED, struct strbuf *buf)
+{
+       /*
+        * startup_info->prefix is NULL if we are at the working tree root.
+        * We add an empty string to ensure the buffer is cleanly initialized.
+        */
+       strbuf_addstr(buf, startup_info->prefix ? startup_info->prefix : "");
+       return 0;
+}
+
 static int get_path_gitdir_absolute(struct repository *repo, struct strbuf *buf)
 {
        const char *git_dir = repo_get_git_dir(repo);
@@ -278,6 +288,7 @@ static const struct repo_info_field repo_info_field[] = {
        { "object.format", get_object_format },
        { "path.commondir.absolute", get_path_commondir_absolute },
        { "path.commondir.relative", get_path_commondir_relative },
+       { "path.git-prefix", get_path_git_prefix },
        { "path.gitdir.absolute", get_path_gitdir_absolute },
        { "path.gitdir.relative", get_path_gitdir_relative },
        { "path.grafts.absolute", get_path_grafts_absolute },
index 15a4ec9b78c2f470908384a0ef230428e079af5e..2879e5466851a5827442f542f8277a21a03157cb 100755 (executable)
@@ -207,6 +207,25 @@ test_repo_info_path 'commondir with only GIT_DIR' 'commondir' \
        '.git' \
        'GIT_DIR="../.git" && export GIT_DIR'
 
+test_expect_success 'path.git-prefix at root and in a subdirectory' '
+       test_when_finished "rm -rf repo" &&
+       git init repo &&
+       (
+               cd repo &&
+
+               echo "path.git-prefix=" >expect.root &&
+               git repo info path.git-prefix >actual.root &&
+               test_cmp expect.root actual.root &&
+
+               mkdir -p sub/dir &&
+               cd sub/dir &&
+
+               echo "path.git-prefix=sub/dir/" >expect.sub &&
+               git repo info path.git-prefix >actual.sub &&
+               test_cmp expect.sub actual.sub
+       )
+'
+
 test_repo_info_path 'gitdir standard' 'gitdir' '.git'
 
 test_repo_info_path 'gitdir with explicit GIT_DIR' 'gitdir' \