mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-03 21:25:35 +00:00

The fake backend currently implements all reading functions except for the `exists_prefix` one. Implement it to enable further testing of the ODB layer.
160 lines
3.3 KiB
C
160 lines
3.3 KiB
C
#include "clar_libgit2.h"
|
|
#include "git2/sys/odb_backend.h"
|
|
#include "backend_helpers.h"
|
|
|
|
static int search_object(const fake_object **out, fake_backend *fake, const git_oid *oid, size_t len)
|
|
{
|
|
const fake_object *obj = fake->objects, *found = NULL;
|
|
|
|
while (obj && obj->oid) {
|
|
git_oid current_oid;
|
|
|
|
git_oid_fromstr(¤t_oid, obj->oid);
|
|
|
|
if (git_oid_ncmp(¤t_oid, oid, len) == 0) {
|
|
if (found)
|
|
return GIT_EAMBIGUOUS;
|
|
found = obj;
|
|
}
|
|
|
|
obj++;
|
|
}
|
|
|
|
if (found && out)
|
|
*out = found;
|
|
|
|
return found ? GIT_OK : GIT_ENOTFOUND;
|
|
}
|
|
|
|
static int fake_backend__exists(git_odb_backend *backend, const git_oid *oid)
|
|
{
|
|
fake_backend *fake;
|
|
|
|
fake = (fake_backend *)backend;
|
|
|
|
fake->exists_calls++;
|
|
|
|
return search_object(NULL, fake, oid, GIT_OID_HEXSZ) == GIT_OK;
|
|
}
|
|
|
|
static int fake_backend__exists_prefix(
|
|
git_oid *out, git_odb_backend *backend, const git_oid *oid, size_t len)
|
|
{
|
|
const fake_object *obj;
|
|
fake_backend *fake;
|
|
int error;
|
|
|
|
fake = (fake_backend *)backend;
|
|
|
|
fake->exists_prefix_calls++;
|
|
|
|
if ((error = search_object(&obj, fake, oid, len)) < 0)
|
|
return error;
|
|
|
|
if (out)
|
|
git_oid_fromstr(out, obj->oid);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int fake_backend__read(
|
|
void **buffer_p, size_t *len_p, git_otype *type_p,
|
|
git_odb_backend *backend, const git_oid *oid)
|
|
{
|
|
const fake_object *obj;
|
|
fake_backend *fake;
|
|
int error;
|
|
|
|
fake = (fake_backend *)backend;
|
|
|
|
fake->read_calls++;
|
|
|
|
if ((error = search_object(&obj, fake, oid, GIT_OID_HEXSZ)) < 0)
|
|
return error;
|
|
|
|
*len_p = strlen(obj->content);
|
|
*buffer_p = git__strdup(obj->content);
|
|
*type_p = GIT_OBJ_BLOB;
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int fake_backend__read_header(
|
|
size_t *len_p, git_otype *type_p,
|
|
git_odb_backend *backend, const git_oid *oid)
|
|
{
|
|
const fake_object *obj;
|
|
fake_backend *fake;
|
|
int error;
|
|
|
|
fake = (fake_backend *)backend;
|
|
|
|
fake->read_header_calls++;
|
|
|
|
if ((error = search_object(&obj, fake, oid, GIT_OID_HEXSZ)) < 0)
|
|
return error;
|
|
|
|
*len_p = strlen(obj->content);
|
|
*type_p = GIT_OBJ_BLOB;
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int fake_backend__read_prefix(
|
|
git_oid *out_oid, void **buffer_p, size_t *len_p, git_otype *type_p,
|
|
git_odb_backend *backend, const git_oid *short_oid, size_t len)
|
|
{
|
|
const fake_object *obj;
|
|
fake_backend *fake;
|
|
int error;
|
|
|
|
fake = (fake_backend *)backend;
|
|
|
|
fake->read_prefix_calls++;
|
|
|
|
if ((error = search_object(&obj, fake, short_oid, len)) < 0)
|
|
return error;
|
|
|
|
git_oid_fromstr(out_oid, obj->oid);
|
|
*len_p = strlen(obj->content);
|
|
*buffer_p = git__strdup(obj->content);
|
|
*type_p = GIT_OBJ_BLOB;
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void fake_backend__free(git_odb_backend *_backend)
|
|
{
|
|
fake_backend *backend;
|
|
|
|
backend = (fake_backend *)_backend;
|
|
|
|
git__free(backend);
|
|
}
|
|
|
|
int build_fake_backend(
|
|
git_odb_backend **out,
|
|
const fake_object *objects)
|
|
{
|
|
fake_backend *backend;
|
|
|
|
backend = git__calloc(1, sizeof(fake_backend));
|
|
GITERR_CHECK_ALLOC(backend);
|
|
|
|
backend->parent.version = GIT_ODB_BACKEND_VERSION;
|
|
|
|
backend->parent.refresh = NULL;
|
|
backend->objects = objects;
|
|
|
|
backend->parent.read = fake_backend__read;
|
|
backend->parent.read_prefix = fake_backend__read_prefix;
|
|
backend->parent.read_header = fake_backend__read_header;
|
|
backend->parent.exists = fake_backend__exists;
|
|
backend->parent.exists_prefix = fake_backend__exists_prefix;
|
|
backend->parent.free = &fake_backend__free;
|
|
|
|
*out = (git_odb_backend *)backend;
|
|
|
|
return 0;
|
|
}
|