diff options
author | Edward Thomson <ethomson@microsoft.com> | 2015-05-22 11:20:47 -0400 |
---|---|---|
committer | Carlos MartÃn Nieto <cmn@dwim.me> | 2015-06-22 18:21:23 +0200 |
commit | c066d72ec4b306511516e5163c4e9f3cffd93dec (patch) | |
tree | eaff81aae4ac55b8f2ac43bf0a240a4477026956 | |
parent | 76af4fffee6c526393318d04cbf190c161b0d979 (diff) | |
download | libgit2-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.c | 15 |
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; |