Given $GIT_DIR and $GIT_COMMON_DIR, files-backend is now in charge of
deciding what goes where. The end goal is to pass $GIT_DIR only. A
refs "view" of a linked worktree is a logical ref store that combines
two files backends together.

(*) Not entirely true since strbuf_git_path_submodule() still does path
translation underneath. But that's for another patch.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@gmail.com>
---
 refs/files-backend.c | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/refs/files-backend.c b/refs/files-backend.c
index 24f5bf7f1..74e31d041 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -924,6 +924,9 @@ struct files_ref_store {
         */
        const char *submodule;
 
+       struct strbuf gitdir;
+       struct strbuf gitcommondir;
+
        struct ref_entry *loose;
        struct packed_ref_cache *packed;
 };
@@ -937,6 +940,7 @@ static void files_path(struct files_ref_store *refs, struct 
strbuf *sb,
 {
        struct strbuf tmp = STRBUF_INIT;
        va_list vap;
+       const char *ref;
 
        va_start(vap, fmt);
        strbuf_vaddf(&tmp, fmt, vap);
@@ -944,8 +948,12 @@ static void files_path(struct files_ref_store *refs, 
struct strbuf *sb,
        if (refs->submodule)
                strbuf_git_path_submodule(sb, refs->submodule,
                                          "%s", tmp.buf);
+       else if (is_per_worktree_ref(tmp.buf) ||
+                (skip_prefix(tmp.buf, "logs/", &ref) &&
+                 is_per_worktree_ref(ref)))
+               strbuf_addf(sb, "%s/%s", refs->gitdir.buf, tmp.buf);
        else
-               strbuf_git_path(sb, "%s", tmp.buf);
+               strbuf_addf(sb, "%s/%s", refs->gitcommondir.buf, tmp.buf);
        strbuf_release(&tmp);
 }
 
@@ -1004,7 +1012,15 @@ static struct ref_store *files_ref_store_create(const 
char *submodule)
 
        base_ref_store_init(ref_store, &refs_be_files);
 
-       refs->submodule = xstrdup_or_null(submodule);
+       strbuf_init(&refs->gitdir, 0);
+       strbuf_init(&refs->gitcommondir, 0);
+
+       if (submodule) {
+               refs->submodule = xstrdup(submodule);
+       } else {
+               strbuf_addstr(&refs->gitdir, get_git_dir());
+               strbuf_addstr(&refs->gitcommondir, get_git_common_dir());
+       }
 
        return ref_store;
 }
-- 
2.11.0.157.gd943d85

Reply via email to