1 #include "clar_libgit2.h"
2 #include "git2/sys/odb_backend.h"
3 #include "backend_helpers.h"
5 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
;
9 while (obj
&& obj
->oid
) {
12 git_oid_fromstr(¤t_oid
, obj
->oid
);
14 if (git_oid_ncmp(¤t_oid
, oid
, len
) == 0) {
16 return GIT_EAMBIGUOUS
;
26 return found
? GIT_OK
: GIT_ENOTFOUND
;
29 static int fake_backend__exists(git_odb_backend
*backend
, const git_oid
*oid
)
33 fake
= (fake_backend
*)backend
;
37 return search_object(NULL
, fake
, oid
, GIT_OID_HEXSZ
) == GIT_OK
;
40 static int fake_backend__exists_prefix(
41 git_oid
*out
, git_odb_backend
*backend
, const git_oid
*oid
, size_t len
)
43 const fake_object
*obj
;
47 fake
= (fake_backend
*)backend
;
49 fake
->exists_prefix_calls
++;
51 if ((error
= search_object(&obj
, fake
, oid
, len
)) < 0)
55 git_oid_fromstr(out
, obj
->oid
);
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
)
64 const fake_object
*obj
;
68 fake
= (fake_backend
*)backend
;
72 if ((error
= search_object(&obj
, fake
, oid
, GIT_OID_HEXSZ
)) < 0)
75 *len_p
= strlen(obj
->content
);
76 *buffer_p
= git__strdup(obj
->content
);
77 *type_p
= GIT_OBJECT_BLOB
;
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
)
86 const fake_object
*obj
;
90 fake
= (fake_backend
*)backend
;
92 fake
->read_header_calls
++;
94 if ((error
= search_object(&obj
, fake
, oid
, GIT_OID_HEXSZ
)) < 0)
97 *len_p
= strlen(obj
->content
);
98 *type_p
= GIT_OBJECT_BLOB
;
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
)
107 const fake_object
*obj
;
111 fake
= (fake_backend
*)backend
;
113 fake
->read_prefix_calls
++;
115 if ((error
= search_object(&obj
, fake
, short_oid
, len
)) < 0)
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
;
126 static int fake_backend__refresh(git_odb_backend
*backend
)
130 fake
= (fake_backend
*)backend
;
132 fake
->refresh_calls
++;
138 static void fake_backend__free(git_odb_backend
*_backend
)
140 fake_backend
*backend
;
142 backend
= (fake_backend
*)_backend
;
147 int build_fake_backend(
148 git_odb_backend
**out
,
149 const fake_object
*objects
,
150 bool support_refresh
)
152 fake_backend
*backend
;
154 backend
= git__calloc(1, sizeof(fake_backend
));
155 GIT_ERROR_CHECK_ALLOC(backend
);
157 backend
->parent
.version
= GIT_ODB_BACKEND_VERSION
;
159 backend
->objects
= objects
;
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
;
169 *out
= (git_odb_backend
*)backend
;