mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-07 14:15:54 +00:00
Merge pull request #2335 from libgit2/cmn/indexer-vector-handling
indexer: avoid memory moves
This commit is contained in:
commit
4df53a64a1
@ -717,6 +717,9 @@ static int fix_thin_pack(git_indexer *idx, git_transfer_progress *stats)
|
|||||||
|
|
||||||
/* Loop until we find the first REF delta */
|
/* Loop until we find the first REF delta */
|
||||||
git_vector_foreach(&idx->deltas, i, delta) {
|
git_vector_foreach(&idx->deltas, i, delta) {
|
||||||
|
if (!delta)
|
||||||
|
continue;
|
||||||
|
|
||||||
curpos = delta->delta_off;
|
curpos = delta->delta_off;
|
||||||
error = git_packfile_unpack_header(&size, &type, &idx->pack->mwf, &w, &curpos);
|
error = git_packfile_unpack_header(&size, &type, &idx->pack->mwf, &w, &curpos);
|
||||||
git_mwindow_close(&w);
|
git_mwindow_close(&w);
|
||||||
@ -756,13 +759,18 @@ static int resolve_deltas(git_indexer *idx, git_transfer_progress *stats)
|
|||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
struct delta_info *delta;
|
struct delta_info *delta;
|
||||||
int progressed = 0, progress_cb_result;
|
int progressed = 0, non_null = 0, progress_cb_result;
|
||||||
|
|
||||||
while (idx->deltas.length > 0) {
|
while (idx->deltas.length > 0) {
|
||||||
progressed = 0;
|
progressed = 0;
|
||||||
|
non_null = 0;
|
||||||
git_vector_foreach(&idx->deltas, i, delta) {
|
git_vector_foreach(&idx->deltas, i, delta) {
|
||||||
git_rawobj obj;
|
git_rawobj obj;
|
||||||
|
|
||||||
|
if (!delta)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
non_null = 1;
|
||||||
idx->off = delta->delta_off;
|
idx->off = delta->delta_off;
|
||||||
if (git_packfile_unpack(&obj, idx->pack, &idx->off) < 0)
|
if (git_packfile_unpack(&obj, idx->pack, &idx->off) < 0)
|
||||||
continue;
|
continue;
|
||||||
@ -777,16 +785,15 @@ static int resolve_deltas(git_indexer *idx, git_transfer_progress *stats)
|
|||||||
if ((progress_cb_result = do_progress_callback(idx, stats)) < 0)
|
if ((progress_cb_result = do_progress_callback(idx, stats)) < 0)
|
||||||
return progress_cb_result;
|
return progress_cb_result;
|
||||||
|
|
||||||
/*
|
/* remove from the list */
|
||||||
* Remove this delta from the list and
|
git_vector_set(NULL, &idx->deltas, i, NULL);
|
||||||
* decrease i so we don't skip over the next
|
|
||||||
* delta.
|
|
||||||
*/
|
|
||||||
git_vector_remove(&idx->deltas, i);
|
|
||||||
git__free(delta);
|
git__free(delta);
|
||||||
i--;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* if none were actually set, we're done */
|
||||||
|
if (!non_null)
|
||||||
|
break;
|
||||||
|
|
||||||
if (!progressed && (fix_thin_pack(idx, stats) < 0)) {
|
if (!progressed && (fix_thin_pack(idx, stats) < 0)) {
|
||||||
giterr_set(GITERR_INDEXER, "missing delta bases");
|
giterr_set(GITERR_INDEXER, "missing delta bases");
|
||||||
return -1;
|
return -1;
|
||||||
|
Loading…
Reference in New Issue
Block a user