summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@microsoft.com>2015-05-22 11:20:47 -0400
committerCarlos Martín Nieto <cmn@dwim.me>2015-06-22 18:21:23 +0200
commitc066d72ec4b306511516e5163c4e9f3cffd93dec (patch)
treeeaff81aae4ac55b8f2ac43bf0a240a4477026956
parent76af4fffee6c526393318d04cbf190c161b0d979 (diff)
downloadlibgit2-c066d72ec4b306511516e5163c4e9f3cffd93dec.tar.gz
indexer: avoid loading already existent bases
When thickening a pack, avoid loading already loaded bases and trying to insert them all over again.
-rw-r--r--src/indexer.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/indexer.c b/src/indexer.c
index f328025fd..28268ff04 100644
--- a/src/indexer.c
+++ b/src/indexer.c
@@ -316,6 +316,13 @@ on_error:
return -1;
}
+GIT_INLINE(bool) has_entry(git_indexer *idx, git_oid *id)
+{
+ khiter_t k;
+ k = kh_get(oid, idx->pack->idx_cache, id);
+ return (k != kh_end(idx->pack->idx_cache));
+}
+
static int save_entry(git_indexer *idx, struct entry *entry, struct git_pack_entry *pentry, git_off_t entry_start)
{
int i, error;
@@ -330,8 +337,11 @@ static int save_entry(git_indexer *idx, struct entry *entry, struct git_pack_ent
pentry->offset = entry_start;
k = kh_put(oid, idx->pack->idx_cache, &pentry->sha1, &error);
- if (!error)
+
+ if (error <= 0) {
+ giterr_set(GITERR_INDEXER, "cannot insert object into pack");
return -1;
+ }
kh_value(idx->pack->idx_cache, k) = pentry;
@@ -782,6 +792,9 @@ static int fix_thin_pack(git_indexer *idx, git_transfer_progress *stats)
git_oid_fromraw(&base, base_info);
git_mwindow_close(&w);
+ if (has_entry(idx, &base))
+ return 0;
+
if (inject_object(idx, &base) < 0)
return -1;