#define USE_THE_REPOSITORY_VARIABLE

#include "test-tool.h"
#include "commit-graph.h"
#include "repository.h"
#include "object-store-ll.h"
#include "bloom.h"
#include "setup.h"

static void dump_graph_info(struct commit_graph *graph)
{
	printf("header: %08x %d %d %d %d\n",
		ntohl(*(uint32_t*)graph->data),
		*(unsigned char*)(graph->data + 4),
		*(unsigned char*)(graph->data + 5),
		*(unsigned char*)(graph->data + 6),
		*(unsigned char*)(graph->data + 7));
	printf("num_commits: %u\n", graph->num_commits);
	printf("chunks:");

	if (graph->chunk_oid_fanout)
		printf(" oid_fanout");
	if (graph->chunk_oid_lookup)
		printf(" oid_lookup");
	if (graph->chunk_commit_data)
		printf(" commit_metadata");
	if (graph->chunk_generation_data)
		printf(" generation_data");
	if (graph->chunk_generation_data_overflow)
		printf(" generation_data_overflow");
	if (graph->chunk_extra_edges)
		printf(" extra_edges");
	if (graph->chunk_bloom_indexes)
		printf(" bloom_indexes");
	if (graph->chunk_bloom_data)
		printf(" bloom_data");
	printf("\n");

	printf("options:");
	if (graph->bloom_filter_settings)
		printf(" bloom(%"PRIu32",%"PRIu32",%"PRIu32")",
		       graph->bloom_filter_settings->hash_version,
		       graph->bloom_filter_settings->bits_per_entry,
		       graph->bloom_filter_settings->num_hashes);
	if (graph->read_generation_data)
		printf(" read_generation_data");
	if (graph->topo_levels)
		printf(" topo_levels");
	printf("\n");
}

static void dump_graph_bloom_filters(struct commit_graph *graph)
{
	uint32_t i;

	for (i = 0; i < graph->num_commits + graph->num_commits_in_base; i++) {
		struct bloom_filter filter = { 0 };
		size_t j;

		if (load_bloom_filter_from_graph(graph, &filter, i) < 0) {
			fprintf(stderr, "missing Bloom filter for graph "
				"position %"PRIu32"\n", i);
			continue;
		}

		for (j = 0; j < filter.len; j++)
			printf("%02x", filter.data[j]);
		if (filter.len)
			printf("\n");
	}
}

int cmd__read_graph(int argc, const char **argv)
{
	struct commit_graph *graph = NULL;
	struct object_directory *odb;
	int ret = 0;

	setup_git_directory();
	odb = the_repository->objects->odb;

	prepare_repo_settings(the_repository);

	graph = read_commit_graph_one(the_repository, odb);
	if (!graph) {
		ret = 1;
		goto done;
	}

	if (argc <= 1)
		dump_graph_info(graph);
	else if (!strcmp(argv[1], "bloom-filters"))
		dump_graph_bloom_filters(graph);
	else {
		fprintf(stderr, "unknown sub-command: '%s'\n", argv[1]);
		ret = 1;
	}

done:
	free_commit_graph(graph);
	return ret;
}
