1 #ifndef COMMIT_GRAPH_H 2 #define COMMIT_GRAPH_H 3 4 #include "git-compat-util.h" 5 #include "repository.h" 6 #include "string-list.h" 7 #include "cache.h" 8 9 #define GIT_TEST_COMMIT_GRAPH "GIT_TEST_COMMIT_GRAPH" 10 #define GIT_TEST_COMMIT_GRAPH_DIE_ON_LOAD "GIT_TEST_COMMIT_GRAPH_DIE_ON_LOAD" 11 12 struct commit; 13 14 char *get_commit_graph_filename(const char *obj_dir); 15 int open_commit_graph(const char *graph_file, int *fd, struct stat *st); 16 17 /* 18 * Given a commit struct, try to fill the commit struct info, including: 19 * 1. tree object 20 * 2. date 21 * 3. parents. 22 * 23 * Returns 1 if and only if the commit was found in the packed graph. 24 * 25 * See parse_commit_buffer() for the fallback after this call. 26 */ 27 int parse_commit_in_graph(struct repository *r, struct commit *item); 28 29 /* 30 * It is possible that we loaded commit contents from the commit buffer, 31 * but we also want to ensure the commit-graph content is correctly 32 * checked and filled. Fill the graph_pos and generation members of 33 * the given commit. 34 */ 35 void load_commit_graph_info(struct repository *r, struct commit *item); 36 37 struct tree *get_commit_tree_in_graph(struct repository *r, 38 const struct commit *c); 39 40 struct commit_graph { 41 int graph_fd; 42 43 const unsigned char *data; 44 size_t data_len; 45 46 unsigned char hash_len; 47 unsigned char num_chunks; 48 uint32_t num_commits; 49 struct object_id oid; 50 char *filename; 51 const char *obj_dir; 52 53 uint32_t num_commits_in_base; 54 struct commit_graph *base_graph; 55 56 const uint32_t *chunk_oid_fanout; 57 const unsigned char *chunk_oid_lookup; 58 const unsigned char *chunk_commit_data; 59 const unsigned char *chunk_extra_edges; 60 const unsigned char *chunk_base_graphs; 61 }; 62 63 struct commit_graph *load_commit_graph_one_fd_st(int fd, struct stat *st); 64 struct commit_graph *read_commit_graph_one(struct repository *r, const char *obj_dir); 65 struct commit_graph *parse_commit_graph(void *graph_map, int fd, 66 size_t graph_size); 67 68 /* 69 * Return 1 if and only if the repository has a commit-graph 70 * file and generation numbers are computed in that file. 71 */ 72 int generation_numbers_enabled(struct repository *r); 73 74 enum commit_graph_write_flags { 75 COMMIT_GRAPH_WRITE_APPEND = (1 << 0), 76 COMMIT_GRAPH_WRITE_PROGRESS = (1 << 1), 77 COMMIT_GRAPH_WRITE_SPLIT = (1 << 2), 78 /* Make sure that each OID in the input is a valid commit OID. */ 79 COMMIT_GRAPH_WRITE_CHECK_OIDS = (1 << 3) 80 }; 81 82 struct split_commit_graph_opts { 83 int size_multiple; 84 int max_commits; 85 timestamp_t expire_time; 86 }; 87 88 /* 89 * The write_commit_graph* methods return zero on success 90 * and a negative value on failure. Note that if the repository 91 * is not compatible with the commit-graph feature, then the 92 * methods will return 0 without writing a commit-graph. 93 */ 94 int write_commit_graph_reachable(const char *obj_dir, 95 enum commit_graph_write_flags flags, 96 const struct split_commit_graph_opts *split_opts); 97 int write_commit_graph(const char *obj_dir, 98 struct string_list *pack_indexes, 99 struct string_list *commit_hex, 100 enum commit_graph_write_flags flags, 101 const struct split_commit_graph_opts *split_opts); 102 103 #define COMMIT_GRAPH_VERIFY_SHALLOW (1 << 0) 104 105 int verify_commit_graph(struct repository *r, struct commit_graph *g, int flags); 106 107 void close_commit_graph(struct raw_object_store *); 108 void free_commit_graph(struct commit_graph *); 109 110 /* 111 * Disable further use of the commit graph in this process when parsing a 112 * "struct commit". 113 */ 114 void disable_commit_graph(struct repository *r); 115 116 #endif 117