summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Nguyễn Thái Ngọc Duy <pclouds@gmail.com>2017-03-26 09:42:24 +0700
committerLibravatar Junio C Hamano <gitster@pobox.com>2017-03-27 10:23:39 -0700
commitf57f37e2e1bf11ab4cdfd221ad47e961ba9353a0 (patch)
treefca2a0880617fd008a633b1be6c7586d6ba0271d
parentfiles-backend: add and use files_ref_path() (diff)
downloadtgif-f57f37e2e1bf11ab4cdfd221ad47e961ba9353a0.tar.xz
files-backend: remove the use of git_path()
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 <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--refs/files-backend.c43
1 files changed, 38 insertions, 5 deletions
diff --git a/refs/files-backend.c b/refs/files-backend.c
index 741e52d143..9676cd32e4 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -923,7 +923,8 @@ struct files_ref_store {
* store:
*/
const char *submodule;
-
+ char *gitdir;
+ char *gitcommondir;
char *packed_refs_path;
struct ref_entry *loose;
@@ -985,6 +986,8 @@ static struct ref_store *files_ref_store_create(const char *submodule)
{
struct files_ref_store *refs = xcalloc(1, sizeof(*refs));
struct ref_store *ref_store = (struct ref_store *)refs;
+ struct strbuf sb = STRBUF_INIT;
+ const char *gitdir = get_git_dir();
base_ref_store_init(ref_store, &refs_be_files);
@@ -995,7 +998,11 @@ static struct ref_store *files_ref_store_create(const char *submodule)
return ref_store;
}
- refs->packed_refs_path = git_pathdup("packed-refs");
+ refs->gitdir = xstrdup(gitdir);
+ get_common_dir_noenv(&sb, gitdir);
+ refs->gitcommondir = strbuf_detach(&sb, NULL);
+ strbuf_addf(&sb, "%s/packed-refs", refs->gitcommondir);
+ refs->packed_refs_path = strbuf_detach(&sb, NULL);
return ref_store;
}
@@ -1173,11 +1180,26 @@ static void files_reflog_path(struct files_ref_store *refs,
const char *refname)
{
if (!refname) {
- strbuf_git_path(sb, "logs");
+ /*
+ * FIXME: of course this is wrong in multi worktree
+ * setting. To be fixed real soon.
+ */
+ strbuf_addf(sb, "%s/logs", refs->gitcommondir);
return;
}
- strbuf_git_path(sb, "logs/%s", refname);
+ switch (ref_type(refname)) {
+ case REF_TYPE_PER_WORKTREE:
+ case REF_TYPE_PSEUDOREF:
+ strbuf_addf(sb, "%s/logs/%s", refs->gitdir, refname);
+ break;
+ case REF_TYPE_NORMAL:
+ strbuf_addf(sb, "%s/logs/%s", refs->gitcommondir, refname);
+ break;
+ default:
+ die("BUG: unknown ref type %d of ref %s",
+ ref_type(refname), refname);
+ }
}
static void files_ref_path(struct files_ref_store *refs,
@@ -1189,7 +1211,18 @@ static void files_ref_path(struct files_ref_store *refs,
return;
}
- strbuf_git_path(sb, "%s", refname);
+ switch (ref_type(refname)) {
+ case REF_TYPE_PER_WORKTREE:
+ case REF_TYPE_PSEUDOREF:
+ strbuf_addf(sb, "%s/%s", refs->gitdir, refname);
+ break;
+ case REF_TYPE_NORMAL:
+ strbuf_addf(sb, "%s/%s", refs->gitcommondir, refname);
+ break;
+ default:
+ die("BUG: unknown ref type %d of ref %s",
+ ref_type(refname), refname);
+ }
}
/*