backend_helpers.c 3.25 KB
Newer Older
1 2 3 4
#include "clar_libgit2.h"
#include "git2/sys/odb_backend.h"
#include "backend_helpers.h"

5 6
static int search_object(const fake_object **out, fake_backend *fake, const git_oid *oid, size_t len)
{
7
	const fake_object *obj = fake->objects, *found = NULL;
8 9 10 11 12 13 14

	while (obj && obj->oid) {
		git_oid current_oid;

		git_oid_fromstr(&current_oid, obj->oid);

		if (git_oid_ncmp(&current_oid, oid, len) == 0) {
15 16 17
			if (found)
				return GIT_EAMBIGUOUS;
			found = obj;
18 19 20 21 22
		}

		obj++;
	}

23 24 25 26
	if (found && out)
		*out = found;

	return found ? GIT_OK : GIT_ENOTFOUND;
27 28
}

29 30 31 32 33 34 35 36
static int fake_backend__exists(git_odb_backend *backend, const git_oid *oid)
{
	fake_backend *fake;

	fake = (fake_backend *)backend;

	fake->exists_calls++;

37
	return search_object(NULL, fake, oid, GIT_OID_HEXSZ) == GIT_OK;
38 39
}

40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
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;
}

60 61 62 63
static int fake_backend__read(
	void **buffer_p, size_t *len_p, git_otype *type_p,
	git_odb_backend *backend, const git_oid *oid)
{
64
	const fake_object *obj;
65
	fake_backend *fake;
66
	int error;
67 68 69 70 71

	fake = (fake_backend *)backend;

	fake->read_calls++;

72 73 74 75 76 77
	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;
78

79
	return 0;
80 81 82 83 84 85
}

static int fake_backend__read_header(
	size_t *len_p, git_otype *type_p,
	git_odb_backend *backend, const git_oid *oid)
{
86
	const fake_object *obj;
87
	fake_backend *fake;
88
	int error;
89 90 91 92 93

	fake = (fake_backend *)backend;

	fake->read_header_calls++;

94 95
	if ((error = search_object(&obj, fake, oid, GIT_OID_HEXSZ)) < 0)
		return error;
96

97 98 99 100
	*len_p = strlen(obj->content);
	*type_p = GIT_OBJ_BLOB;

	return 0;
101 102 103 104 105 106
}

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)
{
107
	const fake_object *obj;
108
	fake_backend *fake;
109
	int error;
110 111 112 113 114

	fake = (fake_backend *)backend;

	fake->read_prefix_calls++;

115 116
	if ((error = search_object(&obj, fake, short_oid, len)) < 0)
		return error;
117

118 119 120 121 122 123
	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;
124 125 126 127 128 129 130 131 132 133 134 135 136
}

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,
137
	const fake_object *objects)
138 139 140 141 142 143 144 145 146
{
	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;
147
	backend->objects = objects;
148 149 150 151 152

	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;
153
	backend->parent.exists_prefix = fake_backend__exists_prefix;
154 155 156 157 158 159
	backend->parent.free = &fake_backend__free;

	*out = (git_odb_backend *)backend;

	return 0;
}