aboutsummaryrefslogtreecommitdiff
path: root/refs.c
diff options
context:
space:
mode:
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>2017-03-26 09:42:31 +0700
committerJunio C Hamano <gitster@pobox.com>2017-03-27 10:23:40 -0700
commit5d0bc90e5de37c708f0856aef2c7b353a9d5030b (patch)
tree10f9023727c946102a744b3e318a405c05d6e531 /refs.c
parentbbbb7de7ac69e66c9263bd0e220172fe717b3f54 (diff)
downloadgit-5d0bc90e5de37c708f0856aef2c7b353a9d5030b.tar.gz
git-5d0bc90e5de37c708f0856aef2c7b353a9d5030b.tar.xz
refs: move submodule code out of files-backend.c
files-backend is now initialized with a $GIT_DIR. Converting a submodule path to where real submodule gitdir is located is done in get_ref_store(). This gives a slight performance improvement for submodules since we don't convert submodule path to gitdir at every backend call like before. We pay that once at ref-store creation. More cleanup in files_downcast() and files_assert_main_repository() follows shortly. It's separate to keep noises from this patch. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'refs.c')
-rw-r--r--refs.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/refs.c b/refs.c
index 1f4c1a234..d72b48a43 100644
--- a/refs.c
+++ b/refs.c
@@ -9,6 +9,7 @@
#include "refs/refs-internal.h"
#include "object.h"
#include "tag.h"
+#include "submodule.h"
/*
* List of all available backends
@@ -1413,9 +1414,9 @@ static struct ref_store *lookup_submodule_ref_store(const char *submodule)
/*
* Create, record, and return a ref_store instance for the specified
- * submodule (or the main repository if submodule is NULL).
+ * gitdir.
*/
-static struct ref_store *ref_store_init(const char *submodule)
+static struct ref_store *ref_store_init(const char *gitdir)
{
const char *be_name = "files";
struct ref_storage_be *be = find_ref_storage_backend(be_name);
@@ -1424,7 +1425,7 @@ static struct ref_store *ref_store_init(const char *submodule)
if (!be)
die("BUG: reference backend %s is unknown", be_name);
- refs = be->init(submodule);
+ refs = be->init(gitdir);
return refs;
}
@@ -1433,7 +1434,7 @@ struct ref_store *get_main_ref_store(void)
if (main_ref_store)
return main_ref_store;
- main_ref_store = ref_store_init(NULL);
+ main_ref_store = ref_store_init(get_git_dir());
return main_ref_store;
}
@@ -1474,8 +1475,16 @@ struct ref_store *get_ref_store(const char *submodule)
if (!ret)
return NULL;
- refs = ref_store_init(submodule);
+ ret = submodule_to_gitdir(&submodule_sb, submodule);
+ if (ret) {
+ strbuf_release(&submodule_sb);
+ return NULL;
+ }
+
+ refs = ref_store_init(submodule_sb.buf);
register_submodule_ref_store(refs, submodule);
+
+ strbuf_release(&submodule_sb);
return refs;
}