Commit 21ca0451 by Russell Belfer

Move git_reference__alloc to include/git2/sys

Create a new include/git2/sys/refs.h and move the reference alloc
functions there.  Also fix some documentation issues and some
minor code cleanups.
parent 4dcd8780
...@@ -22,25 +22,6 @@ ...@@ -22,25 +22,6 @@
GIT_BEGIN_DECL GIT_BEGIN_DECL
/** /**
* Create a new reference. Either an oid or a symbolic target must be
* specified.
*
* @param refdb the reference database to associate with this reference
* @param name the reference name
* @param oid the object id for a direct reference
* @param symbolic the target for a symbolic reference
* @return the created git_reference or NULL on error
*/
GIT_EXTERN(git_reference *) git_reference__alloc(
const char *name,
const git_oid *oid,
const git_oid *peel);
GIT_EXTERN(git_reference *) git_reference__alloc_symbolic(
const char *name,
const char *target);
/**
* Create a new reference database with no backends. * Create a new reference database with no backends.
* *
* Before the Ref DB can be used for read/writing, a custom database * Before the Ref DB can be used for read/writing, a custom database
......
...@@ -4,8 +4,8 @@ ...@@ -4,8 +4,8 @@
* This file is part of libgit2, distributed under the GNU GPL v2 with * This file is part of libgit2, distributed under the GNU GPL v2 with
* a Linking Exception. For full terms see the included COPYING file. * a Linking Exception. For full terms see the included COPYING file.
*/ */
#ifndef INCLUDE_git_refdb_backend_h__ #ifndef INCLUDE_sys_git_refdb_backend_h__
#define INCLUDE_git_refdb_backend_h__ #define INCLUDE_sys_git_refdb_backend_h__
#include "git2/common.h" #include "git2/common.h"
#include "git2/types.h" #include "git2/types.h"
...@@ -30,7 +30,7 @@ struct git_refdb_backend { ...@@ -30,7 +30,7 @@ struct git_refdb_backend {
*/ */
int (*exists)( int (*exists)(
int *exists, int *exists,
struct git_refdb_backend *backend, git_refdb_backend *backend,
const char *ref_name); const char *ref_name);
/** /**
...@@ -39,7 +39,7 @@ struct git_refdb_backend { ...@@ -39,7 +39,7 @@ struct git_refdb_backend {
*/ */
int (*lookup)( int (*lookup)(
git_reference **out, git_reference **out,
struct git_refdb_backend *backend, git_refdb_backend *backend,
const char *ref_name); const char *ref_name);
/** /**
...@@ -47,7 +47,7 @@ struct git_refdb_backend { ...@@ -47,7 +47,7 @@ struct git_refdb_backend {
* provide this function. * provide this function.
*/ */
int (*foreach)( int (*foreach)(
struct git_refdb_backend *backend, git_refdb_backend *backend,
unsigned int list_flags, unsigned int list_flags,
git_reference_foreach_cb callback, git_reference_foreach_cb callback,
void *payload); void *payload);
...@@ -59,7 +59,7 @@ struct git_refdb_backend { ...@@ -59,7 +59,7 @@ struct git_refdb_backend {
* against the glob. * against the glob.
*/ */
int (*foreach_glob)( int (*foreach_glob)(
struct git_refdb_backend *backend, git_refdb_backend *backend,
const char *glob, const char *glob,
unsigned int list_flags, unsigned int list_flags,
git_reference_foreach_cb callback, git_reference_foreach_cb callback,
...@@ -69,13 +69,13 @@ struct git_refdb_backend { ...@@ -69,13 +69,13 @@ struct git_refdb_backend {
* Writes the given reference to the refdb. A refdb implementation * Writes the given reference to the refdb. A refdb implementation
* must provide this function. * must provide this function.
*/ */
int (*write)(struct git_refdb_backend *backend, const git_reference *ref); int (*write)(git_refdb_backend *backend, const git_reference *ref);
/** /**
* Deletes the given reference from the refdb. A refdb implementation * Deletes the given reference from the refdb. A refdb implementation
* must provide this function. * must provide this function.
*/ */
int (*delete)(struct git_refdb_backend *backend, const git_reference *ref); int (*delete)(git_refdb_backend *backend, const git_reference *ref);
/** /**
* Suggests that the given refdb compress or optimize its references. * Suggests that the given refdb compress or optimize its references.
...@@ -84,31 +84,41 @@ struct git_refdb_backend { ...@@ -84,31 +84,41 @@ struct git_refdb_backend {
* implementation may provide this function; if it is not provided, * implementation may provide this function; if it is not provided,
* nothing will be done. * nothing will be done.
*/ */
int (*compress)(struct git_refdb_backend *backend); int (*compress)(git_refdb_backend *backend);
/** /**
* Frees any resources held by the refdb. A refdb implementation may * Frees any resources held by the refdb. A refdb implementation may
* provide this function; if it is not provided, nothing will be done. * provide this function; if it is not provided, nothing will be done.
*/ */
void (*free)(struct git_refdb_backend *backend); void (*free)(git_refdb_backend *backend);
}; };
#define GIT_ODB_BACKEND_VERSION 1 #define GIT_ODB_BACKEND_VERSION 1
#define GIT_ODB_BACKEND_INIT {GIT_ODB_BACKEND_VERSION} #define GIT_ODB_BACKEND_INIT {GIT_ODB_BACKEND_VERSION}
/** /**
* Constructors for default refdb backends. * Constructors for default filesystem-based refdb backend
*
* Under normal usage, this is called for you when the repository is
* opened / created, but you can use this to explicitly construct a
* filesystem refdb backend for a repository.
*
* @param backend_out Output pointer to the git_refdb_backend object
* @param repo Git repository to access
* @return 0 on success, <0 error code on failure
*/ */
GIT_EXTERN(int) git_refdb_backend_fs( GIT_EXTERN(int) git_refdb_backend_fs(
struct git_refdb_backend **backend_out, git_refdb_backend **backend_out,
git_repository *repo); git_repository *repo);
/** /**
* Sets the custom backend to an existing reference DB * Sets the custom backend to an existing reference DB
* *
* The `git_refdb` will take ownership of the `git_refdb_backend` so you
* should NOT free it after calling this function.
*
* @param refdb database to add the backend to * @param refdb database to add the backend to
* @param backend pointer to a git_refdb_backend instance * @param backend pointer to a git_refdb_backend instance
* @param priority Value for ordering the backends queue
* @return 0 on success; error code otherwise * @return 0 on success; error code otherwise
*/ */
GIT_EXTERN(int) git_refdb_set_backend( GIT_EXTERN(int) git_refdb_set_backend(
......
/*
* Copyright (C) the libgit2 contributors. All rights reserved.
*
* This file is part of libgit2, distributed under the GNU GPL v2 with
* a Linking Exception. For full terms see the included COPYING file.
*/
#ifndef INCLUDE_sys_git_refdb_h__
#define INCLUDE_sys_git_refdb_h__
#include "git2/common.h"
#include "git2/types.h"
#include "git2/oid.h"
/**
* Create a new direct reference from an OID.
*
* @param name the reference name
* @param oid the object id for a direct reference
* @param symbolic the target for a symbolic reference
* @return the created git_reference or NULL on error
*/
GIT_EXTERN(git_reference *) git_reference__alloc(
const char *name,
const git_oid *oid,
const git_oid *peel);
/**
* Create a new symbolic reference.
*
* @param name the reference name
* @param symbolic the target for a symbolic reference
* @return the created git_reference or NULL on error
*/
GIT_EXTERN(git_reference *) git_reference__alloc_symbolic(
const char *name,
const char *target);
#endif
...@@ -58,15 +58,19 @@ int git_refdb_open(git_refdb **out, git_repository *repo) ...@@ -58,15 +58,19 @@ int git_refdb_open(git_refdb **out, git_repository *repo)
return 0; return 0;
} }
int git_refdb_set_backend(git_refdb *db, git_refdb_backend *backend) static void refdb_free_backend(git_refdb *db)
{ {
if (db->backend) { if (db->backend) {
if(db->backend->free) if (db->backend->free)
db->backend->free(db->backend); db->backend->free(db->backend);
else else
git__free(db->backend); git__free(db->backend);
} }
}
int git_refdb_set_backend(git_refdb *db, git_refdb_backend *backend)
{
refdb_free_backend(db);
db->backend = backend; db->backend = backend;
return 0; return 0;
...@@ -76,22 +80,15 @@ int git_refdb_compress(git_refdb *db) ...@@ -76,22 +80,15 @@ int git_refdb_compress(git_refdb *db)
{ {
assert(db); assert(db);
if (db->backend->compress) { if (db->backend->compress)
return db->backend->compress(db->backend); return db->backend->compress(db->backend);
}
return 0; return 0;
} }
static void refdb_free(git_refdb *db) static void refdb_free(git_refdb *db)
{ {
if (db->backend) { refdb_free_backend(db);
if(db->backend->free)
db->backend->free(db->backend);
else
git__free(db->backend);
}
git__free(db); git__free(db);
} }
...@@ -115,14 +112,13 @@ int git_refdb_lookup(git_reference **out, git_refdb *db, const char *ref_name) ...@@ -115,14 +112,13 @@ int git_refdb_lookup(git_reference **out, git_refdb *db, const char *ref_name)
git_reference *ref; git_reference *ref;
int error; int error;
assert(db && db->backend && ref_name); assert(db && db->backend && out && ref_name);
*out = NULL;
if ((error = db->backend->lookup(&ref, db->backend, ref_name)) == 0) if (!(error = db->backend->lookup(&ref, db->backend, ref_name))) {
{
ref->db = db; ref->db = db;
*out = ref; *out = ref;
} else {
*out = NULL;
} }
return error; return error;
......
...@@ -41,6 +41,6 @@ int git_refdb_foreach_glob( ...@@ -41,6 +41,6 @@ int git_refdb_foreach_glob(
int git_refdb_write(git_refdb *refdb, const git_reference *ref); int git_refdb_write(git_refdb *refdb, const git_reference *ref);
int git_refdb_delete(struct git_refdb *refdb, const git_reference *ref); int git_refdb_delete(git_refdb *refdb, const git_reference *ref);
#endif #endif
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <git2/object.h> #include <git2/object.h>
#include <git2/refdb.h> #include <git2/refdb.h>
#include <git2/sys/refdb_backend.h> #include <git2/sys/refdb_backend.h>
#include <git2/sys/refs.h>
GIT__USE_STRMAP; GIT__USE_STRMAP;
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <git2/branch.h> #include <git2/branch.h>
#include <git2/refs.h> #include <git2/refs.h>
#include <git2/refdb.h> #include <git2/refdb.h>
#include <git2/sys/refs.h>
GIT__USE_STRMAP; GIT__USE_STRMAP;
...@@ -44,8 +45,7 @@ static git_reference *alloc_ref(const char *name) ...@@ -44,8 +45,7 @@ static git_reference *alloc_ref(const char *name)
} }
git_reference *git_reference__alloc_symbolic( git_reference *git_reference__alloc_symbolic(
const char *name, const char *name, const char *target)
const char *target)
{ {
git_reference *ref; git_reference *ref;
......
...@@ -63,7 +63,6 @@ void test_refdb_inmemory__initialize(void) ...@@ -63,7 +63,6 @@ void test_refdb_inmemory__initialize(void)
cl_git_pass(git_repository_refdb(&refdb, repo)); cl_git_pass(git_repository_refdb(&refdb, repo));
cl_git_pass(refdb_backend_test(&refdb_backend, repo)); cl_git_pass(refdb_backend_test(&refdb_backend, repo));
cl_git_pass(git_refdb_set_backend(refdb, refdb_backend)); cl_git_pass(git_refdb_set_backend(refdb, refdb_backend));
git_refdb_free(refdb);
ref_file_foreach(repo, unlink_ref); ref_file_foreach(repo, unlink_ref);
......
#include <git2/errors.h> #include <git2/errors.h>
#include <git2/repository.h> #include <git2/repository.h>
#include <git2/refdb.h> #include <git2/refdb.h>
#include <git2/sys/refs.h>
#include <git2/sys/refdb_backend.h> #include <git2/sys/refdb_backend.h>
int refdb_backend_test( int refdb_backend_test(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment