]> granicus.if.org Git - git/commitdiff
refs: move submodule code out of files-backend.c
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Sun, 26 Mar 2017 02:42:31 +0000 (09:42 +0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 27 Mar 2017 17:23:40 +0000 (10:23 -0700)
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>
refs.c
refs/files-backend.c
refs/refs-internal.h

diff --git a/refs.c b/refs.c
index 1f4c1a234783379fecd4fe0c1072f9d5958bceb9..d72b48a43024193d21d061848081ea54c78f4399 100644 (file)
--- 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;
 }
 
index b62f374f9ce0b3bb9bc85e75d99d9ca83a51ad9a..490f05a6f42151157099f30feaed28a80ff88a89 100644 (file)
@@ -917,12 +917,6 @@ struct packed_ref_cache {
 struct files_ref_store {
        struct ref_store base;
 
-       /*
-        * The name of the submodule represented by this object, or
-        * NULL if it represents the main repository's reference
-        * store:
-        */
-       const char *submodule;
        char *gitdir;
        char *gitcommondir;
        char *packed_refs_path;
@@ -982,22 +976,14 @@ static void clear_loose_ref_cache(struct files_ref_store *refs)
  * Create a new submodule ref cache and add it to the internal
  * set of caches.
  */
-static struct ref_store *files_ref_store_create(const char *submodule)
+static struct ref_store *files_ref_store_create(const char *gitdir)
 {
        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);
 
-       if (submodule) {
-               refs->submodule = xstrdup(submodule);
-               refs->packed_refs_path = git_pathdup_submodule(
-                       refs->submodule, "packed-refs");
-               return ref_store;
-       }
-
        refs->gitdir = xstrdup(gitdir);
        get_common_dir_noenv(&sb, gitdir);
        refs->gitcommondir = strbuf_detach(&sb, NULL);
@@ -1014,8 +1000,7 @@ static struct ref_store *files_ref_store_create(const char *submodule)
 static void files_assert_main_repository(struct files_ref_store *refs,
                                         const char *caller)
 {
-       if (refs->submodule)
-               die("BUG: %s called for a submodule", caller);
+       /* This function is to be fixed up in the next patch */
 }
 
 /*
@@ -1206,11 +1191,6 @@ static void files_ref_path(struct files_ref_store *refs,
                           struct strbuf *sb,
                           const char *refname)
 {
-       if (refs->submodule) {
-               strbuf_git_path_submodule(sb, refs->submodule, "%s", refname);
-               return;
-       }
-
        switch (ref_type(refname)) {
        case REF_TYPE_PER_WORKTREE:
        case REF_TYPE_PSEUDOREF:
index f732473e1d02a34dde17714c75ccbbda6070a34a..dfa18179291920d58197fa4c7d830234573087fc 100644 (file)
@@ -482,12 +482,11 @@ struct ref_store;
 /* refs backends */
 
 /*
- * Initialize the ref_store for the specified submodule, or for the
- * main repository if submodule == NULL. These functions should call
- * base_ref_store_init() to initialize the shared part of the
- * ref_store and to record the ref_store for later lookup.
+ * Initialize the ref_store for the specified gitdir. These functions
+ * should call base_ref_store_init() to initialize the shared part of
+ * the ref_store and to record the ref_store for later lookup.
  */
-typedef struct ref_store *ref_store_init_fn(const char *submodule);
+typedef struct ref_store *ref_store_init_fn(const char *gitdir);
 
 typedef int ref_init_db_fn(struct ref_store *refs, struct strbuf *err);