1#ifndef COMMIT_H 2#define COMMIT_H 3 4#include"object.h" 5#include"tree.h" 6#include"strbuf.h" 7#include"decorate.h" 8#include"gpg-interface.h" 9#include"string-list.h" 10 11struct commit_list { 12struct commit *item; 13struct commit_list *next; 14}; 15 16struct commit { 17struct object object; 18void*util; 19unsigned int index; 20 timestamp_t date; 21struct commit_list *parents; 22struct tree *tree; 23}; 24 25externint save_commit_buffer; 26externconst char*commit_type; 27 28/* While we can decorate any object with a name, it's only used for commits.. */ 29struct name_decoration { 30struct name_decoration *next; 31int type; 32char name[FLEX_ARRAY]; 33}; 34 35enum decoration_type { 36 DECORATION_NONE =0, 37 DECORATION_REF_LOCAL, 38 DECORATION_REF_REMOTE, 39 DECORATION_REF_TAG, 40 DECORATION_REF_STASH, 41 DECORATION_REF_HEAD, 42 DECORATION_GRAFTED, 43}; 44 45voidadd_name_decoration(enum decoration_type type,const char*name,struct object *obj); 46const struct name_decoration *get_name_decoration(const struct object *obj); 47 48struct commit *lookup_commit(const struct object_id *oid); 49struct commit *lookup_commit_reference(const struct object_id *oid); 50struct commit *lookup_commit_reference_gently(const struct object_id *oid, 51int quiet); 52struct commit *lookup_commit_reference_by_name(const char*name); 53 54/* 55 * Look up object named by "oid", dereference tag as necessary, 56 * get a commit and return it. If "oid" does not dereference to 57 * a commit, use ref_name to report an error and die. 58 */ 59struct commit *lookup_commit_or_die(const struct object_id *oid,const char*ref_name); 60 61intparse_commit_buffer(struct commit *item,const void*buffer,unsigned long size); 62intparse_commit_gently(struct commit *item,int quiet_on_missing); 63staticinlineintparse_commit(struct commit *item) 64{ 65returnparse_commit_gently(item,0); 66} 67voidparse_commit_or_die(struct commit *item); 68 69/* 70 * Associate an object buffer with the commit. The ownership of the 71 * memory is handed over to the commit, and must be free()-able. 72 */ 73voidset_commit_buffer(struct commit *,void*buffer,unsigned long size); 74 75/* 76 * Get any cached object buffer associated with the commit. Returns NULL 77 * if none. The resulting memory should not be freed. 78 */ 79const void*get_cached_commit_buffer(const struct commit *,unsigned long*size); 80 81/* 82 * Get the commit's object contents, either from cache or by reading the object 83 * from disk. The resulting memory should not be modified, and must be given 84 * to unuse_commit_buffer when the caller is done. 85 */ 86const void*get_commit_buffer(const struct commit *,unsigned long*size); 87 88/* 89 * Tell the commit subsytem that we are done with a particular commit buffer. 90 * The commit and buffer should be the input and return value, respectively, 91 * from an earlier call to get_commit_buffer. The buffer may or may not be 92 * freed by this call; callers should not access the memory afterwards. 93 */ 94voidunuse_commit_buffer(const struct commit *,const void*buffer); 95 96/* 97 * Free any cached object buffer associated with the commit. 98 */ 99voidfree_commit_buffer(struct commit *); 100 101/* 102 * Disassociate any cached object buffer from the commit, but do not free it. 103 * The buffer (or NULL, if none) is returned. 104 */ 105const void*detach_commit_buffer(struct commit *,unsigned long*sizep); 106 107/* Find beginning and length of commit subject. */ 108intfind_commit_subject(const char*commit_buffer,const char**subject); 109 110struct commit_list *commit_list_insert(struct commit *item, 111struct commit_list **list); 112struct commit_list **commit_list_append(struct commit *commit, 113struct commit_list **next); 114unsignedcommit_list_count(const struct commit_list *l); 115struct commit_list *commit_list_insert_by_date(struct commit *item, 116struct commit_list **list); 117voidcommit_list_sort_by_date(struct commit_list **list); 118 119/* Shallow copy of the input list */ 120struct commit_list *copy_commit_list(struct commit_list *list); 121 122voidfree_commit_list(struct commit_list *list); 123 124/* Commit formats */ 125enum cmit_fmt { 126 CMIT_FMT_RAW, 127 CMIT_FMT_MEDIUM, 128 CMIT_FMT_DEFAULT = CMIT_FMT_MEDIUM, 129 CMIT_FMT_SHORT, 130 CMIT_FMT_FULL, 131 CMIT_FMT_FULLER, 132 CMIT_FMT_ONELINE, 133 CMIT_FMT_EMAIL, 134 CMIT_FMT_MBOXRD, 135 CMIT_FMT_USERFORMAT, 136 137 CMIT_FMT_UNSPECIFIED 138}; 139 140staticinlineintcmit_fmt_is_mail(enum cmit_fmt fmt) 141{ 142return(fmt == CMIT_FMT_EMAIL || fmt == CMIT_FMT_MBOXRD); 143} 144 145struct rev_info;/* in revision.h, it circularly uses enum cmit_fmt */ 146 147struct pretty_print_context { 148/* 149 * Callers should tweak these to change the behavior of pp_* functions. 150 */ 151enum cmit_fmt fmt; 152int abbrev; 153const char*after_subject; 154int preserve_subject; 155struct date_mode date_mode; 156unsigned date_mode_explicit:1; 157int print_email_subject; 158int expand_tabs_in_log; 159int need_8bit_cte; 160char*notes_message; 161struct reflog_walk_info *reflog_info; 162struct rev_info *rev; 163const char*output_encoding; 164struct string_list *mailmap; 165int color; 166struct ident_split *from_ident; 167 168/* 169 * Fields below here are manipulated internally by pp_* functions and 170 * should not be counted on by callers. 171 */ 172struct string_list in_body_headers; 173int graph_width; 174}; 175 176struct userformat_want { 177unsigned notes:1; 178}; 179 180externinthas_non_ascii(const char*text); 181externconst char*logmsg_reencode(const struct commit *commit, 182char**commit_encoding, 183const char*output_encoding); 184externvoidget_commit_format(const char*arg,struct rev_info *); 185externconst char*format_subject(struct strbuf *sb,const char*msg, 186const char*line_separator); 187externvoiduserformat_find_requirements(const char*fmt,struct userformat_want *w); 188externintcommit_format_is_empty(enum cmit_fmt); 189externconst char*skip_blank_lines(const char*msg); 190externvoidformat_commit_message(const struct commit *commit, 191const char*format,struct strbuf *sb, 192const struct pretty_print_context *context); 193externvoidpretty_print_commit(struct pretty_print_context *pp, 194const struct commit *commit, 195struct strbuf *sb); 196externvoidpp_commit_easy(enum cmit_fmt fmt,const struct commit *commit, 197struct strbuf *sb); 198voidpp_user_info(struct pretty_print_context *pp, 199const char*what,struct strbuf *sb, 200const char*line,const char*encoding); 201voidpp_title_line(struct pretty_print_context *pp, 202const char**msg_p, 203struct strbuf *sb, 204const char*encoding, 205int need_8bit_cte); 206voidpp_remainder(struct pretty_print_context *pp, 207const char**msg_p, 208struct strbuf *sb, 209int indent); 210 211 212/** Removes the first commit from a list sorted by date, and adds all 213 * of its parents. 214 **/ 215struct commit *pop_most_recent_commit(struct commit_list **list, 216unsigned int mark); 217 218struct commit *pop_commit(struct commit_list **stack); 219 220voidclear_commit_marks(struct commit *commit,unsigned int mark); 221voidclear_commit_marks_many(int nr,struct commit **commit,unsigned int mark); 222 223 224enum rev_sort_order { 225 REV_SORT_IN_GRAPH_ORDER =0, 226 REV_SORT_BY_COMMIT_DATE, 227 REV_SORT_BY_AUTHOR_DATE 228}; 229 230/* 231 * Performs an in-place topological sort of list supplied. 232 * 233 * invariant of resulting list is: 234 * a reachable from b => ord(b) < ord(a) 235 * sort_order further specifies: 236 * REV_SORT_IN_GRAPH_ORDER: try to show a commit on a single-parent 237 * chain together. 238 * REV_SORT_BY_COMMIT_DATE: show eligible commits in committer-date order. 239 */ 240voidsort_in_topological_order(struct commit_list **,enum rev_sort_order); 241 242struct commit_graft { 243struct object_id oid; 244int nr_parent;/* < 0 if shallow commit */ 245struct object_id parent[FLEX_ARRAY];/* more */ 246}; 247typedefint(*each_commit_graft_fn)(const struct commit_graft *,void*); 248 249struct commit_graft *read_graft_line(struct strbuf *line); 250intregister_commit_graft(struct commit_graft *,int); 251struct commit_graft *lookup_commit_graft(const struct object_id *oid); 252 253externstruct commit_list *get_merge_bases(struct commit *rev1,struct commit *rev2); 254externstruct commit_list *get_merge_bases_many(struct commit *one,int n,struct commit **twos); 255externstruct commit_list *get_octopus_merge_bases(struct commit_list *in); 256 257/* To be used only when object flags after this call no longer matter */ 258externstruct commit_list *get_merge_bases_many_dirty(struct commit *one,int n,struct commit **twos); 259 260/* largest positive number a signed 32-bit integer can contain */ 261#define INFINITE_DEPTH 0x7fffffff 262 263struct oid_array; 264struct ref; 265externintregister_shallow(const struct object_id *oid); 266externintunregister_shallow(const struct object_id *oid); 267externintfor_each_commit_graft(each_commit_graft_fn,void*); 268externintis_repository_shallow(void); 269externstruct commit_list *get_shallow_commits(struct object_array *heads, 270int depth,int shallow_flag,int not_shallow_flag); 271externstruct commit_list *get_shallow_commits_by_rev_list( 272int ac,const char**av,int shallow_flag,int not_shallow_flag); 273externvoidset_alternate_shallow_file(const char*path,int override); 274externintwrite_shallow_commits(struct strbuf *out,int use_pack_protocol, 275const struct oid_array *extra); 276externvoidsetup_alternate_shallow(struct lock_file *shallow_lock, 277const char**alternate_shallow_file, 278const struct oid_array *extra); 279externconst char*setup_temporary_shallow(const struct oid_array *extra); 280externvoidadvertise_shallow_grafts(int); 281 282struct shallow_info { 283struct oid_array *shallow; 284int*ours, nr_ours; 285int*theirs, nr_theirs; 286struct oid_array *ref; 287 288/* for receive-pack */ 289uint32_t**used_shallow; 290int*need_reachability_test; 291int*reachable; 292int*shallow_ref; 293struct commit **commits; 294int nr_commits; 295}; 296 297externvoidprepare_shallow_info(struct shallow_info *,struct oid_array *); 298externvoidclear_shallow_info(struct shallow_info *); 299externvoidremove_nonexistent_theirs_shallow(struct shallow_info *); 300externvoidassign_shallow_commits_to_refs(struct shallow_info *info, 301uint32_t**used, 302int*ref_status); 303externintdelayed_reachability_test(struct shallow_info *si,int c); 304externvoidprune_shallow(int show_only); 305externstruct trace_key trace_shallow; 306 307intis_descendant_of(struct commit *,struct commit_list *); 308intin_merge_bases(struct commit *,struct commit *); 309intin_merge_bases_many(struct commit *,int,struct commit **); 310 311externintinteractive_add(int argc,const char**argv,const char*prefix,int patch); 312externintrun_add_interactive(const char*revision,const char*patch_mode, 313const struct pathspec *pathspec); 314 315/* 316 * Takes a list of commits and returns a new list where those 317 * have been removed that can be reached from other commits in 318 * the list. It is useful for, e.g., reducing the commits 319 * randomly thrown at the git-merge command and removing 320 * redundant commits that the user shouldn't have given to it. 321 * 322 * This function destroys the STALE bit of the commit objects' 323 * flags. 324 */ 325externstruct commit_list *reduce_heads(struct commit_list *heads); 326 327/* 328 * Like `reduce_heads()`, except it replaces the list. Use this 329 * instead of `foo = reduce_heads(foo);` to avoid memory leaks. 330 */ 331externvoidreduce_heads_replace(struct commit_list **heads); 332 333struct commit_extra_header { 334struct commit_extra_header *next; 335char*key; 336char*value; 337size_t len; 338}; 339 340externvoidappend_merge_tag_headers(struct commit_list *parents, 341struct commit_extra_header ***tail); 342 343externintcommit_tree(const char*msg,size_t msg_len, 344const unsigned char*tree, 345struct commit_list *parents,unsigned char*ret, 346const char*author,const char*sign_commit); 347 348externintcommit_tree_extended(const char*msg,size_t msg_len, 349const unsigned char*tree, 350struct commit_list *parents,unsigned char*ret, 351const char*author,const char*sign_commit, 352struct commit_extra_header *); 353 354externstruct commit_extra_header *read_commit_extra_headers(struct commit *,const char**); 355 356externvoidfree_commit_extra_headers(struct commit_extra_header *extra); 357 358/* 359 * Search the commit object contents given by "msg" for the header "key". 360 * Returns a pointer to the start of the header contents, or NULL. The length 361 * of the header, up to the first newline, is returned via out_len. 362 * 363 * Note that some headers (like mergetag) may be multi-line. It is the caller's 364 * responsibility to parse further in this case! 365 */ 366externconst char*find_commit_header(const char*msg,const char*key, 367size_t*out_len); 368 369/* Find the end of the log message, the right place for a new trailer. */ 370externintignore_non_trailer(const char*buf,size_t len); 371 372typedefvoid(*each_mergetag_fn)(struct commit *commit,struct commit_extra_header *extra, 373void*cb_data); 374 375externvoidfor_each_mergetag(each_mergetag_fn fn,struct commit *commit,void*data); 376 377struct merge_remote_desc { 378struct object *obj;/* the named object, could be a tag */ 379char name[FLEX_ARRAY]; 380}; 381#define merge_remote_util(commit) ((struct merge_remote_desc *)((commit)->util)) 382externvoidset_merge_remote_desc(struct commit *commit, 383const char*name,struct object *obj); 384 385/* 386 * Given "name" from the command line to merge, find the commit object 387 * and return it, while storing merge_remote_desc in its ->util field, 388 * to allow callers to tell if we are told to merge a tag. 389 */ 390struct commit *get_merge_parent(const char*name); 391 392externintparse_signed_commit(const struct commit *commit, 393struct strbuf *message,struct strbuf *signature); 394externintremove_signature(struct strbuf *buf); 395 396/* 397 * Check the signature of the given commit. The result of the check is stored 398 * in sig->check_result, 'G' for a good signature, 'U' for a good signature 399 * from an untrusted signer, 'B' for a bad signature and 'N' for no signature 400 * at all. This may allocate memory for sig->gpg_output, sig->gpg_status, 401 * sig->signer and sig->key. 402 */ 403externintcheck_commit_signature(const struct commit *commit,struct signature_check *sigc); 404 405intcompare_commits_by_commit_date(const void*a_,const void*b_,void*unused); 406 407LAST_ARG_MUST_BE_NULL 408externintrun_commit_hook(int editor_is_used,const char*index_file,const char*name, ...); 409 410#endif/* COMMIT_H */