]>
Commit | Line | Data |
---|---|---|
2add34d0 PS |
1 | #include "clar_libgit2.h" |
2 | #include "git2/sys/odb_backend.h" | |
3 | #include "backend_helpers.h" | |
4 | ||
6e010bb1 PS |
5 | static int search_object(const fake_object **out, fake_backend *fake, const git_oid *oid, size_t len) |
6 | { | |
c4cbb3b1 | 7 | const fake_object *obj = fake->objects, *found = NULL; |
6e010bb1 PS |
8 | |
9 | while (obj && obj->oid) { | |
10 | git_oid current_oid; | |
11 | ||
12 | git_oid_fromstr(¤t_oid, obj->oid); | |
13 | ||
14 | if (git_oid_ncmp(¤t_oid, oid, len) == 0) { | |
c4cbb3b1 PS |
15 | if (found) |
16 | return GIT_EAMBIGUOUS; | |
17 | found = obj; | |
6e010bb1 PS |
18 | } |
19 | ||
20 | obj++; | |
21 | } | |
22 | ||
c4cbb3b1 PS |
23 | if (found && out) |
24 | *out = found; | |
25 | ||
26 | return found ? GIT_OK : GIT_ENOTFOUND; | |
6e010bb1 PS |
27 | } |
28 | ||
2add34d0 PS |
29 | static int fake_backend__exists(git_odb_backend *backend, const git_oid *oid) |
30 | { | |
31 | fake_backend *fake; | |
32 | ||
2add34d0 PS |
33 | fake = (fake_backend *)backend; |
34 | ||
35 | fake->exists_calls++; | |
36 | ||
983e627d | 37 | return search_object(NULL, fake, oid, GIT_OID_HEXSZ) == GIT_OK; |
2add34d0 PS |
38 | } |
39 | ||
b2e53f36 PS |
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 | ||
2add34d0 | 60 | static int fake_backend__read( |
ac3d33df | 61 | void **buffer_p, size_t *len_p, git_object_t *type_p, |
2add34d0 PS |
62 | git_odb_backend *backend, const git_oid *oid) |
63 | { | |
6e010bb1 | 64 | const fake_object *obj; |
2add34d0 | 65 | fake_backend *fake; |
c4cbb3b1 | 66 | int error; |
2add34d0 | 67 | |
2add34d0 PS |
68 | fake = (fake_backend *)backend; |
69 | ||
70 | fake->read_calls++; | |
71 | ||
c4cbb3b1 PS |
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); | |
ac3d33df | 77 | *type_p = GIT_OBJECT_BLOB; |
2add34d0 | 78 | |
c4cbb3b1 | 79 | return 0; |
2add34d0 PS |
80 | } |
81 | ||
82 | static int fake_backend__read_header( | |
ac3d33df | 83 | size_t *len_p, git_object_t *type_p, |
2add34d0 PS |
84 | git_odb_backend *backend, const git_oid *oid) |
85 | { | |
6e010bb1 | 86 | const fake_object *obj; |
2add34d0 | 87 | fake_backend *fake; |
c4cbb3b1 | 88 | int error; |
2add34d0 | 89 | |
2add34d0 PS |
90 | fake = (fake_backend *)backend; |
91 | ||
92 | fake->read_header_calls++; | |
93 | ||
c4cbb3b1 PS |
94 | if ((error = search_object(&obj, fake, oid, GIT_OID_HEXSZ)) < 0) |
95 | return error; | |
2add34d0 | 96 | |
c4cbb3b1 | 97 | *len_p = strlen(obj->content); |
ac3d33df | 98 | *type_p = GIT_OBJECT_BLOB; |
c4cbb3b1 PS |
99 | |
100 | return 0; | |
2add34d0 PS |
101 | } |
102 | ||
103 | static int fake_backend__read_prefix( | |
ac3d33df | 104 | git_oid *out_oid, void **buffer_p, size_t *len_p, git_object_t *type_p, |
2add34d0 PS |
105 | git_odb_backend *backend, const git_oid *short_oid, size_t len) |
106 | { | |
6e010bb1 | 107 | const fake_object *obj; |
2add34d0 | 108 | fake_backend *fake; |
c4cbb3b1 | 109 | int error; |
2add34d0 | 110 | |
2add34d0 PS |
111 | fake = (fake_backend *)backend; |
112 | ||
113 | fake->read_prefix_calls++; | |
114 | ||
c4cbb3b1 PS |
115 | if ((error = search_object(&obj, fake, short_oid, len)) < 0) |
116 | return error; | |
2add34d0 | 117 | |
c4cbb3b1 PS |
118 | git_oid_fromstr(out_oid, obj->oid); |
119 | *len_p = strlen(obj->content); | |
120 | *buffer_p = git__strdup(obj->content); | |
ac3d33df | 121 | *type_p = GIT_OBJECT_BLOB; |
c4cbb3b1 PS |
122 | |
123 | return 0; | |
2add34d0 PS |
124 | } |
125 | ||
e579e0f7 MB |
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 | ||
2add34d0 PS |
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, | |
e579e0f7 MB |
149 | const fake_object *objects, |
150 | bool support_refresh) | |
2add34d0 PS |
151 | { |
152 | fake_backend *backend; | |
153 | ||
154 | backend = git__calloc(1, sizeof(fake_backend)); | |
ac3d33df | 155 | GIT_ERROR_CHECK_ALLOC(backend); |
2add34d0 PS |
156 | |
157 | backend->parent.version = GIT_ODB_BACKEND_VERSION; | |
158 | ||
6e010bb1 | 159 | backend->objects = objects; |
2add34d0 PS |
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; | |
e579e0f7 | 164 | backend->parent.refresh = support_refresh ? fake_backend__refresh : NULL; |
2add34d0 | 165 | backend->parent.exists = fake_backend__exists; |
b2e53f36 | 166 | backend->parent.exists_prefix = fake_backend__exists_prefix; |
2add34d0 PS |
167 | backend->parent.free = &fake_backend__free; |
168 | ||
2add34d0 PS |
169 | *out = (git_odb_backend *)backend; |
170 | ||
171 | return 0; | |
172 | } |