diff options
author | Carlos Martín Nieto <cmn@dwim.me> | 2015-05-22 22:12:40 +0200 |
---|---|---|
committer | Carlos Martín Nieto <cmn@dwim.me> | 2015-05-22 22:12:40 +0200 |
commit | c11daac9de2fb582873e2471346526f33835226e (patch) | |
tree | d42f5cd002bdaf14f76088a836ea3958dbb9974b | |
parent | 2540487fcd06544fbdcda37944bde344df877e47 (diff) | |
parent | e2dd3735a5e2585485ee96d733110cb63f21dc7e (diff) | |
download | libgit2-c11daac9de2fb582873e2471346526f33835226e.tar.gz |
Merge pull request #3151 from ethomson/thinpack
Thin packs: don't
-rw-r--r-- | src/indexer.c | 15 | ||||
-rw-r--r-- | src/pack.c | 7 |
2 files changed, 21 insertions, 1 deletions
diff --git a/src/indexer.c b/src/indexer.c index 665d50fcd..e39345c71 100644 --- a/src/indexer.c +++ b/src/indexer.c @@ -325,6 +325,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; @@ -339,8 +346,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; @@ -791,6 +801,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; diff --git a/src/pack.c b/src/pack.c index 5d0a27b91..105d67510 100644 --- a/src/pack.c +++ b/src/pack.c @@ -959,8 +959,15 @@ git_off_t get_delta_base( if (k != kh_end(p->idx_cache)) { *curpos += 20; return ((struct git_pack_entry *)kh_value(p->idx_cache, k))->offset; + } else { + /* If we're building an index, don't try to find the pack + * entry; we just haven't seen it yet. We'll make + * progress again in the next loop. + */ + return GIT_PASSTHROUGH; } } + /* The base entry _must_ be in the same pack */ if (pack_entry_find_offset(&base_offset, &unused, p, (git_oid *)base_info, GIT_OID_HEXSZ) < 0) return packfile_error("base entry delta is not in the same pack"); |