1 #ifndef COMMIT_GRAPH_H 2 #define COMMIT_GRAPH_H 3 4 #include "git-compat-util.h" 5 #include "object-store.h" 6 #include "oidset.h" 7 8 #define GIT_TEST_COMMIT_GRAPH "GIT_TEST_COMMIT_GRAPH" 9 #define GIT_TEST_COMMIT_GRAPH_DIE_ON_PARSE "GIT_TEST_COMMIT_GRAPH_DIE_ON_PARSE" 10 #define GIT_TEST_COMMIT_GRAPH_CHANGED_PATHS "GIT_TEST_COMMIT_GRAPH_CHANGED_PATHS" 11 12 /* 13 * This method is only used to enhance coverage of the commit-graph 14 * feature in the test suite with the GIT_TEST_COMMIT_GRAPH and 15 * GIT_TEST_COMMIT_GRAPH_CHANGED_PATHS environment variables. Do not 16 * call this method oustide of a builtin, and only if you know what 17 * you are doing! 18 */ 19 void git_test_write_commit_graph_or_die(void); 20 21 struct commit; 22 struct bloom_filter_settings; 23 struct repository; 24 struct raw_object_store; 25 struct string_list; 26 27 char *get_commit_graph_filename(struct object_directory *odb); 28 char *get_commit_graph_chain_filename(struct object_directory *odb); 29 int open_commit_graph(const char *graph_file, int *fd, struct stat *st); 30 31 /* 32 * Given a commit struct, try to fill the commit struct info, including: 33 * 1. tree object 34 * 2. date 35 * 3. parents. 36 * 37 * Returns 1 if and only if the commit was found in the packed graph. 38 * 39 * See parse_commit_buffer() for the fallback after this call. 40 */ 41 int parse_commit_in_graph(struct repository *r, struct commit *item); 42 43 /* 44 * Look up the given commit ID in the commit-graph. This will only return a 45 * commit if the ID exists both in the graph and in the object database such 46 * that we don't return commits whose object has been pruned. Otherwise, this 47 * function returns `NULL`. 48 */ 49 struct commit *lookup_commit_in_graph(struct repository *repo, const struct object_id *id); 50 51 /* 52 * It is possible that we loaded commit contents from the commit buffer, 53 * but we also want to ensure the commit-graph content is correctly 54 * checked and filled. Fill the graph_pos and generation members of 55 * the given commit. 56 */ 57 void load_commit_graph_info(struct repository *r, struct commit *item); 58 59 struct tree *get_commit_tree_in_graph(struct repository *r, 60 const struct commit *c); 61 62 struct commit_graph { 63 const unsigned char *data; 64 size_t data_len; 65 66 unsigned char hash_len; 67 unsigned char num_chunks; 68 uint32_t num_commits; 69 struct object_id oid; 70 char *filename; 71 struct object_directory *odb; 72 73 uint32_t num_commits_in_base; 74 unsigned int read_generation_data; 75 struct commit_graph *base_graph; 76 77 const uint32_t *chunk_oid_fanout; 78 const unsigned char *chunk_oid_lookup; 79 const unsigned char *chunk_commit_data; 80 const unsigned char *chunk_generation_data; 81 const unsigned char *chunk_generation_data_overflow; 82 const unsigned char *chunk_extra_edges; 83 const unsigned char *chunk_base_graphs; 84 const unsigned char *chunk_bloom_indexes; 85 const unsigned char *chunk_bloom_data; 86 87 struct topo_level_slab *topo_levels; 88 struct bloom_filter_settings *bloom_filter_settings; 89 }; 90 91 struct commit_graph *load_commit_graph_one_fd_st(struct repository *r, 92 int fd, struct stat *st, 93 struct object_directory *odb); 94 struct commit_graph *read_commit_graph_one(struct repository *r, 95 struct object_directory *odb); 96 struct commit_graph *parse_commit_graph(struct repository *r, 97 void *graph_map, size_t graph_size); 98 99 /* 100 * Return 1 if and only if the repository has a commit-graph 101 * file and generation numbers are computed in that file. 102 */ 103 int generation_numbers_enabled(struct repository *r); 104 105 /* 106 * Return 1 if and only if the repository has a commit-graph 107 * file and generation data chunk has been written for the file. 108 */ 109 int corrected_commit_dates_enabled(struct repository *r); 110 111 struct bloom_filter_settings *get_bloom_filter_settings(struct repository *r); 112 113 enum commit_graph_write_flags { 114 COMMIT_GRAPH_WRITE_APPEND = (1 << 0), 115 COMMIT_GRAPH_WRITE_PROGRESS = (1 << 1), 116 COMMIT_GRAPH_WRITE_SPLIT = (1 << 2), 117 COMMIT_GRAPH_WRITE_BLOOM_FILTERS = (1 << 3), 118 COMMIT_GRAPH_NO_WRITE_BLOOM_FILTERS = (1 << 4), 119 }; 120 121 enum commit_graph_split_flags { 122 COMMIT_GRAPH_SPLIT_UNSPECIFIED = 0, 123 COMMIT_GRAPH_SPLIT_MERGE_PROHIBITED = 1, 124 COMMIT_GRAPH_SPLIT_REPLACE = 2 125 }; 126 127 struct commit_graph_opts { 128 int size_multiple; 129 int max_commits; 130 timestamp_t expire_time; 131 enum commit_graph_split_flags split_flags; 132 int max_new_filters; 133 }; 134 135 /* 136 * The write_commit_graph* methods return zero on success 137 * and a negative value on failure. Note that if the repository 138 * is not compatible with the commit-graph feature, then the 139 * methods will return 0 without writing a commit-graph. 140 */ 141 int write_commit_graph_reachable(struct object_directory *odb, 142 enum commit_graph_write_flags flags, 143 const struct commit_graph_opts *opts); 144 int write_commit_graph(struct object_directory *odb, 145 struct string_list *pack_indexes, 146 struct oidset *commits, 147 enum commit_graph_write_flags flags, 148 const struct commit_graph_opts *opts); 149 150 #define COMMIT_GRAPH_VERIFY_SHALLOW (1 << 0) 151 152 int verify_commit_graph(struct repository *r, struct commit_graph *g, int flags); 153 154 void close_commit_graph(struct raw_object_store *); 155 void free_commit_graph(struct commit_graph *); 156 157 /* 158 * Disable further use of the commit graph in this process when parsing a 159 * "struct commit". 160 */ 161 void disable_commit_graph(struct repository *r); 162 163 struct commit_graph_data { 164 uint32_t graph_pos; 165 timestamp_t generation; 166 }; 167 168 /* 169 * Commits should be parsed before accessing generation, graph positions. 170 */ 171 timestamp_t commit_graph_generation(const struct commit *); 172 uint32_t commit_graph_position(const struct commit *); 173 #endif 174