mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-07 01:43:48 +00:00

In order to be able to test the ODB prefix functions, we need to be able to detect ambiguous prefixes in case multiple objects with the same prefix exist in the fake ODB. Extend `search_object` to detect ambiguous queries and have callers return its error code instead of always returning `GIT_ENOTFOUND`.
139 lines
2.8 KiB
C
139 lines
2.8 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_RAWSZ) == GIT_OK;
|
|
}
|
|
|
|
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.free = &fake_backend__free;
|
|
|
|
*out = (git_odb_backend *)backend;
|
|
|
|
return 0;
|
|
}
|