diff options
author | Nicolas Pitre <nico@fluxnic.net> | 2010-02-08 10:39:01 -0500 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2010-02-08 10:56:21 -0800 |
commit | 720c9f7bda20d8f307745772374647c1a2076b3d (patch) | |
tree | 9ee5753432d01904f1a8f5f987abfcd9e0422180 | |
parent | Merge git://repo.or.cz/git-gui (diff) | |
download | tgif-720c9f7bda20d8f307745772374647c1a2076b3d.tar.xz |
Revert "pack-objects: fix pack generation when using pack_size_limit"
This reverts most of commit a2430dde8ceaaaabf05937438249397b883ca77a.
That commit made the situation better for repositories with relatively
small number of objects. However with many objects and a small pack size
limit, the time required to complete the repack tends towards O(n^2),
or even much worse with long delta chains.
Signed-off-by: Nicolas Pitre <nico@fluxnic.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | builtin-pack-objects.c | 20 | ||||
-rwxr-xr-x | t/t5300-pack-object.sh | 2 |
2 files changed, 10 insertions, 12 deletions
diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c index dcfe62aa02..e1d3adf405 100644 --- a/builtin-pack-objects.c +++ b/builtin-pack-objects.c @@ -445,13 +445,9 @@ static int write_one(struct sha1file *f, if (e->idx.offset || e->preferred_base) return -1; - /* - * If we are deltified, attempt to write out base object first. - * If that fails due to the pack size limit then the current - * object might still possibly fit undeltified within that limit. - */ - if (e->delta) - write_one(f, e->delta, offset); + /* if we are deltified, write out base object first. */ + if (e->delta && !write_one(f, e->delta, offset)) + return 0; e->idx.offset = *offset; size = write_object(f, e, *offset); @@ -505,9 +501,11 @@ static void write_pack_file(void) sha1write(f, &hdr, sizeof(hdr)); offset = sizeof(hdr); nr_written = 0; - for (i = 0; i < nr_objects; i++) - if (write_one(f, objects + i, &offset) == 1) - display_progress(progress_state, written); + for (; i < nr_objects; i++) { + if (!write_one(f, objects + i, &offset)) + break; + display_progress(progress_state, written); + } /* * Did we write the wrong # entries in the header? @@ -582,7 +580,7 @@ static void write_pack_file(void) written_list[j]->offset = (off_t)-1; } nr_remaining -= nr_written; - } while (nr_remaining); + } while (nr_remaining && i < nr_objects); free(written_list); stop_progress(&progress_state); diff --git a/t/t5300-pack-object.sh b/t/t5300-pack-object.sh index 1058d981dc..7649b810b1 100755 --- a/t/t5300-pack-object.sh +++ b/t/t5300-pack-object.sh @@ -389,7 +389,7 @@ test_expect_success 'verify resulting packs' ' test_expect_success 'tolerate packsizelimit smaller than biggest object' ' git config pack.packSizeLimit 1 && packname_11=$(git pack-objects test-11 <obj-list) && - test 3 = $(ls test-11-*.pack | wc -l) + test 5 = $(ls test-11-*.pack | wc -l) ' test_expect_success 'verify resulting packs' ' |