Signed-off-by: Christian Couder <chrisc...@tuxfamily.org>
---
 external-odb.c                 | 24 ++++++++++++++++++++++--
 odb-helper.c                   | 30 ++++++++++++++++++++++++++++--
 odb-helper.h                   |  8 +++++++-
 t/t0400-external-odb.sh        |  2 ++
 t/t0410-transfer-e-odb.sh      |  4 +++-
 t/t0420-transfer-http-e-odb.sh |  6 +++---
 6 files changed, 65 insertions(+), 9 deletions(-)

diff --git a/external-odb.c b/external-odb.c
index d11fc98719..0b6e443372 100644
--- a/external-odb.c
+++ b/external-odb.c
@@ -20,6 +20,19 @@ static struct odb_helper *find_or_create_helper(const char 
*name, int len)
        return o;
 }
 
+static enum odb_helper_fetch_kind parse_fetch_kind(const char *key,
+                                                  const char *value)
+{
+       if (!strcasecmp(value, "plainobject"))
+               return ODB_FETCH_KIND_PLAIN_OBJECT;
+       else if (!strcasecmp(value, "gitobject"))
+               return ODB_FETCH_KIND_GIT_OBJECT;
+       else if (!strcasecmp(value, "faultin"))
+               return ODB_FETCH_KIND_FAULT_IN;
+
+       die("unknown value for config '%s': %s", key, value);
+}
+
 static int external_odb_config(const char *var, const char *value, void *data)
 {
        struct odb_helper *o;
@@ -36,8 +49,15 @@ static int external_odb_config(const char *var, const char 
*value, void *data)
 
        if (!strcmp(key, "command"))
                return git_config_string(&o->cmd, var, value);
-       if (!strcmp(key, "plainobjects"))
-               o->store_plain_objects = git_config_bool(var, value);
+       if (!strcmp(key, "fetchkind")) {
+               const char *fetch_kind;
+               int ret = git_config_string(&fetch_kind, var, value);
+               if (!ret) {
+                       o->fetch_kind = parse_fetch_kind(var, fetch_kind);
+                       free((char *)fetch_kind);
+               }
+               return ret;
+       }
 
        return 0;
 }
diff --git a/odb-helper.c b/odb-helper.c
index b33ee81c97..24dc5375cb 100644
--- a/odb-helper.c
+++ b/odb-helper.c
@@ -347,14 +347,40 @@ static int odb_helper_fetch_git_object(struct odb_helper 
*o,
        return 0;
 }
 
+static int odb_helper_fetch_fault_in(struct odb_helper *o,
+                                    const unsigned char *sha1,
+                                    int fd)
+{
+       struct odb_helper_object *obj;
+       struct odb_helper_cmd cmd;
+
+       obj = odb_helper_lookup(o, sha1);
+       if (!obj)
+               return -1;
+
+       if (odb_helper_start(o, &cmd, 0, "get %s", sha1_to_hex(sha1)) < 0)
+               return -1;
+
+       if (odb_helper_finish(o, &cmd))
+               return -1;
+
+       return 0;
+}
+
 int odb_helper_fetch_object(struct odb_helper *o,
                            const unsigned char *sha1,
                            int fd)
 {
-       if (o->store_plain_objects)
+       switch(o->fetch_kind) {
+       case ODB_FETCH_KIND_PLAIN_OBJECT:
                return odb_helper_fetch_plain_object(o, sha1, fd);
-       else
+       case ODB_FETCH_KIND_GIT_OBJECT:
                return odb_helper_fetch_git_object(o, sha1, fd);
+       case ODB_FETCH_KIND_FAULT_IN:
+               return odb_helper_fetch_fault_in(o, sha1, fd);
+       default:
+               BUG("invalid fetch kind '%d'", o->fetch_kind);
+       }
 }
 
 int odb_helper_for_each_object(struct odb_helper *o,
diff --git a/odb-helper.h b/odb-helper.h
index 3953b9bbaf..e3ad8e3316 100644
--- a/odb-helper.h
+++ b/odb-helper.h
@@ -3,10 +3,16 @@
 
 #include "external-odb.h"
 
+enum odb_helper_fetch_kind {
+       ODB_FETCH_KIND_PLAIN_OBJECT = 0,
+       ODB_FETCH_KIND_GIT_OBJECT,
+       ODB_FETCH_KIND_FAULT_IN
+};
+
 struct odb_helper {
        const char *name;
        const char *cmd;
-       int store_plain_objects;
+       enum odb_helper_fetch_kind fetch_kind;
 
        struct odb_helper_object {
                unsigned char sha1[20];
diff --git a/t/t0400-external-odb.sh b/t/t0400-external-odb.sh
index 3c868cad4c..c3cb0fdc84 100755
--- a/t/t0400-external-odb.sh
+++ b/t/t0400-external-odb.sh
@@ -49,6 +49,7 @@ test_expect_success 'alt objects are missing' '
 
 test_expect_success 'helper can retrieve alt objects' '
        test_config odb.magic.command "$HELPER" &&
+       test_config odb.magic.fetchKind "gitObject" &&
        cat >expect <<-\EOF &&
        two
        one
@@ -68,6 +69,7 @@ test_expect_success 'helper can add objects to alt repo' '
 
 test_expect_success 'commit adds objects to alt repo' '
        test_config odb.magic.command "$HELPER" &&
+       test_config odb.magic.fetchKind "gitObject" &&
        test_commit three &&
        hash3=$(git ls-tree HEAD | grep three.t | cut -f1 | cut -d\  -f3) &&
        content=$(cd alt-repo && git show "$hash3") &&
diff --git a/t/t0410-transfer-e-odb.sh b/t/t0410-transfer-e-odb.sh
index 868b55db94..cba89866e2 100755
--- a/t/t0410-transfer-e-odb.sh
+++ b/t/t0410-transfer-e-odb.sh
@@ -89,7 +89,8 @@ HELPER2="\"$PWD\"/odb-helper2"
 test_expect_success 'setup first alternate repo' '
        git init alt-repo1 &&
        test_commit zero &&
-       git config odb.magic.command "$HELPER1"
+       git config odb.magic.command "$HELPER1" &&
+       git config odb.magic.fetchKind "gitObject"
 '
 
 test_expect_success 'setup other repo and its alternate repo' '
@@ -119,6 +120,7 @@ test_expect_success 'other repo gets the blobs from object 
store' '
         test_must_fail git cat-file blob "$hash1" &&
         test_must_fail git cat-file blob "$hash2" &&
         git config odb.magic.command "$HELPER2" &&
+        git config odb.magic.fetchKind "gitObject"
         git cat-file blob "$hash1" &&
         git cat-file blob "$hash2"
        )
diff --git a/t/t0420-transfer-http-e-odb.sh b/t/t0420-transfer-http-e-odb.sh
index 716d722e97..8a5f3adaa7 100755
--- a/t/t0420-transfer-http-e-odb.sh
+++ b/t/t0420-transfer-http-e-odb.sh
@@ -53,7 +53,7 @@ HELPER="\"$PWD\"/odb-http-helper"
 test_expect_success 'setup repo with a root commit and the helper' '
        test_commit zero &&
        git config odb.magic.command "$HELPER" &&
-       git config odb.magic.plainObjects "true"
+       git config odb.magic.fetchKind "plainObject"
 '
 
 test_expect_success 'setup another repo from the first one' '
@@ -108,7 +108,7 @@ test_expect_success 'update other repo from the first one' '
         git fetch origin "refs/odbs/magic/*:refs/odbs/magic/*" &&
         test_must_fail git cat-file blob "$hash1" &&
         git config odb.magic.command "$HELPER" &&
-        git config odb.magic.plainObjects "true" &&
+        git config odb.magic.fetchKind "plainObject" &&
         git cat-file blob "$hash1" &&
         git pull origin master)
 '
@@ -140,7 +140,7 @@ test_expect_success 'no-local initial-refspec clone 
succeeds' '
        mkdir my-other-clone &&
        (cd my-other-clone &&
         git config odb.magic.command "$HELPER" &&
-        git config odb.magic.plainObjects "true" &&
+        git config odb.magic.fetchKind "plainObject" &&
         git -c odb.magic.command="$HELPER" -c odb.magic.plainObjects="true" \
                clone --no-local --initial-refspec 
"refs/odbs/magic/*:refs/odbs/magic/*" .. .)
 '
-- 
2.13.1.565.gbfcd7a9048

Reply via email to