| #define USE_THE_REPOSITORY_VARIABLE | |
| #include "test-tool.h" | |
| #include "commit-graph.h" | |
| #include "commit.h" | |
| #include "hex.h" | |
| #include "object-name.h" | |
| #include "repository.h" | |
| #include "odb.h" | |
| #include "odb/source.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 odb_source *source; | |
| int ret = 0; | |
| setup_git_directory(the_repository); | |
| source = the_repository->objects->source; | |
| prepare_repo_settings(the_repository); | |
| graph = read_commit_graph_one(the_repository, source->path); | |
| 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 if (!strcmp(argv[1], "commit-info")) { | |
| int i; | |
| for (i = 2; i < argc; i++) { | |
| struct object_id oid; | |
| struct commit *c; | |
| if (repo_get_oid(the_repository, argv[i], &oid)) | |
| die("not a valid object name: '%s'", argv[i]); | |
| c = lookup_commit_in_graph(the_repository, &oid); | |
| if (!c) { | |
| fprintf(stderr, "%s: not in graph\n", argv[i]); | |
| ret = 1; | |
| continue; | |
| } | |
| printf("%s generation %"PRIuMAX"\n", | |
| oid_to_hex(&oid), | |
| (uintmax_t)commit_graph_generation(c)); | |
| } | |
| } else { | |
| fprintf(stderr, "unknown sub-command: '%s'\n", argv[1]); | |
| ret = 1; | |
| } | |
| done: | |
| free_commit_graph(graph); | |
| return ret; | |
| } |