]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin/repack.c: do not repack single packs with --geometric
authorTaylor Blau <me@ttaylorr.com>
Fri, 5 Mar 2021 15:21:37 +0000 (10:21 -0500)
committerJunio C Hamano <gitster@pobox.com>
Fri, 5 Mar 2021 19:33:52 +0000 (11:33 -0800)
In 0fabafd0b9 (builtin/repack.c: add '--geometric' option, 2021-02-22),
the 'git repack --geometric' code aborts early when there is zero or one
pack.

When there are no packs, this code does the right thing by placing the
split at "0". But when there is exactly one pack, the split is placed at
"1", which means that "git repack --geometric" (with any factor)
repacks all of the objects in a single pack.

This is wasteful, and the remaining code in split_pack_geometry() does
the right thing (not repacking the objects in a single pack) even when
only one pack is present.

Loosen the guard to only stop when there aren't any packs, and let the
rest of the code do the right thing. Add a test to ensure that this is
the case.

Noticed-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/repack.c
t/t7703-repack-geometric.sh

index bcf280b10d0f9f732f6a7acb98653d8053e489e8..4ca2f647b401b1d0daa0f1b13acd158a81b18295 100644 (file)
@@ -351,7 +351,7 @@ static void split_pack_geometry(struct pack_geometry *geometry, int factor)
        uint32_t split;
        off_t total_size = 0;
 
-       if (geometry->pack_nr <= 1) {
+       if (!geometry->pack_nr) {
                geometry->split = geometry->pack_nr;
                return;
        }
index 96917fc16306a87bdf67ac6a07aa173fa12de5a4..4a1952a054818f816c49a38090f6cce8d4761033 100755 (executable)
@@ -20,6 +20,21 @@ test_expect_success '--geometric with no packs' '
        )
 '
 
+test_expect_success '--geometric with one pack' '
+       git init geometric &&
+       test_when_finished "rm -fr geometric" &&
+       (
+               cd geometric &&
+
+               test_commit "base" &&
+               git repack -d &&
+
+               git repack --geometric 2 >out &&
+
+               test_i18ngrep "Nothing new to pack" out
+       )
+'
+
 test_expect_success '--geometric with an intact progression' '
        git init geometric &&
        test_when_finished "rm -fr geometric" &&