Commit Diff


commit - 6869fb7f545fc78d8a162ffca98601d0c69e21bb
commit + 79c99a64af2fcd11a3c60a54f989167ef4a72310
blob - ea6e03a4134e235d11a7516f27e1f0cf978162ad
blob + 21b84dec550e11df0837e1b7f9dc20217e2463d3
--- include/got_error.h
+++ include/got_error.h
@@ -91,6 +91,7 @@
 #define GOT_ERR_DIR_NOT_EMPTY	75
 #define GOT_ERR_COMMIT_NO_CHANGES 76
 #define GOT_ERR_BRANCH_MOVED	77
+#define GOT_ERR_OBJ_TOO_LARGE	78
 
 static const struct got_error {
 	int code;
@@ -175,6 +176,7 @@ static const struct got_error {
 	{ GOT_ERR_COMMIT_NO_CHANGES, "no changes to commit" },
 	{ GOT_ERR_BRANCH_MOVED,	"work tree's branch reference has moved; "
 	    "new branch reference or rebase required" },
+	{ GOT_ERR_OBJ_TOO_LARGE,	"object too large" },
 };
 
 /*
blob - 5c1d8d2b63a844a8451233a1009e6677e4303090
blob + 0c1a60f2dfc20f83db4ea8e080052c0f16e340b3
--- lib/object_cache.c
+++ lib/object_cache.c
@@ -184,7 +184,7 @@ got_object_cache_add(struct got_object_cache *cache, s
 		free(id_str);
 #endif
 		cache->cache_toolarge++;
-		return NULL;
+		return got_error(GOT_ERR_OBJ_TOO_LARGE);
 	}
 
 	nelem = got_object_idset_num_elements(cache->idset);
@@ -231,12 +231,8 @@ got_object_cache_add(struct got_object_cache *cache, s
 	}
 
 	err = got_object_idset_add(cache->idset, id, ce);
-	if (err) {
-		if (err->code == GOT_ERR_OBJ_EXISTS) {
-			free(ce);
-			err = NULL;
-		}
-	}
+	if (err)
+		free(ce);
 	return err;
 }
 
blob - bff89f510415a95da98401388298562dac05a804
blob + 0277a4437dc809ba033a7083ce7d917e0a36fd81
--- lib/repository.c
+++ lib/repository.c
@@ -180,8 +180,12 @@ got_repo_cache_object(struct got_repository *repo, str
 #ifndef GOT_NO_OBJ_CACHE
 	const struct got_error *err = NULL;
 	err = got_object_cache_add(&repo->objcache, id, obj);
-	if (err)
+	if (err) {
+		if (err->code == GOT_ERR_OBJ_EXISTS ||
+		    err->code == GOT_ERR_OBJ_TOO_LARGE)
+			err = NULL;
 		return err;
+	}
 	obj->refcnt++;
 #endif
 	return NULL;
@@ -201,8 +205,12 @@ got_repo_cache_tree(struct got_repository *repo, struc
 #ifndef GOT_NO_OBJ_CACHE
 	const struct got_error *err = NULL;
 	err = got_object_cache_add(&repo->treecache, id, tree);
-	if (err)
+	if (err) {
+		if (err->code == GOT_ERR_OBJ_EXISTS ||
+		    err->code == GOT_ERR_OBJ_TOO_LARGE)
+			err = NULL;
 		return err;
+	}
 	tree->refcnt++;
 #endif
 	return NULL;
@@ -223,8 +231,12 @@ got_repo_cache_commit(struct got_repository *repo, str
 #ifndef GOT_NO_OBJ_CACHE
 	const struct got_error *err = NULL;
 	err = got_object_cache_add(&repo->commitcache, id, commit);
-	if (err)
+	if (err) {
+		if (err->code == GOT_ERR_OBJ_EXISTS ||
+		    err->code == GOT_ERR_OBJ_TOO_LARGE)
+			err = NULL;
 		return err;
+	}
 	commit->refcnt++;
 #endif
 	return NULL;
@@ -245,8 +257,12 @@ got_repo_cache_tag(struct got_repository *repo, struct
 #ifndef GOT_NO_OBJ_CACHE
 	const struct got_error *err = NULL;
 	err = got_object_cache_add(&repo->tagcache, id, tag);
-	if (err)
+	if (err) {
+		if (err->code == GOT_ERR_OBJ_EXISTS ||
+		    err->code == GOT_ERR_OBJ_TOO_LARGE)
+			err = NULL;
 		return err;
+	}
 	tag->refcnt++;
 #endif
 	return NULL;
blob - 842624ebb2ee709ad0c8eb682903fbb6fc8824d8
blob + 0f2d28db038b3e3cd5606510cf1f7f5007f8881a
--- libexec/got-read-pack/got-read-pack.c
+++ libexec/got-read-pack/got-read-pack.c
@@ -63,10 +63,13 @@ open_object(struct got_object **obj, struct got_pack *
 	(*obj)->refcnt++;
 
 	err = got_object_cache_add(objcache, id, *obj);
-	if (err)
+	if (err) {
+		if (err->code == GOT_ERR_OBJ_EXISTS ||
+		    err->code == GOT_ERR_OBJ_TOO_LARGE)
+			err = NULL;
 		return err;
+	}
 	(*obj)->refcnt++;
-
 	return NULL;
 }