mirror of
https://git.proxmox.com/git/libgit2
synced 2025-08-05 10:52:22 +00:00
Move refdb_backend to include/git2/sys
This moves most of the refdb stuff over to the include/git2/sys directory, with some minor shifts in function organization. While I was making the necessary updates, I also removed the trailing whitespace in a few files that I modified just because I was there and it was bugging me.
This commit is contained in:
parent
9233b3de4e
commit
4dcd878019
@ -81,20 +81,6 @@ GIT_EXTERN(int) git_refdb_compress(git_refdb *refdb);
|
||||
*/
|
||||
GIT_EXTERN(void) git_refdb_free(git_refdb *refdb);
|
||||
|
||||
/**
|
||||
* Sets the custom backend to an existing reference DB
|
||||
*
|
||||
* Read <refdb_backends.h> for more information.
|
||||
*
|
||||
* @param refdb database to add the backend to
|
||||
* @param backend pointer to a git_refdb_backend instance
|
||||
* @param priority Value for ordering the backends queue
|
||||
* @return 0 on success; error code otherwise
|
||||
*/
|
||||
GIT_EXTERN(int) git_refdb_set_backend(
|
||||
git_refdb *refdb,
|
||||
git_refdb_backend *backend);
|
||||
|
||||
/** @} */
|
||||
GIT_END_DECL
|
||||
|
||||
|
@ -7,9 +7,9 @@
|
||||
#ifndef INCLUDE_git_refdb_backend_h__
|
||||
#define INCLUDE_git_refdb_backend_h__
|
||||
|
||||
#include "common.h"
|
||||
#include "types.h"
|
||||
#include "oid.h"
|
||||
#include "git2/common.h"
|
||||
#include "git2/types.h"
|
||||
#include "git2/oid.h"
|
||||
|
||||
/**
|
||||
* @file git2/refdb_backend.h
|
||||
@ -103,6 +103,18 @@ GIT_EXTERN(int) git_refdb_backend_fs(
|
||||
struct git_refdb_backend **backend_out,
|
||||
git_repository *repo);
|
||||
|
||||
/**
|
||||
* Sets the custom backend to an existing reference DB
|
||||
*
|
||||
* @param refdb database to add the backend to
|
||||
* @param backend pointer to a git_refdb_backend instance
|
||||
* @param priority Value for ordering the backends queue
|
||||
* @return 0 on success; error code otherwise
|
||||
*/
|
||||
GIT_EXTERN(int) git_refdb_set_backend(
|
||||
git_refdb *refdb,
|
||||
git_refdb_backend *backend);
|
||||
|
||||
GIT_END_DECL
|
||||
|
||||
#endif
|
@ -7,15 +7,16 @@
|
||||
|
||||
#include "common.h"
|
||||
#include "posix.h"
|
||||
|
||||
#include "git2/object.h"
|
||||
#include "git2/refs.h"
|
||||
#include "git2/refdb.h"
|
||||
#include "git2/sys/refdb_backend.h"
|
||||
|
||||
#include "hash.h"
|
||||
#include "refdb.h"
|
||||
#include "refs.h"
|
||||
|
||||
#include "git2/refdb_backend.h"
|
||||
|
||||
int git_refdb_new(git_refdb **out, git_repository *repo)
|
||||
{
|
||||
git_refdb *db;
|
||||
@ -74,11 +75,11 @@ int git_refdb_set_backend(git_refdb *db, git_refdb_backend *backend)
|
||||
int git_refdb_compress(git_refdb *db)
|
||||
{
|
||||
assert(db);
|
||||
|
||||
|
||||
if (db->backend->compress) {
|
||||
return db->backend->compress(db->backend);
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -18,7 +18,7 @@
|
||||
#include <git2/tag.h>
|
||||
#include <git2/object.h>
|
||||
#include <git2/refdb.h>
|
||||
#include <git2/refdb_backend.h>
|
||||
#include <git2/sys/refdb_backend.h>
|
||||
|
||||
GIT__USE_STRMAP;
|
||||
|
||||
@ -61,7 +61,7 @@ static int reference_read(
|
||||
/* Determine the full path of the file */
|
||||
if (git_buf_joinpath(&path, repo_path, ref_name) < 0)
|
||||
return -1;
|
||||
|
||||
|
||||
result = git_futils_readbuffer_updated(file_content, path.ptr, mtime, NULL, updated);
|
||||
git_buf_free(&path);
|
||||
|
||||
@ -174,7 +174,7 @@ static int packed_load(refdb_fs_backend *backend)
|
||||
ref_cache->packfile = git_strmap_alloc();
|
||||
GITERR_CHECK_ALLOC(ref_cache->packfile);
|
||||
}
|
||||
|
||||
|
||||
result = reference_read(&packfile, &ref_cache->packfile_time,
|
||||
backend->path, GIT_PACKEDREFS_FILE, &updated);
|
||||
|
||||
@ -192,7 +192,7 @@ static int packed_load(refdb_fs_backend *backend)
|
||||
|
||||
if (result < 0)
|
||||
return -1;
|
||||
|
||||
|
||||
if (!updated)
|
||||
return 0;
|
||||
|
||||
@ -433,7 +433,7 @@ static int loose_lookup(
|
||||
} else {
|
||||
if ((error = loose_parse_oid(&oid, &ref_file)) < 0)
|
||||
goto done;
|
||||
|
||||
|
||||
*out = git_reference__alloc(ref_name, &oid, NULL);
|
||||
}
|
||||
|
||||
@ -455,19 +455,19 @@ static int packed_map_entry(
|
||||
|
||||
if (packed_load(backend) < 0)
|
||||
return -1;
|
||||
|
||||
|
||||
/* Look up on the packfile */
|
||||
packfile_refs = backend->refcache.packfile;
|
||||
|
||||
*pos = git_strmap_lookup_index(packfile_refs, ref_name);
|
||||
|
||||
|
||||
if (!git_strmap_valid_index(packfile_refs, *pos)) {
|
||||
giterr_set(GITERR_REFERENCE, "Reference '%s' not found", ref_name);
|
||||
return GIT_ENOTFOUND;
|
||||
}
|
||||
|
||||
*entry = git_strmap_value_at(packfile_refs, *pos);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -479,14 +479,14 @@ static int packed_lookup(
|
||||
struct packref *entry;
|
||||
khiter_t pos;
|
||||
int error = 0;
|
||||
|
||||
|
||||
if ((error = packed_map_entry(&entry, &pos, backend, ref_name)) < 0)
|
||||
return error;
|
||||
|
||||
if ((*out = git_reference__alloc(ref_name,
|
||||
&entry->oid, &entry->peel)) == NULL)
|
||||
return -1;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -582,7 +582,7 @@ static int refdb_fs_backend__foreach(
|
||||
git_buf refs_path = GIT_BUF_INIT;
|
||||
const char *ref_name;
|
||||
void *ref = NULL;
|
||||
|
||||
|
||||
GIT_UNUSED(ref);
|
||||
|
||||
assert(_backend);
|
||||
@ -590,7 +590,7 @@ static int refdb_fs_backend__foreach(
|
||||
|
||||
if (packed_load(backend) < 0)
|
||||
return -1;
|
||||
|
||||
|
||||
/* list all the packed references first */
|
||||
if (list_type & GIT_REF_OID) {
|
||||
git_strmap_foreach(backend->refcache.packfile, ref_name, ref, {
|
||||
@ -924,7 +924,7 @@ static int refdb_fs_backend__delete(
|
||||
repo = backend->repo;
|
||||
|
||||
/* If a loose reference exists, remove it from the filesystem */
|
||||
|
||||
|
||||
if (git_buf_joinpath(&loose_path, repo->path_repository, ref->name) < 0)
|
||||
return -1;
|
||||
|
||||
@ -932,7 +932,7 @@ static int refdb_fs_backend__delete(
|
||||
error = p_unlink(loose_path.ptr);
|
||||
loose_deleted = 1;
|
||||
}
|
||||
|
||||
|
||||
git_buf_free(&loose_path);
|
||||
|
||||
if (error != 0)
|
||||
@ -946,7 +946,7 @@ static int refdb_fs_backend__delete(
|
||||
|
||||
error = packed_write(backend);
|
||||
}
|
||||
|
||||
|
||||
if (pack_error == GIT_ENOTFOUND)
|
||||
error = loose_deleted ? 0 : GIT_ENOTFOUND;
|
||||
else
|
||||
|
45
src/refs.c
45
src/refs.c
@ -19,7 +19,6 @@
|
||||
#include <git2/branch.h>
|
||||
#include <git2/refs.h>
|
||||
#include <git2/refdb.h>
|
||||
#include <git2/refdb_backend.h>
|
||||
|
||||
GIT__USE_STRMAP;
|
||||
|
||||
@ -255,10 +254,10 @@ int git_reference_lookup_resolved(
|
||||
max_nesting = MAX_NESTING_LEVEL;
|
||||
else if (max_nesting < 0)
|
||||
max_nesting = DEFAULT_NESTING_LEVEL;
|
||||
|
||||
|
||||
strncpy(scan_name, name, GIT_REFNAME_MAX);
|
||||
scan_type = GIT_REF_SYMBOLIC;
|
||||
|
||||
|
||||
if ((error = git_repository_refdb__weakptr(&refdb, repo)) < 0)
|
||||
return -1;
|
||||
|
||||
@ -276,7 +275,7 @@ int git_reference_lookup_resolved(
|
||||
|
||||
if ((error = git_refdb_lookup(&ref, refdb, scan_name)) < 0)
|
||||
return error;
|
||||
|
||||
|
||||
scan_type = ref->type;
|
||||
}
|
||||
|
||||
@ -354,7 +353,7 @@ static int reference__create(
|
||||
git_refdb *refdb;
|
||||
git_reference *ref = NULL;
|
||||
int error = 0;
|
||||
|
||||
|
||||
if (ref_out)
|
||||
*ref_out = NULL;
|
||||
|
||||
@ -369,7 +368,7 @@ static int reference__create(
|
||||
} else {
|
||||
ref = git_reference__alloc_symbolic(name, symbolic);
|
||||
}
|
||||
|
||||
|
||||
GITERR_CHECK_ALLOC(ref);
|
||||
ref->db = refdb;
|
||||
|
||||
@ -377,7 +376,7 @@ static int reference__create(
|
||||
git_reference_free(ref);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
if (ref_out == NULL)
|
||||
git_reference_free(ref);
|
||||
else
|
||||
@ -397,17 +396,17 @@ int git_reference_create(
|
||||
int error = 0;
|
||||
|
||||
assert(repo && name && oid);
|
||||
|
||||
|
||||
/* Sanity check the reference being created - target must exist. */
|
||||
if ((error = git_repository_odb__weakptr(&odb, repo)) < 0)
|
||||
return error;
|
||||
|
||||
|
||||
if (!git_odb_exists(odb, oid)) {
|
||||
giterr_set(GITERR_REFERENCE,
|
||||
"Target OID for the reference doesn't exist on the repository");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
return reference__create(ref_out, repo, name, oid, NULL, force);
|
||||
}
|
||||
|
||||
@ -422,7 +421,7 @@ int git_reference_symbolic_create(
|
||||
int error = 0;
|
||||
|
||||
assert(repo && name && target);
|
||||
|
||||
|
||||
if ((error = git_reference__normalize_name_lax(
|
||||
normalized, sizeof(normalized), target)) < 0)
|
||||
return error;
|
||||
@ -436,7 +435,7 @@ int git_reference_set_target(
|
||||
const git_oid *id)
|
||||
{
|
||||
assert(out && ref && id);
|
||||
|
||||
|
||||
if (ref->type != GIT_REF_OID) {
|
||||
giterr_set(GITERR_REFERENCE, "Cannot set OID on symbolic reference");
|
||||
return -1;
|
||||
@ -451,13 +450,13 @@ int git_reference_symbolic_set_target(
|
||||
const char *target)
|
||||
{
|
||||
assert(out && ref && target);
|
||||
|
||||
|
||||
if (ref->type != GIT_REF_SYMBOLIC) {
|
||||
giterr_set(GITERR_REFERENCE,
|
||||
"Cannot set symbolic target on a direct reference");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
return git_reference_symbolic_create(out, ref->db->repo, ref->name, target, 1);
|
||||
}
|
||||
|
||||
@ -473,7 +472,7 @@ int git_reference_rename(
|
||||
git_reference *result = NULL;
|
||||
int error = 0;
|
||||
int reference_has_log;
|
||||
|
||||
|
||||
*out = NULL;
|
||||
|
||||
normalization_flags = ref->type == GIT_REF_SYMBOLIC ?
|
||||
@ -488,7 +487,7 @@ int git_reference_rename(
|
||||
* Create the new reference.
|
||||
*/
|
||||
if (ref->type == GIT_REF_OID) {
|
||||
result = git_reference__alloc(new_name, &ref->target.oid, &ref->peel);
|
||||
result = git_reference__alloc(new_name, &ref->target.oid, &ref->peel);
|
||||
} else if (ref->type == GIT_REF_SYMBOLIC) {
|
||||
result = git_reference__alloc_symbolic(new_name, ref->target.symbolic);
|
||||
} else {
|
||||
@ -509,11 +508,11 @@ int git_reference_rename(
|
||||
/* Now delete the old ref and save the new one. */
|
||||
if ((error = git_refdb_delete(ref->db, ref)) < 0)
|
||||
goto on_error;
|
||||
|
||||
|
||||
/* Save the new reference. */
|
||||
if ((error = git_refdb_write(ref->db, result)) < 0)
|
||||
goto rollback;
|
||||
|
||||
|
||||
/* Update HEAD it was poiting to the reference being renamed. */
|
||||
if (should_head_be_updated && (error = git_repository_set_head(ref->db->repo, new_name)) < 0) {
|
||||
giterr_set(GITERR_REFERENCE, "Failed to update HEAD after renaming reference");
|
||||
@ -547,7 +546,7 @@ int git_reference_resolve(git_reference **ref_out, const git_reference *ref)
|
||||
switch (git_reference_type(ref)) {
|
||||
case GIT_REF_OID:
|
||||
return git_reference_lookup(ref_out, ref->db->repo, ref->name);
|
||||
|
||||
|
||||
case GIT_REF_SYMBOLIC:
|
||||
return git_reference_lookup_resolved(ref_out, ref->db->repo, ref->target.symbolic, -1);
|
||||
|
||||
@ -846,7 +845,7 @@ static int reference__update_terminal(
|
||||
|
||||
if (nesting > MAX_NESTING_LEVEL)
|
||||
return GIT_ENOTFOUND;
|
||||
|
||||
|
||||
error = git_reference_lookup(&ref, repo, ref_name);
|
||||
|
||||
/* If we haven't found the reference at all, create a new reference. */
|
||||
@ -854,10 +853,10 @@ static int reference__update_terminal(
|
||||
giterr_clear();
|
||||
return git_reference_create(NULL, repo, ref_name, oid, 0);
|
||||
}
|
||||
|
||||
|
||||
if (error < 0)
|
||||
return error;
|
||||
|
||||
|
||||
/* If the ref is a symbolic reference, follow its target. */
|
||||
if (git_reference_type(ref) == GIT_REF_SYMBOLIC) {
|
||||
error = reference__update_terminal(repo, git_reference_symbolic_target(ref), oid,
|
||||
@ -867,7 +866,7 @@ static int reference__update_terminal(
|
||||
git_reference_free(ref);
|
||||
error = git_reference_create(NULL, repo, ref_name, oid, 1);
|
||||
}
|
||||
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
|
@ -7,6 +7,8 @@
|
||||
#ifndef INCLUDE_util_h__
|
||||
#define INCLUDE_util_h__
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
|
||||
#define bitsizeof(x) (CHAR_BIT * sizeof(x))
|
||||
#define MSB(x, bits) ((x) & (~0ULL << (bitsizeof(x) - (bits))))
|
||||
|
@ -1,12 +1,15 @@
|
||||
#include "clar_libgit2.h"
|
||||
#include "refdb.h"
|
||||
#include "repository.h"
|
||||
|
||||
#include "buffer.h"
|
||||
#include "posix.h"
|
||||
#include "path.h"
|
||||
#include "refs.h"
|
||||
|
||||
#include "testdb.h"
|
||||
|
||||
#define TEST_REPO_PATH "testrepo"
|
||||
|
||||
static git_repository *repo;
|
||||
static git_refdb_backend *refdb_backend;
|
||||
|
||||
int unlink_ref(void *payload, git_buf *file)
|
||||
{
|
||||
@ -26,7 +29,7 @@ int ref_file_foreach(git_repository *repo, int (* cb)(void *payload, git_buf *fi
|
||||
const char *repo_path;
|
||||
git_buf repo_refs_dir = GIT_BUF_INIT;
|
||||
int error = 0;
|
||||
|
||||
|
||||
repo_path = git_repository_path(repo);
|
||||
|
||||
git_buf_joinpath(&repo_refs_dir, repo_path, "HEAD");
|
||||
@ -38,7 +41,7 @@ int ref_file_foreach(git_repository *repo, int (* cb)(void *payload, git_buf *fi
|
||||
git_buf_joinpath(&repo_refs_dir, git_buf_cstr(&repo_refs_dir), "heads");
|
||||
if (git_path_direach(&repo_refs_dir, cb, NULL) != 0)
|
||||
return -1;
|
||||
|
||||
|
||||
git_buf_joinpath(&repo_refs_dir, repo_path, "packed-refs");
|
||||
if (git_path_exists(git_buf_cstr(&repo_refs_dir)) &&
|
||||
cb(NULL, &repo_refs_dir) < 0)
|
||||
@ -51,16 +54,17 @@ int ref_file_foreach(git_repository *repo, int (* cb)(void *payload, git_buf *fi
|
||||
|
||||
void test_refdb_inmemory__initialize(void)
|
||||
{
|
||||
git_refdb *refdb;
|
||||
|
||||
git_buf repo_refs_dir = GIT_BUF_INIT;
|
||||
git_refdb *refdb;
|
||||
git_refdb_backend *refdb_backend;
|
||||
|
||||
repo = cl_git_sandbox_init(TEST_REPO_PATH);
|
||||
|
||||
cl_git_pass(git_repository_refdb(&refdb, repo));
|
||||
cl_git_pass(refdb_backend_test(&refdb_backend, repo));
|
||||
cl_git_pass(git_refdb_set_backend(refdb, refdb_backend));
|
||||
|
||||
git_refdb_free(refdb);
|
||||
|
||||
ref_file_foreach(repo, unlink_ref);
|
||||
|
||||
git_buf_free(&repo_refs_dir);
|
||||
@ -76,10 +80,10 @@ void test_refdb_inmemory__doesnt_write_ref_file(void)
|
||||
{
|
||||
git_reference *ref;
|
||||
git_oid oid;
|
||||
|
||||
|
||||
cl_git_pass(git_oid_fromstr(&oid, "c47800c7266a2be04c571c04d5a6614691ea99bd"));
|
||||
cl_git_pass(git_reference_create(&ref, repo, GIT_REFS_HEADS_DIR "test1", &oid, 0));
|
||||
|
||||
|
||||
ref_file_foreach(repo, empty);
|
||||
|
||||
git_reference_free(ref);
|
||||
@ -89,10 +93,10 @@ void test_refdb_inmemory__read(void)
|
||||
{
|
||||
git_reference *write1, *write2, *write3, *read1, *read2, *read3;
|
||||
git_oid oid1, oid2, oid3;
|
||||
|
||||
|
||||
cl_git_pass(git_oid_fromstr(&oid1, "c47800c7266a2be04c571c04d5a6614691ea99bd"));
|
||||
cl_git_pass(git_reference_create(&write1, repo, GIT_REFS_HEADS_DIR "test1", &oid1, 0));
|
||||
|
||||
|
||||
cl_git_pass(git_oid_fromstr(&oid2, "e90810b8df3e80c413d903f631643c716887138d"));
|
||||
cl_git_pass(git_reference_create(&write2, repo, GIT_REFS_HEADS_DIR "test2", &oid2, 0));
|
||||
|
||||
@ -139,7 +143,7 @@ int foreach_test(const char *ref_name, void *payload)
|
||||
cl_assert(git_oid_cmp(&expected, git_reference_target(ref)) == 0);
|
||||
|
||||
++(*i);
|
||||
|
||||
|
||||
git_reference_free(ref);
|
||||
|
||||
return 0;
|
||||
@ -150,19 +154,19 @@ void test_refdb_inmemory__foreach(void)
|
||||
git_reference *write1, *write2, *write3;
|
||||
git_oid oid1, oid2, oid3;
|
||||
size_t i = 0;
|
||||
|
||||
|
||||
cl_git_pass(git_oid_fromstr(&oid1, "c47800c7266a2be04c571c04d5a6614691ea99bd"));
|
||||
cl_git_pass(git_reference_create(&write1, repo, GIT_REFS_HEADS_DIR "test1", &oid1, 0));
|
||||
|
||||
|
||||
cl_git_pass(git_oid_fromstr(&oid2, "e90810b8df3e80c413d903f631643c716887138d"));
|
||||
cl_git_pass(git_reference_create(&write2, repo, GIT_REFS_HEADS_DIR "test2", &oid2, 0));
|
||||
|
||||
|
||||
cl_git_pass(git_oid_fromstr(&oid3, "763d71aadf09a7951596c9746c024e7eece7c7af"));
|
||||
cl_git_pass(git_reference_create(&write3, repo, GIT_REFS_HEADS_DIR "test3", &oid3, 0));
|
||||
|
||||
|
||||
cl_git_pass(git_reference_foreach(repo, GIT_REF_LISTALL, foreach_test, &i));
|
||||
cl_assert_equal_i(3, (int)i);
|
||||
|
||||
|
||||
git_reference_free(write1);
|
||||
git_reference_free(write2);
|
||||
git_reference_free(write3);
|
||||
@ -175,14 +179,14 @@ int delete_test(const char *ref_name, void *payload)
|
||||
size_t *i = payload;
|
||||
|
||||
cl_git_pass(git_reference_lookup(&ref, repo, ref_name));
|
||||
|
||||
cl_git_pass(git_oid_fromstr(&expected, "e90810b8df3e80c413d903f631643c716887138d"));
|
||||
|
||||
cl_git_pass(git_oid_fromstr(&expected, "e90810b8df3e80c413d903f631643c716887138d"));
|
||||
cl_assert(git_oid_cmp(&expected, git_reference_target(ref)) == 0);
|
||||
|
||||
|
||||
++(*i);
|
||||
|
||||
|
||||
git_reference_free(ref);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -191,22 +195,22 @@ void test_refdb_inmemory__delete(void)
|
||||
git_reference *write1, *write2, *write3;
|
||||
git_oid oid1, oid2, oid3;
|
||||
size_t i = 0;
|
||||
|
||||
|
||||
cl_git_pass(git_oid_fromstr(&oid1, "c47800c7266a2be04c571c04d5a6614691ea99bd"));
|
||||
cl_git_pass(git_reference_create(&write1, repo, GIT_REFS_HEADS_DIR "test1", &oid1, 0));
|
||||
|
||||
|
||||
cl_git_pass(git_oid_fromstr(&oid2, "e90810b8df3e80c413d903f631643c716887138d"));
|
||||
cl_git_pass(git_reference_create(&write2, repo, GIT_REFS_HEADS_DIR "test2", &oid2, 0));
|
||||
|
||||
|
||||
cl_git_pass(git_oid_fromstr(&oid3, "763d71aadf09a7951596c9746c024e7eece7c7af"));
|
||||
cl_git_pass(git_reference_create(&write3, repo, GIT_REFS_HEADS_DIR "test3", &oid3, 0));
|
||||
|
||||
|
||||
git_reference_delete(write1);
|
||||
git_reference_free(write1);
|
||||
|
||||
|
||||
git_reference_delete(write3);
|
||||
git_reference_free(write3);
|
||||
|
||||
|
||||
cl_git_pass(git_reference_foreach(repo, GIT_REF_LISTALL, delete_test, &i));
|
||||
cl_assert_equal_i(1, (int)i);
|
||||
|
||||
|
@ -1,14 +1,10 @@
|
||||
#include "common.h"
|
||||
#include "vector.h"
|
||||
#include "util.h"
|
||||
#include <git2/refdb.h>
|
||||
#include <git2/refdb_backend.h>
|
||||
#include <git2/errors.h>
|
||||
#include <git2/repository.h>
|
||||
#include "testdb.h"
|
||||
|
||||
typedef struct refdb_test_backend {
|
||||
git_refdb_backend parent;
|
||||
|
||||
|
||||
git_repository *repo;
|
||||
git_vector refs;
|
||||
} refdb_test_backend;
|
||||
@ -16,7 +12,7 @@ typedef struct refdb_test_backend {
|
||||
typedef struct refdb_test_entry {
|
||||
char *name;
|
||||
git_ref_t type;
|
||||
|
||||
|
||||
union {
|
||||
git_oid oid;
|
||||
char *symbolic;
|
||||
@ -37,19 +33,19 @@ static int refdb_test_backend__exists(
|
||||
refdb_test_backend *backend;
|
||||
refdb_test_entry *entry;
|
||||
size_t i;
|
||||
|
||||
|
||||
assert(_backend);
|
||||
backend = (refdb_test_backend *)_backend;
|
||||
|
||||
|
||||
*exists = 0;
|
||||
|
||||
|
||||
git_vector_foreach(&backend->refs, i, entry) {
|
||||
if (strcmp(entry->name, ref_name) == 0) {
|
||||
*exists = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -59,18 +55,18 @@ static int refdb_test_backend__write(
|
||||
{
|
||||
refdb_test_backend *backend;
|
||||
refdb_test_entry *entry;
|
||||
|
||||
|
||||
assert(_backend);
|
||||
backend = (refdb_test_backend *)_backend;
|
||||
|
||||
entry = git__calloc(1, sizeof(refdb_test_entry));
|
||||
GITERR_CHECK_ALLOC(entry);
|
||||
|
||||
|
||||
entry->name = git__strdup(git_reference_name(ref));
|
||||
GITERR_CHECK_ALLOC(entry->name);
|
||||
|
||||
|
||||
entry->type = git_reference_type(ref);
|
||||
|
||||
|
||||
if (entry->type == GIT_REF_OID)
|
||||
git_oid_cpy(&entry->target.oid, git_reference_target(ref));
|
||||
else {
|
||||
@ -79,7 +75,7 @@ static int refdb_test_backend__write(
|
||||
}
|
||||
|
||||
git_vector_insert(&backend->refs, entry);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -94,7 +90,7 @@ static int refdb_test_backend__lookup(
|
||||
|
||||
assert(_backend);
|
||||
backend = (refdb_test_backend *)_backend;
|
||||
|
||||
|
||||
git_vector_foreach(&backend->refs, i, entry) {
|
||||
if (strcmp(entry->name, ref_name) == 0) {
|
||||
|
||||
@ -108,7 +104,7 @@ static int refdb_test_backend__lookup(
|
||||
|
||||
if (*out == NULL)
|
||||
return -1;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -125,21 +121,21 @@ static int refdb_test_backend__foreach(
|
||||
refdb_test_backend *backend;
|
||||
refdb_test_entry *entry;
|
||||
size_t i;
|
||||
|
||||
|
||||
assert(_backend);
|
||||
backend = (refdb_test_backend *)_backend;
|
||||
|
||||
git_vector_foreach(&backend->refs, i, entry) {
|
||||
if (entry->type == GIT_REF_OID && (list_flags & GIT_REF_OID) == 0)
|
||||
continue;
|
||||
|
||||
|
||||
if (entry->type == GIT_REF_SYMBOLIC && (list_flags & GIT_REF_SYMBOLIC) == 0)
|
||||
continue;
|
||||
|
||||
|
||||
if (callback(entry->name, payload) != 0)
|
||||
return GIT_EUSER;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -147,7 +143,7 @@ static void refdb_test_entry_free(refdb_test_entry *entry)
|
||||
{
|
||||
if (entry->type == GIT_REF_SYMBOLIC)
|
||||
git__free(entry->target.symbolic);
|
||||
|
||||
|
||||
git__free(entry->name);
|
||||
git__free(entry);
|
||||
}
|
||||
@ -178,14 +174,14 @@ static void refdb_test_backend__free(git_refdb_backend *_backend)
|
||||
refdb_test_backend *backend;
|
||||
refdb_test_entry *entry;
|
||||
size_t i;
|
||||
|
||||
|
||||
assert(_backend);
|
||||
backend = (refdb_test_backend *)_backend;
|
||||
|
||||
git_vector_foreach(&backend->refs, i, entry)
|
||||
refdb_test_entry_free(entry);
|
||||
|
||||
git_vector_free(&backend->refs);
|
||||
git_vector_free(&backend->refs);
|
||||
git__free(backend);
|
||||
}
|
||||
|
||||
@ -197,7 +193,7 @@ int refdb_backend_test(
|
||||
|
||||
backend = git__calloc(1, sizeof(refdb_test_backend));
|
||||
GITERR_CHECK_ALLOC(backend);
|
||||
|
||||
|
||||
git_vector_init(&backend->refs, 0, ref_name_cmp);
|
||||
|
||||
backend->repo = repo;
|
||||
|
@ -1,3 +1,8 @@
|
||||
#include <git2/errors.h>
|
||||
#include <git2/repository.h>
|
||||
#include <git2/refdb.h>
|
||||
#include <git2/sys/refdb_backend.h>
|
||||
|
||||
int refdb_backend_test(
|
||||
git_refdb_backend **backend_out,
|
||||
git_repository *repo);
|
||||
|
Loading…
Reference in New Issue
Block a user