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 12struct commit; 13 14char*get_commit_graph_filename(const char*obj_dir); 15intopen_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 */ 27intparse_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 */ 35voidload_commit_graph_info(struct repository *r,struct commit *item); 36 37struct tree *get_commit_tree_in_graph(struct repository *r, 38const struct commit *c); 39 40struct commit_graph { 41int graph_fd; 42 43const unsigned char*data; 44size_t data_len; 45 46unsigned char hash_len; 47unsigned char num_chunks; 48uint32_t num_commits; 49struct object_id oid; 50char*filename; 51const char*obj_dir; 52 53uint32_t num_commits_in_base; 54struct commit_graph *base_graph; 55 56const uint32_t*chunk_oid_fanout; 57const unsigned char*chunk_oid_lookup; 58const unsigned char*chunk_commit_data; 59const unsigned char*chunk_extra_edges; 60const unsigned char*chunk_base_graphs; 61}; 62 63struct commit_graph *load_commit_graph_one_fd_st(int fd,struct stat *st); 64struct commit_graph *read_commit_graph_one(struct repository *r,const char*obj_dir); 65struct commit_graph *parse_commit_graph(void*graph_map,int fd, 66size_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 */ 72intgeneration_numbers_enabled(struct repository *r); 73 74#define COMMIT_GRAPH_APPEND (1 << 0) 75#define COMMIT_GRAPH_PROGRESS (1 << 1) 76#define COMMIT_GRAPH_SPLIT (1 << 2) 77 78struct split_commit_graph_opts { 79int size_multiple; 80int max_commits; 81 timestamp_t expire_time; 82}; 83 84/* 85 * The write_commit_graph* methods return zero on success 86 * and a negative value on failure. Note that if the repository 87 * is not compatible with the commit-graph feature, then the 88 * methods will return 0 without writing a commit-graph. 89 */ 90intwrite_commit_graph_reachable(const char*obj_dir,unsigned int flags, 91const struct split_commit_graph_opts *split_opts); 92intwrite_commit_graph(const char*obj_dir, 93struct string_list *pack_indexes, 94struct string_list *commit_hex, 95unsigned int flags, 96const struct split_commit_graph_opts *split_opts); 97 98#define COMMIT_GRAPH_VERIFY_SHALLOW (1 << 0) 99 100intverify_commit_graph(struct repository *r,struct commit_graph *g,int flags); 101 102voidclose_commit_graph(struct raw_object_store *); 103voidfree_commit_graph(struct commit_graph *); 104 105#endif