]> git.proxmox.com Git - libgit2.git/blobdiff - src/odb_mempack.c
Upload to experimental
[libgit2.git] / src / odb_mempack.c
index d9b3a1824ddfec97e52e9e4e5514bcec910f0eab..6f27f45f870975f4ec53879e5d680db7101c0f35 100644 (file)
@@ -6,25 +6,27 @@
  */
 
 #include "common.h"
-#include "git2/object.h"
-#include "git2/sys/odb_backend.h"
-#include "fileops.h"
+
+#include "buf.h"
+#include "futils.h"
 #include "hash.h"
 #include "odb.h"
 #include "array.h"
 #include "oidmap.h"
+#include "pack-objects.h"
 
 #include "git2/odb_backend.h"
+#include "git2/object.h"
 #include "git2/types.h"
 #include "git2/pack.h"
-
-GIT__USE_OIDMAP;
+#include "git2/sys/odb_backend.h"
+#include "git2/sys/mempack.h"
 
 struct memobject {
        git_oid oid;
        size_t len;
-       git_otype type;
-       char data[];
+       git_object_t type;
+       char data[GIT_FLEX_ARRAY];
 };
 
 struct memory_packer_db {
@@ -33,34 +35,30 @@ struct memory_packer_db {
        git_array_t(struct memobject *) commits;
 };
 
-static int impl__write(git_odb_backend *_backend, const git_oid *oid, const void *data, size_t len, git_otype type)
+static int impl__write(git_odb_backend *_backend, const git_oid *oid, const void *data, size_t len, git_object_t type)
 {
        struct memory_packer_db *db = (struct memory_packer_db *)_backend;
-       struct memobject *obj = NULL; 
-       khiter_t pos;
-       int rval;
-
-       pos = kh_put(oid, db->objects, oid, &rval);
-       if (rval < 0)
-               return -1;
+       struct memobject *obj = NULL;
+       size_t alloc_len;
 
-       if (rval == 0)
+       if (git_oidmap_exists(db->objects, oid))
                return 0;
 
-       obj = git__malloc(sizeof(struct memobject) + len);
-       GITERR_CHECK_ALLOC(obj);
+       GIT_ERROR_CHECK_ALLOC_ADD(&alloc_len, sizeof(struct memobject), len);
+       obj = git__malloc(alloc_len);
+       GIT_ERROR_CHECK_ALLOC(obj);
 
        memcpy(obj->data, data, len);
        git_oid_cpy(&obj->oid, oid);
        obj->len = len;
        obj->type = type;
 
-       kh_key(db->objects, pos) = &obj->oid;
-       kh_val(db->objects, pos) = obj;
+       if (git_oidmap_set(db->objects, &obj->oid, obj) < 0)
+               return -1;
 
-       if (type == GIT_OBJ_COMMIT) {
+       if (type == GIT_OBJECT_COMMIT) {
                struct memobject **store = git_array_alloc(db->commits);
-               GITERR_CHECK_ALLOC(store);
+               GIT_ERROR_CHECK_ALLOC(store);
                *store = obj;
        }
 
@@ -70,54 +68,44 @@ static int impl__write(git_odb_backend *_backend, const git_oid *oid, const void
 static int impl__exists(git_odb_backend *backend, const git_oid *oid)
 {
        struct memory_packer_db *db = (struct memory_packer_db *)backend;
-       khiter_t pos;
 
-       pos = kh_get(oid, db->objects, oid);
-       if (pos != kh_end(db->objects))
-               return 1;
-
-       return 0;
+       return git_oidmap_exists(db->objects, oid);
 }
 
-static int impl__read(void **buffer_p, size_t *len_p, git_otype *type_p, git_odb_backend *backend, const git_oid *oid)
+static int impl__read(void **buffer_p, size_t *len_p, git_object_t *type_p, git_odb_backend *backend, const git_oid *oid)
 {
        struct memory_packer_db *db = (struct memory_packer_db *)backend;
-       struct memobject *obj = NULL;
-       khiter_t pos;
+       struct memobject *obj;
 
-       pos = kh_get(oid, db->objects, oid);
-       if (pos == kh_end(db->objects))
+       if ((obj = git_oidmap_get(db->objects, oid)) == NULL)
                return GIT_ENOTFOUND;
 
-       obj = kh_val(db->objects, pos);
-
        *len_p = obj->len;
        *type_p = obj->type;
        *buffer_p = git__malloc(obj->len);
-       GITERR_CHECK_ALLOC(*buffer_p);
+       GIT_ERROR_CHECK_ALLOC(*buffer_p);
 
        memcpy(*buffer_p, obj->data, obj->len);
        return 0;
 }
 
-static int impl__read_header(size_t *len_p, git_otype *type_p, git_odb_backend *backend, const git_oid *oid)
+static int impl__read_header(size_t *len_p, git_object_t *type_p, git_odb_backend *backend, const git_oid *oid)
 {
        struct memory_packer_db *db = (struct memory_packer_db *)backend;
-       struct memobject *obj = NULL;
-       khiter_t pos;
+       struct memobject *obj;
 
-       pos = kh_get(oid, db->objects, oid);
-       if (pos == kh_end(db->objects))
+       if ((obj = git_oidmap_get(db->objects, oid)) == NULL)
                return GIT_ENOTFOUND;
 
-       obj = kh_val(db->objects, pos);
-
        *len_p = obj->len;
        *type_p = obj->type;
        return 0;
 }
 
-int git_mempack_dump(git_buf *pack, git_repository *repo, git_odb_backend *_backend)
+static int git_mempack__dump(
+       git_str *pack,
+       git_repository *repo,
+       git_odb_backend *_backend)
 {
        struct memory_packer_db *db = (struct memory_packer_db *)_backend;
        git_packbuilder *packbuilder;
@@ -127,6 +115,8 @@ int git_mempack_dump(git_buf *pack, git_repository *repo, git_odb_backend *_back
        if (git_packbuilder_new(&packbuilder, repo) < 0)
                return -1;
 
+       git_packbuilder_set_threads(packbuilder, 0);
+
        for (i = 0; i < db->commits.size; ++i) {
                struct memobject *commit = db->commits.ptr[i];
 
@@ -135,42 +125,59 @@ int git_mempack_dump(git_buf *pack, git_repository *repo, git_odb_backend *_back
                        goto cleanup;
        }
 
-       err = git_packbuilder_write_buf(pack, packbuilder);
+       err = git_packbuilder__write_buf(pack, packbuilder);
 
 cleanup:
        git_packbuilder_free(packbuilder);
        return err;
 }
 
-void git_mempack_reset(git_odb_backend *_backend)
+int git_mempack_dump(
+       git_buf *pack,
+       git_repository *repo,
+       git_odb_backend *_backend)
+{
+       GIT_BUF_WRAP_PRIVATE(pack, git_mempack__dump, repo, _backend);
+}
+
+int git_mempack_reset(git_odb_backend *_backend)
 {
        struct memory_packer_db *db = (struct memory_packer_db *)_backend;
        struct memobject *object = NULL;
 
-       kh_foreach_value(db->objects, object, {
+       git_oidmap_foreach_value(db->objects, object, {
                git__free(object);
        });
 
        git_array_clear(db->commits);
+
+       git_oidmap_clear(db->objects);
+
+       return 0;
 }
 
 static void impl__free(git_odb_backend *_backend)
 {
+       struct memory_packer_db *db = (struct memory_packer_db *)_backend;
+
        git_mempack_reset(_backend);
-       git__free(_backend);
+       git_oidmap_free(db->objects);
+       git__free(db);
 }
 
 int git_mempack_new(git_odb_backend **out)
 {
        struct memory_packer_db *db;
 
-       assert(out);
+       GIT_ASSERT_ARG(out);
 
        db = git__calloc(1, sizeof(struct memory_packer_db));
-       GITERR_CHECK_ALLOC(db);
+       GIT_ERROR_CHECK_ALLOC(db);
 
-       db->objects = git_oidmap_alloc();
+       if (git_oidmap_new(&db->objects) < 0)
+               return -1;
 
+       db->parent.version = GIT_ODB_BACKEND_VERSION;
        db->parent.read = &impl__read;
        db->parent.write = &impl__write;
        db->parent.read_header = &impl__read_header;