]> git.ipfire.org Git - thirdparty/git.git/commitdiff
pack-redundant: fix crash when one packfile in repo
authorJiang Xin <zhiyou.jx@alibaba-inc.com>
Thu, 17 Dec 2020 01:57:09 +0000 (20:57 -0500)
committerJunio C Hamano <gitster@pobox.com>
Thu, 17 Dec 2020 05:21:06 +0000 (21:21 -0800)
Command `git pack-redundant --all` will crash if there is only one
packfile in the repository.  This is because, if there is only one
packfile in local_packs, `cmp_local_packs` will do nothing and will
leave `pl->unique_objects` as uninitialized.

Also add testcases for repository with no packfile and one packfile
in t5323.

Reported-by: Daniel C. Klauer <daniel.c.klauer@web.de>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/pack-redundant.c
t/t5323-pack-redundant.sh

index 178e3409b7f8e0477e1a41e3575bcf886c6d664b..690775fa821428b1ffcee1c96afe53482f9af53a 100644 (file)
@@ -473,6 +473,12 @@ static void cmp_local_packs(void)
 {
        struct pack_list *subset, *pl = local_packs;
 
+       /* only one packfile */
+       if (!pl->next) {
+               llist_init(&pl->unique_objects);
+               return;
+       }
+
        while ((subset = pl)) {
                while ((subset = subset->next))
                        cmp_two_packs(pl, subset);
index 6b4d1ca3536acc2ab03bab3f0d6d06a807effb2e..7e3340843fe570d7624d33390803d6820817ad4f 100755 (executable)
@@ -112,19 +112,28 @@ test_expect_success 'setup master repo' '
        create_commits_in "$master_repo" A B C D E F G H I J K L M N O P Q R
 '
 
+test_expect_success 'master: pack-redundant works with no packfile' '
+       (
+               cd "$master_repo" &&
+               cat >expect <<-EOF &&
+                       fatal: Zero packs found!
+                       EOF
+               test_must_fail git pack-redundant --all >actual 2>&1 &&
+               test_cmp expect actual
+       )
+'
+
 #############################################################################
 # Chart of packs and objects for this test case
 #
 #         | T A B C D E F G H I J K L M N O P Q R
 #     ----+--------------------------------------
 #     P1  | x x x x x x x                       x
-#     P2  |     x x x x   x x x
-#     P3  |             x     x x x x x
 #     ----+--------------------------------------
-#     ALL | x x x x x x x x x x x x x x         x
+#     ALL | x x x x x x x                       x
 #
 #############################################################################
-test_expect_success 'master: no redundant for pack 1, 2, 3' '
+test_expect_success 'master: pack-redundant works with one packfile' '
        create_pack_in "$master_repo" P1 <<-EOF &&
                $T
                $A
@@ -135,6 +144,26 @@ test_expect_success 'master: no redundant for pack 1, 2, 3' '
                $F
                $R
                EOF
+       (
+               cd "$master_repo" &&
+               git pack-redundant --all >out &&
+               test_must_be_empty out
+       )
+'
+
+#############################################################################
+# Chart of packs and objects for this test case
+#
+#         | T A B C D E F G H I J K L M N O P Q R
+#     ----+--------------------------------------
+#     P1  | x x x x x x x                       x
+#     P2  |     x x x x   x x x
+#     P3  |             x     x x x x x
+#     ----+--------------------------------------
+#     ALL | x x x x x x x x x x x x x x         x
+#
+#############################################################################
+test_expect_success 'master: no redundant for pack 1, 2, 3' '
        create_pack_in "$master_repo" P2 <<-EOF &&
                $B
                $C