summaryrefslogtreecommitdiff
path: root/src/object.c
diff options
context:
space:
mode:
authorVicent Marti <tanoku@gmail.com>2013-04-01 19:38:23 +0200
committerVicent Marti <tanoku@gmail.com>2013-04-22 16:50:50 +0200
commit5df184241a6cfe88ac5ebcee9a3ad175abfca0cd (patch)
tree36136d01b6016204b5ee9b08a4efe93bf6813613 /src/object.c
parenta92dd316079250b27cc933b1fd00cd6af88b88d9 (diff)
downloadlibgit2-5df184241a6cfe88ac5ebcee9a3ad175abfca0cd.tar.gz
lol this worked first try wtf
Diffstat (limited to 'src/object.c')
-rw-r--r--src/object.c54
1 files changed, 33 insertions, 21 deletions
diff --git a/src/object.c b/src/object.c
index 80fe51152..5542ebc8e 100644
--- a/src/object.c
+++ b/src/object.c
@@ -121,12 +121,13 @@ int git_object__from_odb_object(
break;
}
- if (error < 0)
+ if (error < 0) {
git_object__free(object);
- else
- *object_out = git_cache_try_store(&repo->objects, object);
+ return error;
+ }
- return error;
+ *object_out = git_cache_store_parsed(&repo->objects, object);
+ return 0;
}
int git_object_lookup_prefix(
@@ -154,27 +155,38 @@ int git_object_lookup_prefix(
len = GIT_OID_HEXSZ;
if (len == GIT_OID_HEXSZ) {
+ git_cached_obj *cached = NULL;
+
/* We want to match the full id : we can first look up in the cache,
* since there is no need to check for non ambiguousity
*/
- object = git_cache_get(&repo->objects, id);
- if (object != NULL) {
- if (type != GIT_OBJ_ANY && type != object->type) {
- git_object_free(object);
- giterr_set(GITERR_INVALID, "The requested type does not match the type in ODB");
- return GIT_ENOTFOUND;
+ cached = git_cache_get_any(&repo->objects, id);
+ if (cached != NULL) {
+ if (cached->flags == GIT_CACHE_STORE_PARSED) {
+ object = (git_object *)cached;
+
+ if (type != GIT_OBJ_ANY && type != object->type) {
+ git_object_free(object);
+ giterr_set(GITERR_INVALID,
+ "The requested type does not match the type in ODB");
+ return GIT_ENOTFOUND;
+ }
+
+ *object_out = object;
+ return 0;
+ } else if (cached->flags == GIT_CACHE_STORE_RAW) {
+ odb_obj = (git_odb_object *)cached;
+ } else {
+ assert(!"Wrong caching type in the global object cache");
}
-
- *object_out = object;
- return 0;
+ } else {
+ /* Object was not found in the cache, let's explore the backends.
+ * We could just use git_odb_read_unique_short_oid,
+ * it is the same cost for packed and loose object backends,
+ * but it may be much more costly for sqlite and hiredis.
+ */
+ error = git_odb_read(&odb_obj, odb, id);
}
-
- /* Object was not found in the cache, let's explore the backends.
- * We could just use git_odb_read_unique_short_oid,
- * it is the same cost for packed and loose object backends,
- * but it may be much more costly for sqlite and hiredis.
- */
- error = git_odb_read(&odb_obj, odb, id);
} else {
git_oid short_oid;
@@ -245,7 +257,7 @@ void git_object_free(git_object *object)
if (object == NULL)
return;
- git_cached_obj_decref((git_cached_obj *)object, git_object__free);
+ git_cached_obj_decref(object);
}
const git_oid *git_object_id(const git_object *obj)