mirror of
https://github.com/git/git.git
synced 2024-12-11 19:03:50 +08:00
7f4c3508c0
When calling `read_midx_file()` to show information about a MIDX or list the objects contained within it we fail to call `close_midx()`, leaking the memory allocated to store that MIDX. Fix this by calling `close_midx()` before exiting the function. We can drop the "early" return when `show_objects` is non-zero, since the next instruction is also a return. (We could just as easily put a `cleanup` label here as with previous patches. But the only other time we terminate the function early is when we fail to load a MIDX in the first place. `close_midx()` does handle a NULL argument, but the extra complexity is likely not warranted). Signed-off-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
114 lines
2.4 KiB
C
114 lines
2.4 KiB
C
#include "test-tool.h"
|
|
#include "cache.h"
|
|
#include "midx.h"
|
|
#include "repository.h"
|
|
#include "object-store.h"
|
|
#include "pack-bitmap.h"
|
|
|
|
static int read_midx_file(const char *object_dir, int show_objects)
|
|
{
|
|
uint32_t i;
|
|
struct multi_pack_index *m;
|
|
|
|
setup_git_directory();
|
|
m = load_multi_pack_index(object_dir, 1);
|
|
|
|
if (!m)
|
|
return 1;
|
|
|
|
printf("header: %08x %d %d %d %d\n",
|
|
m->signature,
|
|
m->version,
|
|
m->hash_len,
|
|
m->num_chunks,
|
|
m->num_packs);
|
|
|
|
printf("chunks:");
|
|
|
|
if (m->chunk_pack_names)
|
|
printf(" pack-names");
|
|
if (m->chunk_oid_fanout)
|
|
printf(" oid-fanout");
|
|
if (m->chunk_oid_lookup)
|
|
printf(" oid-lookup");
|
|
if (m->chunk_object_offsets)
|
|
printf(" object-offsets");
|
|
if (m->chunk_large_offsets)
|
|
printf(" large-offsets");
|
|
|
|
printf("\nnum_objects: %d\n", m->num_objects);
|
|
|
|
printf("packs:\n");
|
|
for (i = 0; i < m->num_packs; i++)
|
|
printf("%s\n", m->pack_names[i]);
|
|
|
|
printf("object-dir: %s\n", m->object_dir);
|
|
|
|
if (show_objects) {
|
|
struct object_id oid;
|
|
struct pack_entry e;
|
|
|
|
for (i = 0; i < m->num_objects; i++) {
|
|
nth_midxed_object_oid(&oid, m, i);
|
|
fill_midx_entry(the_repository, &oid, &e, m);
|
|
|
|
printf("%s %"PRIu64"\t%s\n",
|
|
oid_to_hex(&oid), e.offset, e.p->pack_name);
|
|
}
|
|
}
|
|
|
|
close_midx(m);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int read_midx_checksum(const char *object_dir)
|
|
{
|
|
struct multi_pack_index *m;
|
|
|
|
setup_git_directory();
|
|
m = load_multi_pack_index(object_dir, 1);
|
|
if (!m)
|
|
return 1;
|
|
printf("%s\n", hash_to_hex(get_midx_checksum(m)));
|
|
return 0;
|
|
}
|
|
|
|
static int read_midx_preferred_pack(const char *object_dir)
|
|
{
|
|
struct multi_pack_index *midx = NULL;
|
|
struct bitmap_index *bitmap = NULL;
|
|
|
|
setup_git_directory();
|
|
|
|
midx = load_multi_pack_index(object_dir, 1);
|
|
if (!midx)
|
|
return 1;
|
|
|
|
bitmap = prepare_bitmap_git(the_repository);
|
|
if (!bitmap)
|
|
return 1;
|
|
if (!bitmap_is_midx(bitmap)) {
|
|
free_bitmap_index(bitmap);
|
|
return 1;
|
|
}
|
|
|
|
printf("%s\n", midx->pack_names[midx_preferred_pack(bitmap)]);
|
|
free_bitmap_index(bitmap);
|
|
return 0;
|
|
}
|
|
|
|
int cmd__read_midx(int argc, const char **argv)
|
|
{
|
|
if (!(argc == 2 || argc == 3))
|
|
usage("read-midx [--show-objects|--checksum|--preferred-pack] <object-dir>");
|
|
|
|
if (!strcmp(argv[1], "--show-objects"))
|
|
return read_midx_file(argv[2], 1);
|
|
else if (!strcmp(argv[1], "--checksum"))
|
|
return read_midx_checksum(argv[2]);
|
|
else if (!strcmp(argv[1], "--preferred-pack"))
|
|
return read_midx_preferred_pack(argv[2]);
|
|
return read_midx_file(argv[1], 0);
|
|
}
|