diff options
author | Taylor Blau <me@ttaylorr.com> | 2022-05-20 19:01:51 (GMT) |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2022-05-20 20:54:44 (GMT) |
commit | 66731ff921a56cf3e7049fae614fcf7eec663bde (patch) | |
tree | c6be5489ef06484b1a08f0015fade4e48d7d3123 /builtin/repack.c | |
parent | aab7bea14fee0f185b26413bf27a1cfefbe0114d (diff) | |
download | git-66731ff921a56cf3e7049fae614fcf7eec663bde.zip git-66731ff921a56cf3e7049fae614fcf7eec663bde.tar.gz git-66731ff921a56cf3e7049fae614fcf7eec663bde.tar.bz2 |
builtin/repack.c: ensure that `names` is sorted
The previous patch demonstrates a scenario where the list of packs
written by `pack-objects` (and stored in the `names` string_list) is
out-of-order, and can thus cause us to delete packs we shouldn't.
This patch resolves that bug by ensuring that `names` is sorted in all
cases, not just when
delete_redundant && pack_everything & ALL_INTO_ONE
is true.
Because we did sort `names` in that case (which, prior to `--geometric`
repacks, was the only time we would actually delete packs, this is only
a bug for `--geometric` repacks.
It would be sufficient to only sort `names` when `delete_redundant` is
set to a non-zero value. But sorting a small list of strings is cheap,
and it is defensive against future calls to `string_list_has_string()`
on this list.
Co-discovered-by: Victoria Dye <vdye@github.com>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin/repack.c')
-rw-r--r-- | builtin/repack.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/builtin/repack.c b/builtin/repack.c index ea56e92..0e4aae8 100644 --- a/builtin/repack.c +++ b/builtin/repack.c @@ -856,6 +856,8 @@ int cmd_repack(int argc, const char **argv, const char *prefix) if (!names.nr && !po_args.quiet) printf_ln(_("Nothing new to pack.")); + string_list_sort(&names); + for_each_string_list_item(item, &names) { item->util = (void *)(uintptr_t)populate_pack_exts(item->string); } @@ -896,7 +898,6 @@ int cmd_repack(int argc, const char **argv, const char *prefix) if (delete_redundant && pack_everything & ALL_INTO_ONE) { const int hexsz = the_hash_algo->hexsz; - string_list_sort(&names); for_each_string_list_item(item, &existing_nonkept_packs) { char *sha1; size_t len = strlen(item->string); |