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); 222voidclear_commit_marks_for_object_array(struct object_array *a,unsigned mark); 223 224 225enum rev_sort_order { 226 REV_SORT_IN_GRAPH_ORDER =0, 227 REV_SORT_BY_COMMIT_DATE, 228 REV_SORT_BY_AUTHOR_DATE 229}; 230 231/* 232 * Performs an in-place topological sort of list supplied. 233 * 234 * invariant of resulting list is: 235 * a reachable from b => ord(b) < ord(a) 236 * sort_order further specifies: 237 * REV_SORT_IN_GRAPH_ORDER: try to show a commit on a single-parent 238 * chain together. 239 * REV_SORT_BY_COMMIT_DATE: show eligible commits in committer-date order. 240 */ 241voidsort_in_topological_order(struct commit_list **,enum rev_sort_order); 242 243struct commit_graft { 244struct object_id oid; 245int nr_parent;/* < 0 if shallow commit */ 246struct object_id parent[FLEX_ARRAY];/* more */ 247}; 248typedefint(*each_commit_graft_fn)(const struct commit_graft *,void*); 249 250struct commit_graft *read_graft_line(struct strbuf *line); 251intregister_commit_graft(struct commit_graft *,int); 252struct commit_graft *lookup_commit_graft(const struct object_id *oid); 253 254externstruct commit_list *get_merge_bases(struct commit *rev1,struct commit *rev2); 255externstruct commit_list *get_merge_bases_many(struct commit *one,int n,struct commit **twos); 256externstruct commit_list *get_octopus_merge_bases(struct commit_list *in); 257 258/* To be used only when object flags after this call no longer matter */ 259externstruct commit_list *get_merge_bases_many_dirty(struct commit *one,int n,struct commit **twos); 260 261/* largest positive number a signed 32-bit integer can contain */ 262#define INFINITE_DEPTH 0x7fffffff 263 264struct oid_array; 265struct ref; 266externintregister_shallow(const struct object_id *oid); 267externintunregister_shallow(const struct object_id *oid); 268externintfor_each_commit_graft(each_commit_graft_fn,void*); 269externintis_repository_shallow(void); 270externstruct commit_list *get_shallow_commits(struct object_array *heads, 271int depth,int shallow_flag,int not_shallow_flag); 272externstruct commit_list *get_shallow_commits_by_rev_list( 273int ac,const char**av,int shallow_flag,int not_shallow_flag); 274externvoidset_alternate_shallow_file(const char*path,int override); 275externintwrite_shallow_commits(struct strbuf *out,int use_pack_protocol, 276const struct oid_array *extra); 277externvoidsetup_alternate_shallow(struct lock_file *shallow_lock, 278const char**alternate_shallow_file, 279const struct oid_array *extra); 280externconst char*setup_temporary_shallow(const struct oid_array *extra); 281externvoidadvertise_shallow_grafts(int); 282 283struct shallow_info { 284struct oid_array *shallow; 285int*ours, nr_ours; 286int*theirs, nr_theirs; 287struct oid_array *ref; 288 289/* for receive-pack */ 290uint32_t**used_shallow; 291int*need_reachability_test; 292int*reachable; 293int*shallow_ref; 294struct commit **commits; 295int nr_commits; 296}; 297 298externvoidprepare_shallow_info(struct shallow_info *,struct oid_array *); 299externvoidclear_shallow_info(struct shallow_info *); 300externvoidremove_nonexistent_theirs_shallow(struct shallow_info *); 301externvoidassign_shallow_commits_to_refs(struct shallow_info *info, 302uint32_t**used, 303int*ref_status); 304externintdelayed_reachability_test(struct shallow_info *si,int c); 305externvoidprune_shallow(int show_only); 306externstruct trace_key trace_shallow; 307 308intis_descendant_of(struct commit *,struct commit_list *); 309intin_merge_bases(struct commit *,struct commit *); 310intin_merge_bases_many(struct commit *,int,struct commit **); 311 312externintinteractive_add(int argc,const char**argv,const char*prefix,int patch); 313externintrun_add_interactive(const char*revision,const char*patch_mode, 314const struct pathspec *pathspec); 315 316/* 317 * Takes a list of commits and returns a new list where those 318 * have been removed that can be reached from other commits in 319 * the list. It is useful for, e.g., reducing the commits 320 * randomly thrown at the git-merge command and removing 321 * redundant commits that the user shouldn't have given to it. 322 * 323 * This function destroys the STALE bit of the commit objects' 324 * flags. 325 */ 326externstruct commit_list *reduce_heads(struct commit_list *heads); 327 328/* 329 * Like `reduce_heads()`, except it replaces the list. Use this 330 * instead of `foo = reduce_heads(foo);` to avoid memory leaks. 331 */ 332externvoidreduce_heads_replace(struct commit_list **heads); 333 334struct commit_extra_header { 335struct commit_extra_header *next; 336char*key; 337char*value; 338size_t len; 339}; 340 341externvoidappend_merge_tag_headers(struct commit_list *parents, 342struct commit_extra_header ***tail); 343 344externintcommit_tree(const char*msg,size_t msg_len, 345const unsigned char*tree, 346struct commit_list *parents,unsigned char*ret, 347const char*author,const char*sign_commit); 348 349externintcommit_tree_extended(const char*msg,size_t msg_len, 350const unsigned char*tree, 351struct commit_list *parents,unsigned char*ret, 352const char*author,const char*sign_commit, 353struct commit_extra_header *); 354 355externstruct commit_extra_header *read_commit_extra_headers(struct commit *,const char**); 356 357externvoidfree_commit_extra_headers(struct commit_extra_header *extra); 358 359/* 360 * Search the commit object contents given by "msg" for the header "key". 361 * Returns a pointer to the start of the header contents, or NULL. The length 362 * of the header, up to the first newline, is returned via out_len. 363 * 364 * Note that some headers (like mergetag) may be multi-line. It is the caller's 365 * responsibility to parse further in this case! 366 */ 367externconst char*find_commit_header(const char*msg,const char*key, 368size_t*out_len); 369 370/* Find the end of the log message, the right place for a new trailer. */ 371externintignore_non_trailer(const char*buf,size_t len); 372 373typedefvoid(*each_mergetag_fn)(struct commit *commit,struct commit_extra_header *extra, 374void*cb_data); 375 376externvoidfor_each_mergetag(each_mergetag_fn fn,struct commit *commit,void*data); 377 378struct merge_remote_desc { 379struct object *obj;/* the named object, could be a tag */ 380char name[FLEX_ARRAY]; 381}; 382#define merge_remote_util(commit) ((struct merge_remote_desc *)((commit)->util)) 383externvoidset_merge_remote_desc(struct commit *commit, 384const char*name,struct object *obj); 385 386/* 387 * Given "name" from the command line to merge, find the commit object 388 * and return it, while storing merge_remote_desc in its ->util field, 389 * to allow callers to tell if we are told to merge a tag. 390 */ 391struct commit *get_merge_parent(const char*name); 392 393externintparse_signed_commit(const struct commit *commit, 394struct strbuf *message,struct strbuf *signature); 395externintremove_signature(struct strbuf *buf); 396 397/* 398 * Check the signature of the given commit. The result of the check is stored 399 * in sig->check_result, 'G' for a good signature, 'U' for a good signature 400 * from an untrusted signer, 'B' for a bad signature and 'N' for no signature 401 * at all. This may allocate memory for sig->gpg_output, sig->gpg_status, 402 * sig->signer and sig->key. 403 */ 404externintcheck_commit_signature(const struct commit *commit,struct signature_check *sigc); 405 406intcompare_commits_by_commit_date(const void*a_,const void*b_,void*unused); 407 408LAST_ARG_MUST_BE_NULL 409externintrun_commit_hook(int editor_is_used,const char*index_file,const char*name, ...); 410 411#endif/* COMMIT_H */