On Mon, Feb 12, 2018 at 05:22:15PM -0800, Stefan Beller wrote:
> This is a real take on the first part of the recent RFC[1].
>
> ...
> 
> Duy suggested that we shall not use the repository blindly, but
> should carefully examine whether to pass on an object store or the
> refstore or such[4], which I agree with if it makes sense. This
> series unfortunately has an issue with that as I would not want to
> pass down the `ignore_env` flag separately from the object store, so
> I made all functions that only take the object store to have the raw
> object store as the first parameter, and others using the full
> repository.

Second proposal :) How about you store ignore_env in raw_object_store?
This would not be the first time an object has some configuration
passed in at construction time. And it has a "constructor" now,
raw_object_store_init() (I probably should merge _setup in it too)

The core changes look like this. I have a full commit on top of your
series [1] that keeps sha1_file.c functions take 'struct
raw_object_store' instead.

[1] https://github.com/pclouds/git/tree/object-store-part1

-- 8< --
diff --git a/object-store.h b/object-store.h
index f164c4e5c9..a8bf1738f2 100644
--- a/object-store.h
+++ b/object-store.h
@@ -34,9 +34,13 @@ struct raw_object_store {
         * packs.
         */
        unsigned packed_git_initialized : 1;
+
+       unsigned ignore_env : 1;
 };
 #define RAW_OBJECT_STORE_INIT { NULL, NULL, MRU_INIT, NULL, NULL, 0, 0, 0 }
 
+void raw_object_store_init(struct raw_object_store *ros, struct repository *r);
+void raw_object_store_setup(struct raw_object_store *ros, char *);
 void raw_object_store_clear(struct raw_object_store *o);
 
 struct packed_git {
diff --git a/object.c b/object.c
index 79c2c447bc..a4534bf4c4 100644
--- a/object.c
+++ b/object.c
@@ -461,6 +461,20 @@ static void free_alt_odbs(struct raw_object_store *o)
        }
 }
 
+void raw_object_store_init(struct raw_object_store *o,
+                          struct repository *r)
+{
+       /* FIXME: memset? */
+       o->ignore_env = r->ignore_env;
+}
+
+void raw_object_store_setup(struct raw_object_store *o,
+                           char *objectdir)
+{
+       free(o->objectdir);
+       o->objectdir = objectdir;
+}
+
 void raw_object_store_clear(struct raw_object_store *o)
 {
        free(o->objectdir);
diff --git a/repository.c b/repository.c
index bd2ad578de..ac5863d7e1 100644
--- a/repository.c
+++ b/repository.c
@@ -49,9 +49,9 @@ static void repo_setup_env(struct repository *repo)
                                                    !repo->ignore_env);
        free(repo->commondir);
        repo->commondir = strbuf_detach(&sb, NULL);
-       free(repo->objects.objectdir);
-       repo->objects.objectdir = git_path_from_env(DB_ENVIRONMENT, 
repo->commondir,
-                                           "objects", !repo->ignore_env);
+       raw_object_store_setup(&repo->objects,
+                              git_path_from_env(DB_ENVIRONMENT, 
repo->commondir,
+                                                "objects", !repo->ignore_env));
        free(repo->graft_file);
        repo->graft_file = git_path_from_env(GRAFT_ENVIRONMENT, repo->commondir,
                                             "info/grafts", !repo->ignore_env);
@@ -142,6 +142,8 @@ int repo_init(struct repository *repo, const char *gitdir, 
const char *worktree)
 
        repo->ignore_env = 1;
 
+       raw_object_store_init(&repo->objects, repo);
+
        if (repo_init_gitdir(repo, gitdir))
                goto error;
 
diff --git a/sha1_file.c b/sha1_file.c
index c3f35914ce..3be58651a1 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -677,14 +677,14 @@ int foreach_alt_odb(alt_odb_fn fn, void *cb)
        return r;
 }
 
-void prepare_alt_odb(struct repository *r)
+void prepare_alt_odb(struct raw_object_store *ros)
 {
        if (r->objects.alt_odb_tail)
                return;
 
        r->objects.alt_odb_tail = &r->objects.alt_odb_list;
 
-       if (!r->ignore_env) {
+       if (!ros->ignore_env) {
                const char *alt = getenv(ALTERNATE_DB_ENVIRONMENT);
                if (!alt)
                        alt = "";
-- 8< --


--
Duy

Reply via email to