]> git.proxmox.com Git - libgit2.git/blob - tests/odb/backend/backend_helpers.c
5427992429931d0293ae68ba05324c0eb1ea9ffe
[libgit2.git] / tests / odb / backend / backend_helpers.c
1 #include "clar_libgit2.h"
2 #include "git2/sys/odb_backend.h"
3 #include "backend_helpers.h"
4
5 static int search_object(const fake_object **out, fake_backend *fake, const git_oid *oid, size_t len)
6 {
7 const fake_object *obj = fake->objects, *found = NULL;
8
9 while (obj && obj->oid) {
10 git_oid current_oid;
11
12 git_oid_fromstr(&current_oid, obj->oid);
13
14 if (git_oid_ncmp(&current_oid, oid, len) == 0) {
15 if (found)
16 return GIT_EAMBIGUOUS;
17 found = obj;
18 }
19
20 obj++;
21 }
22
23 if (found && out)
24 *out = found;
25
26 return found ? GIT_OK : GIT_ENOTFOUND;
27 }
28
29 static int fake_backend__exists(git_odb_backend *backend, const git_oid *oid)
30 {
31 fake_backend *fake;
32
33 fake = (fake_backend *)backend;
34
35 fake->exists_calls++;
36
37 return search_object(NULL, fake, oid, GIT_OID_HEXSZ) == GIT_OK;
38 }
39
40 static int fake_backend__exists_prefix(
41 git_oid *out, git_odb_backend *backend, const git_oid *oid, size_t len)
42 {
43 const fake_object *obj;
44 fake_backend *fake;
45 int error;
46
47 fake = (fake_backend *)backend;
48
49 fake->exists_prefix_calls++;
50
51 if ((error = search_object(&obj, fake, oid, len)) < 0)
52 return error;
53
54 if (out)
55 git_oid_fromstr(out, obj->oid);
56
57 return 0;
58 }
59
60 static int fake_backend__read(
61 void **buffer_p, size_t *len_p, git_object_t *type_p,
62 git_odb_backend *backend, const git_oid *oid)
63 {
64 const fake_object *obj;
65 fake_backend *fake;
66 int error;
67
68 fake = (fake_backend *)backend;
69
70 fake->read_calls++;
71
72 if ((error = search_object(&obj, fake, oid, GIT_OID_HEXSZ)) < 0)
73 return error;
74
75 *len_p = strlen(obj->content);
76 *buffer_p = git__strdup(obj->content);
77 *type_p = GIT_OBJECT_BLOB;
78
79 return 0;
80 }
81
82 static int fake_backend__read_header(
83 size_t *len_p, git_object_t *type_p,
84 git_odb_backend *backend, const git_oid *oid)
85 {
86 const fake_object *obj;
87 fake_backend *fake;
88 int error;
89
90 fake = (fake_backend *)backend;
91
92 fake->read_header_calls++;
93
94 if ((error = search_object(&obj, fake, oid, GIT_OID_HEXSZ)) < 0)
95 return error;
96
97 *len_p = strlen(obj->content);
98 *type_p = GIT_OBJECT_BLOB;
99
100 return 0;
101 }
102
103 static int fake_backend__read_prefix(
104 git_oid *out_oid, void **buffer_p, size_t *len_p, git_object_t *type_p,
105 git_odb_backend *backend, const git_oid *short_oid, size_t len)
106 {
107 const fake_object *obj;
108 fake_backend *fake;
109 int error;
110
111 fake = (fake_backend *)backend;
112
113 fake->read_prefix_calls++;
114
115 if ((error = search_object(&obj, fake, short_oid, len)) < 0)
116 return error;
117
118 git_oid_fromstr(out_oid, obj->oid);
119 *len_p = strlen(obj->content);
120 *buffer_p = git__strdup(obj->content);
121 *type_p = GIT_OBJECT_BLOB;
122
123 return 0;
124 }
125
126 static int fake_backend__refresh(git_odb_backend *backend)
127 {
128 fake_backend *fake;
129
130 fake = (fake_backend *)backend;
131
132 fake->refresh_calls++;
133
134 return 0;
135 }
136
137
138 static void fake_backend__free(git_odb_backend *_backend)
139 {
140 fake_backend *backend;
141
142 backend = (fake_backend *)_backend;
143
144 git__free(backend);
145 }
146
147 int build_fake_backend(
148 git_odb_backend **out,
149 const fake_object *objects,
150 bool support_refresh)
151 {
152 fake_backend *backend;
153
154 backend = git__calloc(1, sizeof(fake_backend));
155 GIT_ERROR_CHECK_ALLOC(backend);
156
157 backend->parent.version = GIT_ODB_BACKEND_VERSION;
158
159 backend->objects = objects;
160
161 backend->parent.read = fake_backend__read;
162 backend->parent.read_prefix = fake_backend__read_prefix;
163 backend->parent.read_header = fake_backend__read_header;
164 backend->parent.refresh = support_refresh ? fake_backend__refresh : NULL;
165 backend->parent.exists = fake_backend__exists;
166 backend->parent.exists_prefix = fake_backend__exists_prefix;
167 backend->parent.free = &fake_backend__free;
168
169 *out = (git_odb_backend *)backend;
170
171 return 0;
172 }