]> git.proxmox.com Git - libgit2.git/blobdiff - src/refdb.c
New upstream version 1.0.1+dfsg.1
[libgit2.git] / src / refdb.c
index 3e7a592f8324b5146b301a22f76e7a7ee6285085..fbbf5193c7cc1322ee0a590b8df507a69020df73 100644 (file)
@@ -5,8 +5,7 @@
  * a Linking Exception. For full terms see the included COPYING file.
  */
 
-#include "common.h"
-#include "posix.h"
+#include "refdb.h"
 
 #include "git2/object.h"
 #include "git2/refs.h"
@@ -14,9 +13,9 @@
 #include "git2/sys/refdb_backend.h"
 
 #include "hash.h"
-#include "refdb.h"
 #include "refs.h"
 #include "reflog.h"
+#include "posix.h"
 
 int git_refdb_new(git_refdb **out, git_repository *repo)
 {
@@ -25,7 +24,7 @@ int git_refdb_new(git_refdb **out, git_repository *repo)
        assert(out && repo);
 
        db = git__calloc(1, sizeof(*db));
-       GITERR_CHECK_ALLOC(db);
+       GIT_ERROR_CHECK_ALLOC(db);
 
        db->repo = repo;
 
@@ -61,16 +60,24 @@ int git_refdb_open(git_refdb **out, git_repository *repo)
 
 static void refdb_free_backend(git_refdb *db)
 {
-       if (db->backend) {
-               if (db->backend->free)
-                       db->backend->free(db->backend);
-               else
-                       git__free(db->backend);
-       }
+       if (db->backend)
+               db->backend->free(db->backend);
 }
 
 int git_refdb_set_backend(git_refdb *db, git_refdb_backend *backend)
 {
+       GIT_ERROR_CHECK_VERSION(backend, GIT_REFDB_BACKEND_VERSION, "git_refdb_backend");
+
+       if (!backend->exists || !backend->lookup || !backend->iterator ||
+           !backend->write || !backend->rename || !backend->del ||
+           !backend->has_log || !backend->ensure_log || !backend->free ||
+           !backend->reflog_read || !backend->reflog_write ||
+           !backend->reflog_rename || !backend->reflog_delete ||
+           (backend->lock && !backend->unlock)) {
+               git_error_set(GIT_ERROR_REFERENCE, "incomplete refdb backend implementation");
+               return GIT_EINVALID;
+       }
+
        refdb_free_backend(db);
        db->backend = backend;
 
@@ -129,13 +136,15 @@ int git_refdb_lookup(git_reference **out, git_refdb *db, const char *ref_name)
 
 int git_refdb_iterator(git_reference_iterator **out, git_refdb *db, const char *glob)
 {
+       int error;
+
        if (!db->backend || !db->backend->iterator) {
-               giterr_set(GITERR_REFERENCE, "This backend doesn't support iterators");
+               git_error_set(GIT_ERROR_REFERENCE, "this backend doesn't support iterators");
                return -1;
        }
 
-       if (db->backend->iterator(out, db->backend, glob) < 0)
-               return -1;
+       if ((error = db->backend->iterator(out, db->backend, glob)) < 0)
+               return error;
 
        GIT_REFCOUNT_INC(db);
        (*out)->db = db;
@@ -236,14 +245,28 @@ int git_refdb_ensure_log(git_refdb *db, const char *refname)
        return db->backend->ensure_log(db->backend, refname);
 }
 
-int git_refdb_init_backend(git_refdb_backend* backend, int version)
+int git_refdb_init_backend(git_refdb_backend *backend, unsigned int version)
 {
-       if (version != GIT_REFDB_BACKEND_VERSION) {
-               giterr_set(GITERR_INVALID, "Invalid version %d for git_refdb_backend", version);
+       GIT_INIT_STRUCTURE_FROM_TEMPLATE(
+               backend, version, git_refdb_backend, GIT_REFDB_BACKEND_INIT);
+       return 0;
+}
+
+int git_refdb_lock(void **payload, git_refdb *db, const char *refname)
+{
+       assert(payload && db && refname);
+
+       if (!db->backend->lock) {
+               git_error_set(GIT_ERROR_REFERENCE, "backend does not support locking");
                return -1;
-       } else {
-               git_refdb_backend b = GIT_REFDB_BACKEND_INIT;
-               memcpy(backend, &b, sizeof(b));
-               return 0;
        }
+
+       return db->backend->lock(payload, db->backend, refname);
+}
+
+int git_refdb_unlock(git_refdb *db, void *payload, int success, int update_reflog, const git_reference *ref, const git_signature *sig, const char *message)
+{
+       assert(db);
+
+       return db->backend->unlock(db->backend, payload, success, update_reflog, ref, sig, message);
 }