Git fork
at 3da4413dbcdb8df021739ca6f20fe4f0bcd1fd3c 1969 lines 52 kB view raw
1#define USE_THE_REPOSITORY_VARIABLE 2 3#include "git-compat-util.h" 4#include "tag.h" 5#include "commit.h" 6#include "commit-graph.h" 7#include "environment.h" 8#include "gettext.h" 9#include "hex.h" 10#include "repository.h" 11#include "object-name.h" 12#include "odb.h" 13#include "utf8.h" 14#include "diff.h" 15#include "revision.h" 16#include "notes.h" 17#include "alloc.h" 18#include "gpg-interface.h" 19#include "mergesort.h" 20#include "commit-slab.h" 21#include "prio-queue.h" 22#include "hash-lookup.h" 23#include "wt-status.h" 24#include "advice.h" 25#include "refs.h" 26#include "commit-reach.h" 27#include "setup.h" 28#include "shallow.h" 29#include "tree.h" 30#include "hook.h" 31#include "parse.h" 32#include "object-file.h" 33#include "object-file-convert.h" 34#include "prio-queue.h" 35 36static struct commit_extra_header *read_commit_extra_header_lines(const char *buf, size_t len, const char **); 37 38int save_commit_buffer = 1; 39int no_graft_file_deprecated_advice; 40 41const char *commit_type = "commit"; 42 43struct commit *lookup_commit_reference_gently(struct repository *r, 44 const struct object_id *oid, int quiet) 45{ 46 struct object *obj = deref_tag(r, 47 parse_object(r, oid), 48 NULL, 0); 49 50 if (!obj) 51 return NULL; 52 return object_as_type(obj, OBJ_COMMIT, quiet); 53} 54 55struct commit *lookup_commit_reference(struct repository *r, const struct object_id *oid) 56{ 57 return lookup_commit_reference_gently(r, oid, 0); 58} 59 60struct commit *lookup_commit_or_die(const struct object_id *oid, const char *ref_name) 61{ 62 struct commit *c = lookup_commit_reference(the_repository, oid); 63 if (!c) 64 die(_("could not parse %s"), ref_name); 65 if (!oideq(oid, &c->object.oid)) { 66 warning(_("%s %s is not a commit!"), 67 ref_name, oid_to_hex(oid)); 68 } 69 return c; 70} 71 72struct commit *lookup_commit_object(struct repository *r, 73 const struct object_id *oid) 74{ 75 struct object *obj = parse_object(r, oid); 76 return obj ? object_as_type(obj, OBJ_COMMIT, 0) : NULL; 77 78} 79 80struct commit *lookup_commit(struct repository *r, const struct object_id *oid) 81{ 82 struct object *obj = lookup_object(r, oid); 83 if (!obj) 84 return create_object(r, oid, alloc_commit_node(r)); 85 return object_as_type(obj, OBJ_COMMIT, 0); 86} 87 88struct commit *lookup_commit_reference_by_name(const char *name) 89{ 90 return lookup_commit_reference_by_name_gently(name, 0); 91} 92 93struct commit *lookup_commit_reference_by_name_gently(const char *name, 94 int quiet) 95{ 96 struct object_id oid; 97 struct commit *commit; 98 99 if (repo_get_oid_committish(the_repository, name, &oid)) 100 return NULL; 101 commit = lookup_commit_reference_gently(the_repository, &oid, quiet); 102 if (repo_parse_commit(the_repository, commit)) 103 return NULL; 104 return commit; 105} 106 107static timestamp_t parse_commit_date(const char *buf, const char *tail) 108{ 109 const char *dateptr; 110 const char *eol; 111 112 if (buf + 6 >= tail) 113 return 0; 114 if (memcmp(buf, "author", 6)) 115 return 0; 116 while (buf < tail && *buf++ != '\n') 117 /* nada */; 118 if (buf + 9 >= tail) 119 return 0; 120 if (memcmp(buf, "committer", 9)) 121 return 0; 122 123 /* 124 * Jump to end-of-line so that we can walk backwards to find the 125 * end-of-email ">". This is more forgiving of malformed cases 126 * because unexpected characters tend to be in the name and email 127 * fields. 128 */ 129 eol = memchr(buf, '\n', tail - buf); 130 if (!eol) 131 return 0; 132 dateptr = eol; 133 while (dateptr > buf && dateptr[-1] != '>') 134 dateptr--; 135 if (dateptr == buf) 136 return 0; 137 138 /* 139 * Trim leading whitespace, but make sure we have at least one 140 * non-whitespace character, as parse_timestamp() will otherwise walk 141 * right past the newline we found in "eol" when skipping whitespace 142 * itself. 143 * 144 * In theory it would be sufficient to allow any character not matched 145 * by isspace(), but there's a catch: our isspace() does not 146 * necessarily match the behavior of parse_timestamp(), as the latter 147 * is implemented by system routines which match more exotic control 148 * codes, or even locale-dependent sequences. 149 * 150 * Since we expect the timestamp to be a number, we can check for that. 151 * Anything else (e.g., a non-numeric token like "foo") would just 152 * cause parse_timestamp() to return 0 anyway. 153 */ 154 while (dateptr < eol && isspace(*dateptr)) 155 dateptr++; 156 if (!isdigit(*dateptr) && *dateptr != '-') 157 return 0; 158 159 /* 160 * We know there is at least one digit (or dash), so we'll begin 161 * parsing there and stop at worst case at eol. 162 * 163 * Note that we may feed parse_timestamp() extra characters here if the 164 * commit is malformed, and it will parse as far as it can. For 165 * example, "123foo456" would return "123". That might be questionable 166 * (versus returning "0"), but it would help in a hypothetical case 167 * like "123456+0100", where the whitespace from the timezone is 168 * missing. Since such syntactic errors may be baked into history and 169 * hard to correct now, let's err on trying to make our best guess 170 * here, rather than insist on perfect syntax. 171 */ 172 return parse_timestamp(dateptr, NULL, 10); 173} 174 175static const struct object_id *commit_graft_oid_access(size_t index, const void *table) 176{ 177 const struct commit_graft * const *commit_graft_table = table; 178 return &commit_graft_table[index]->oid; 179} 180 181int commit_graft_pos(struct repository *r, const struct object_id *oid) 182{ 183 return oid_pos(oid, r->parsed_objects->grafts, 184 r->parsed_objects->grafts_nr, 185 commit_graft_oid_access); 186} 187 188void unparse_commit(struct repository *r, const struct object_id *oid) 189{ 190 struct commit *c = lookup_commit(r, oid); 191 192 if (!c->object.parsed) 193 return; 194 free_commit_list(c->parents); 195 c->parents = NULL; 196 c->object.parsed = 0; 197} 198 199int register_commit_graft(struct repository *r, struct commit_graft *graft, 200 int ignore_dups) 201{ 202 int pos = commit_graft_pos(r, &graft->oid); 203 204 if (0 <= pos) { 205 if (ignore_dups) 206 free(graft); 207 else { 208 free(r->parsed_objects->grafts[pos]); 209 r->parsed_objects->grafts[pos] = graft; 210 } 211 return 1; 212 } 213 pos = -pos - 1; 214 ALLOC_GROW(r->parsed_objects->grafts, 215 r->parsed_objects->grafts_nr + 1, 216 r->parsed_objects->grafts_alloc); 217 r->parsed_objects->grafts_nr++; 218 if (pos < r->parsed_objects->grafts_nr) 219 memmove(r->parsed_objects->grafts + pos + 1, 220 r->parsed_objects->grafts + pos, 221 (r->parsed_objects->grafts_nr - pos - 1) * 222 sizeof(*r->parsed_objects->grafts)); 223 r->parsed_objects->grafts[pos] = graft; 224 unparse_commit(r, &graft->oid); 225 return 0; 226} 227 228struct commit_graft *read_graft_line(struct strbuf *line) 229{ 230 /* The format is just "Commit Parent1 Parent2 ...\n" */ 231 int i, phase; 232 const char *tail = NULL; 233 struct commit_graft *graft = NULL; 234 struct object_id dummy_oid, *oid; 235 236 strbuf_rtrim(line); 237 if (!line->len || line->buf[0] == '#') 238 return NULL; 239 /* 240 * phase 0 verifies line, counts hashes in line and allocates graft 241 * phase 1 fills graft 242 */ 243 for (phase = 0; phase < 2; phase++) { 244 oid = graft ? &graft->oid : &dummy_oid; 245 if (parse_oid_hex(line->buf, oid, &tail)) 246 goto bad_graft_data; 247 for (i = 0; *tail != '\0'; i++) { 248 oid = graft ? &graft->parent[i] : &dummy_oid; 249 if (!isspace(*tail++) || parse_oid_hex(tail, oid, &tail)) 250 goto bad_graft_data; 251 } 252 if (!graft) { 253 graft = xmalloc(st_add(sizeof(*graft), 254 st_mult(sizeof(struct object_id), i))); 255 graft->nr_parent = i; 256 } 257 } 258 return graft; 259 260bad_graft_data: 261 error("bad graft data: %s", line->buf); 262 assert(!graft); 263 return NULL; 264} 265 266static int read_graft_file(struct repository *r, const char *graft_file) 267{ 268 FILE *fp = fopen_or_warn(graft_file, "r"); 269 struct strbuf buf = STRBUF_INIT; 270 if (!fp) 271 return -1; 272 if (!no_graft_file_deprecated_advice && 273 advice_enabled(ADVICE_GRAFT_FILE_DEPRECATED)) 274 advise(_("Support for <GIT_DIR>/info/grafts is deprecated\n" 275 "and will be removed in a future Git version.\n" 276 "\n" 277 "Please use \"git replace --convert-graft-file\"\n" 278 "to convert the grafts into replace refs.\n" 279 "\n" 280 "Turn this message off by running\n" 281 "\"git config set advice.graftFileDeprecated false\"")); 282 while (!strbuf_getwholeline(&buf, fp, '\n')) { 283 /* The format is just "Commit Parent1 Parent2 ...\n" */ 284 struct commit_graft *graft = read_graft_line(&buf); 285 if (!graft) 286 continue; 287 if (register_commit_graft(r, graft, 1)) 288 error("duplicate graft data: %s", buf.buf); 289 } 290 fclose(fp); 291 strbuf_release(&buf); 292 return 0; 293} 294 295void prepare_commit_graft(struct repository *r) 296{ 297 const char *graft_file; 298 299 if (r->parsed_objects->commit_graft_prepared) 300 return; 301 if (!startup_info->have_repository) 302 return; 303 304 graft_file = repo_get_graft_file(r); 305 read_graft_file(r, graft_file); 306 /* make sure shallows are read */ 307 is_repository_shallow(r); 308 r->parsed_objects->commit_graft_prepared = 1; 309} 310 311struct commit_graft *lookup_commit_graft(struct repository *r, const struct object_id *oid) 312{ 313 int pos; 314 prepare_commit_graft(r); 315 pos = commit_graft_pos(r, oid); 316 if (pos < 0) 317 return NULL; 318 return r->parsed_objects->grafts[pos]; 319} 320 321int for_each_commit_graft(each_commit_graft_fn fn, void *cb_data) 322{ 323 int i, ret; 324 for (i = ret = 0; i < the_repository->parsed_objects->grafts_nr && !ret; i++) 325 ret = fn(the_repository->parsed_objects->grafts[i], cb_data); 326 return ret; 327} 328 329struct commit_buffer { 330 void *buffer; 331 unsigned long size; 332}; 333define_commit_slab(buffer_slab, struct commit_buffer); 334 335struct buffer_slab *allocate_commit_buffer_slab(void) 336{ 337 struct buffer_slab *bs = xmalloc(sizeof(*bs)); 338 init_buffer_slab(bs); 339 return bs; 340} 341 342void free_commit_buffer_slab(struct buffer_slab *bs) 343{ 344 clear_buffer_slab(bs); 345 free(bs); 346} 347 348void set_commit_buffer(struct repository *r, struct commit *commit, void *buffer, unsigned long size) 349{ 350 struct commit_buffer *v = buffer_slab_at( 351 r->parsed_objects->buffer_slab, commit); 352 v->buffer = buffer; 353 v->size = size; 354} 355 356const void *get_cached_commit_buffer(struct repository *r, const struct commit *commit, unsigned long *sizep) 357{ 358 struct commit_buffer *v = buffer_slab_peek( 359 r->parsed_objects->buffer_slab, commit); 360 if (!v) { 361 if (sizep) 362 *sizep = 0; 363 return NULL; 364 } 365 if (sizep) 366 *sizep = v->size; 367 return v->buffer; 368} 369 370const void *repo_get_commit_buffer(struct repository *r, 371 const struct commit *commit, 372 unsigned long *sizep) 373{ 374 const void *ret = get_cached_commit_buffer(r, commit, sizep); 375 if (!ret) { 376 enum object_type type; 377 unsigned long size; 378 ret = odb_read_object(r->objects, &commit->object.oid, &type, &size); 379 if (!ret) 380 die("cannot read commit object %s", 381 oid_to_hex(&commit->object.oid)); 382 if (type != OBJ_COMMIT) 383 die("expected commit for %s, got %s", 384 oid_to_hex(&commit->object.oid), type_name(type)); 385 if (sizep) 386 *sizep = size; 387 } 388 return ret; 389} 390 391void repo_unuse_commit_buffer(struct repository *r, 392 const struct commit *commit, 393 const void *buffer) 394{ 395 struct commit_buffer *v = buffer_slab_peek( 396 r->parsed_objects->buffer_slab, commit); 397 if (!(v && v->buffer == buffer)) 398 free((void *)buffer); 399} 400 401void free_commit_buffer(struct parsed_object_pool *pool, struct commit *commit) 402{ 403 struct commit_buffer *v = buffer_slab_peek( 404 pool->buffer_slab, commit); 405 if (v) { 406 FREE_AND_NULL(v->buffer); 407 v->size = 0; 408 } 409} 410 411static inline void set_commit_tree(struct commit *c, struct tree *t) 412{ 413 c->maybe_tree = t; 414} 415 416struct tree *repo_get_commit_tree(struct repository *r, 417 const struct commit *commit) 418{ 419 if (commit->maybe_tree || !commit->object.parsed) 420 return commit->maybe_tree; 421 422 if (commit_graph_position(commit) != COMMIT_NOT_FROM_GRAPH) 423 return get_commit_tree_in_graph(r, commit); 424 425 return NULL; 426} 427 428struct object_id *get_commit_tree_oid(const struct commit *commit) 429{ 430 struct tree *tree = repo_get_commit_tree(the_repository, commit); 431 return tree ? &tree->object.oid : NULL; 432} 433 434void release_commit_memory(struct parsed_object_pool *pool, struct commit *c) 435{ 436 set_commit_tree(c, NULL); 437 free_commit_buffer(pool, c); 438 c->index = 0; 439 free_commit_list(c->parents); 440 441 c->object.parsed = 0; 442} 443 444const void *detach_commit_buffer(struct commit *commit, unsigned long *sizep) 445{ 446 struct commit_buffer *v = buffer_slab_peek( 447 the_repository->parsed_objects->buffer_slab, commit); 448 void *ret; 449 450 if (!v) { 451 if (sizep) 452 *sizep = 0; 453 return NULL; 454 } 455 ret = v->buffer; 456 if (sizep) 457 *sizep = v->size; 458 459 v->buffer = NULL; 460 v->size = 0; 461 return ret; 462} 463 464int parse_commit_buffer(struct repository *r, struct commit *item, const void *buffer, unsigned long size, int check_graph) 465{ 466 const char *tail = buffer; 467 const char *bufptr = buffer; 468 struct object_id parent; 469 struct commit_list **pptr; 470 struct commit_graft *graft; 471 const int tree_entry_len = the_hash_algo->hexsz + 5; 472 const int parent_entry_len = the_hash_algo->hexsz + 7; 473 struct tree *tree; 474 475 if (item->object.parsed) 476 return 0; 477 /* 478 * Presumably this is leftover from an earlier failed parse; 479 * clear it out in preparation for us re-parsing (we'll hit the 480 * same error, but that's good, since it lets our caller know 481 * the result cannot be trusted. 482 */ 483 free_commit_list(item->parents); 484 item->parents = NULL; 485 486 tail += size; 487 if (tail <= bufptr + tree_entry_len + 1 || memcmp(bufptr, "tree ", 5) || 488 bufptr[tree_entry_len] != '\n') 489 return error("bogus commit object %s", oid_to_hex(&item->object.oid)); 490 if (get_oid_hex(bufptr + 5, &parent) < 0) 491 return error("bad tree pointer in commit %s", 492 oid_to_hex(&item->object.oid)); 493 tree = lookup_tree(r, &parent); 494 if (!tree) 495 return error("bad tree pointer %s in commit %s", 496 oid_to_hex(&parent), 497 oid_to_hex(&item->object.oid)); 498 set_commit_tree(item, tree); 499 bufptr += tree_entry_len + 1; /* "tree " + "hex sha1" + "\n" */ 500 pptr = &item->parents; 501 502 graft = lookup_commit_graft(r, &item->object.oid); 503 if (graft) 504 r->parsed_objects->substituted_parent = 1; 505 while (bufptr + parent_entry_len < tail && !memcmp(bufptr, "parent ", 7)) { 506 struct commit *new_parent; 507 508 if (tail <= bufptr + parent_entry_len + 1 || 509 get_oid_hex(bufptr + 7, &parent) || 510 bufptr[parent_entry_len] != '\n') 511 return error("bad parents in commit %s", oid_to_hex(&item->object.oid)); 512 bufptr += parent_entry_len + 1; 513 /* 514 * The clone is shallow if nr_parent < 0, and we must 515 * not traverse its real parents even when we unhide them. 516 */ 517 if (graft && (graft->nr_parent < 0 || !grafts_keep_true_parents)) 518 continue; 519 new_parent = lookup_commit(r, &parent); 520 if (!new_parent) 521 return error("bad parent %s in commit %s", 522 oid_to_hex(&parent), 523 oid_to_hex(&item->object.oid)); 524 pptr = &commit_list_insert(new_parent, pptr)->next; 525 } 526 if (graft) { 527 int i; 528 struct commit *new_parent; 529 for (i = 0; i < graft->nr_parent; i++) { 530 new_parent = lookup_commit(r, 531 &graft->parent[i]); 532 if (!new_parent) 533 return error("bad graft parent %s in commit %s", 534 oid_to_hex(&graft->parent[i]), 535 oid_to_hex(&item->object.oid)); 536 pptr = &commit_list_insert(new_parent, pptr)->next; 537 } 538 } 539 item->date = parse_commit_date(bufptr, tail); 540 541 if (check_graph) 542 load_commit_graph_info(r, item); 543 544 item->object.parsed = 1; 545 return 0; 546} 547 548int repo_parse_commit_internal(struct repository *r, 549 struct commit *item, 550 int quiet_on_missing, 551 int use_commit_graph) 552{ 553 enum object_type type; 554 void *buffer; 555 unsigned long size; 556 struct object_info oi = { 557 .typep = &type, 558 .sizep = &size, 559 .contentp = &buffer, 560 }; 561 /* 562 * Git does not support partial clones that exclude commits, so set 563 * OBJECT_INFO_SKIP_FETCH_OBJECT to fail fast when an object is missing. 564 */ 565 int flags = OBJECT_INFO_LOOKUP_REPLACE | OBJECT_INFO_SKIP_FETCH_OBJECT | 566 OBJECT_INFO_DIE_IF_CORRUPT; 567 int ret; 568 569 if (!item) 570 return -1; 571 if (item->object.parsed) 572 return 0; 573 if (use_commit_graph && parse_commit_in_graph(r, item)) { 574 static int commit_graph_paranoia = -1; 575 576 if (commit_graph_paranoia == -1) 577 commit_graph_paranoia = git_env_bool(GIT_COMMIT_GRAPH_PARANOIA, 0); 578 579 if (commit_graph_paranoia && !odb_has_object(r->objects, &item->object.oid, 0)) { 580 unparse_commit(r, &item->object.oid); 581 return quiet_on_missing ? -1 : 582 error(_("commit %s exists in commit-graph but not in the object database"), 583 oid_to_hex(&item->object.oid)); 584 } 585 586 return 0; 587 } 588 589 if (odb_read_object_info_extended(r->objects, &item->object.oid, 590 &oi, flags) < 0) 591 return quiet_on_missing ? -1 : 592 error("Could not read %s", 593 oid_to_hex(&item->object.oid)); 594 if (type != OBJ_COMMIT) { 595 free(buffer); 596 return error("Object %s not a commit", 597 oid_to_hex(&item->object.oid)); 598 } 599 600 ret = parse_commit_buffer(r, item, buffer, size, 0); 601 if (save_commit_buffer && !ret && 602 !get_cached_commit_buffer(r, item, NULL)) { 603 set_commit_buffer(r, item, buffer, size); 604 return 0; 605 } 606 free(buffer); 607 return ret; 608} 609 610int repo_parse_commit_gently(struct repository *r, 611 struct commit *item, int quiet_on_missing) 612{ 613 return repo_parse_commit_internal(r, item, quiet_on_missing, 1); 614} 615 616void parse_commit_or_die(struct commit *item) 617{ 618 if (repo_parse_commit(the_repository, item)) 619 die("unable to parse commit %s", 620 item ? oid_to_hex(&item->object.oid) : "(null)"); 621} 622 623int find_commit_subject(const char *commit_buffer, const char **subject) 624{ 625 const char *eol; 626 const char *p = commit_buffer; 627 628 while (*p && (*p != '\n' || p[1] != '\n')) 629 p++; 630 if (*p) { 631 p = skip_blank_lines(p + 2); 632 eol = strchrnul(p, '\n'); 633 } else 634 eol = p; 635 636 *subject = p; 637 638 return eol - p; 639} 640 641size_t commit_subject_length(const char *body) 642{ 643 const char *p = body; 644 while (*p) { 645 const char *next = skip_blank_lines(p); 646 if (next != p) 647 break; 648 p = strchrnul(p, '\n'); 649 if (*p) 650 p++; 651 } 652 return p - body; 653} 654 655struct commit_list *commit_list_insert(struct commit *item, struct commit_list **list_p) 656{ 657 struct commit_list *new_list = xmalloc(sizeof(struct commit_list)); 658 new_list->item = item; 659 new_list->next = *list_p; 660 *list_p = new_list; 661 return new_list; 662} 663 664int commit_list_contains(struct commit *item, struct commit_list *list) 665{ 666 while (list) { 667 if (list->item == item) 668 return 1; 669 list = list->next; 670 } 671 672 return 0; 673} 674 675unsigned commit_list_count(const struct commit_list *l) 676{ 677 unsigned c = 0; 678 for (; l; l = l->next ) 679 c++; 680 return c; 681} 682 683struct commit_list *copy_commit_list(const struct commit_list *list) 684{ 685 struct commit_list *head = NULL; 686 struct commit_list **pp = &head; 687 while (list) { 688 pp = commit_list_append(list->item, pp); 689 list = list->next; 690 } 691 return head; 692} 693 694struct commit_list *reverse_commit_list(struct commit_list *list) 695{ 696 struct commit_list *next = NULL, *current, *backup; 697 for (current = list; current; current = backup) { 698 backup = current->next; 699 current->next = next; 700 next = current; 701 } 702 return next; 703} 704 705void free_commit_list(struct commit_list *list) 706{ 707 while (list) 708 pop_commit(&list); 709} 710 711struct commit_list * commit_list_insert_by_date(struct commit *item, struct commit_list **list) 712{ 713 struct commit_list **pp = list; 714 struct commit_list *p; 715 while ((p = *pp) != NULL) { 716 if (p->item->date < item->date) { 717 break; 718 } 719 pp = &p->next; 720 } 721 return commit_list_insert(item, pp); 722} 723 724static int commit_list_compare_by_date(const struct commit_list *a, 725 const struct commit_list *b) 726{ 727 timestamp_t a_date = a->item->date; 728 timestamp_t b_date = b->item->date; 729 if (a_date < b_date) 730 return 1; 731 if (a_date > b_date) 732 return -1; 733 return 0; 734} 735 736DEFINE_LIST_SORT(static, commit_list_sort, struct commit_list, next); 737 738void commit_list_sort_by_date(struct commit_list **list) 739{ 740 commit_list_sort(list, commit_list_compare_by_date); 741} 742 743struct commit *pop_most_recent_commit(struct prio_queue *queue, 744 unsigned int mark) 745{ 746 struct commit *ret = prio_queue_peek(queue); 747 int get_pending = 1; 748 struct commit_list *parents = ret->parents; 749 750 while (parents) { 751 struct commit *commit = parents->item; 752 if (!repo_parse_commit(the_repository, commit) && !(commit->object.flags & mark)) { 753 commit->object.flags |= mark; 754 if (get_pending) 755 prio_queue_replace(queue, commit); 756 else 757 prio_queue_put(queue, commit); 758 get_pending = 0; 759 } 760 parents = parents->next; 761 } 762 if (get_pending) 763 prio_queue_get(queue); 764 return ret; 765} 766 767static void clear_commit_marks_1(struct commit_list **plist, 768 struct commit *commit, unsigned int mark) 769{ 770 while (commit) { 771 struct commit_list *parents; 772 773 if (!(mark & commit->object.flags)) 774 return; 775 776 commit->object.flags &= ~mark; 777 778 parents = commit->parents; 779 if (!parents) 780 return; 781 782 while ((parents = parents->next)) { 783 if (parents->item->object.flags & mark) 784 commit_list_insert(parents->item, plist); 785 } 786 787 commit = commit->parents->item; 788 } 789} 790 791void clear_commit_marks_many(size_t nr, struct commit **commit, unsigned int mark) 792{ 793 for (size_t i = 0; i < nr; i++) 794 clear_commit_marks(commit[i], mark); 795} 796 797void clear_commit_marks(struct commit *commit, unsigned int mark) 798{ 799 struct commit_list *list = NULL; 800 801 clear_commit_marks_1(&list, commit, mark); 802 while (list) 803 clear_commit_marks_1(&list, pop_commit(&list), mark); 804} 805 806struct commit *pop_commit(struct commit_list **stack) 807{ 808 struct commit_list *top = *stack; 809 struct commit *item = top ? top->item : NULL; 810 811 if (top) { 812 *stack = top->next; 813 free(top); 814 } 815 return item; 816} 817 818/* 819 * Topological sort support 820 */ 821 822/* count number of children that have not been emitted */ 823define_commit_slab(indegree_slab, int); 824 825define_commit_slab(author_date_slab, timestamp_t); 826 827void record_author_date(struct author_date_slab *author_date, 828 struct commit *commit) 829{ 830 const char *buffer = repo_get_commit_buffer(the_repository, commit, 831 NULL); 832 struct ident_split ident; 833 const char *ident_line; 834 size_t ident_len; 835 char *date_end; 836 timestamp_t date; 837 838 ident_line = find_commit_header(buffer, "author", &ident_len); 839 if (!ident_line) 840 goto fail_exit; /* no author line */ 841 if (split_ident_line(&ident, ident_line, ident_len) || 842 !ident.date_begin || !ident.date_end) 843 goto fail_exit; /* malformed "author" line */ 844 845 date = parse_timestamp(ident.date_begin, &date_end, 10); 846 if (date_end != ident.date_end) 847 goto fail_exit; /* malformed date */ 848 *(author_date_slab_at(author_date, commit)) = date; 849 850fail_exit: 851 repo_unuse_commit_buffer(the_repository, commit, buffer); 852} 853 854int compare_commits_by_author_date(const void *a_, const void *b_, 855 void *cb_data) 856{ 857 const struct commit *a = a_, *b = b_; 858 struct author_date_slab *author_date = cb_data; 859 timestamp_t a_date = *(author_date_slab_at(author_date, a)); 860 timestamp_t b_date = *(author_date_slab_at(author_date, b)); 861 862 /* newer commits with larger date first */ 863 if (a_date < b_date) 864 return 1; 865 else if (a_date > b_date) 866 return -1; 867 return 0; 868} 869 870int compare_commits_by_gen_then_commit_date(const void *a_, const void *b_, 871 void *unused UNUSED) 872{ 873 const struct commit *a = a_, *b = b_; 874 const timestamp_t generation_a = commit_graph_generation(a), 875 generation_b = commit_graph_generation(b); 876 877 /* newer commits first */ 878 if (generation_a < generation_b) 879 return 1; 880 else if (generation_a > generation_b) 881 return -1; 882 883 /* use date as a heuristic when generations are equal */ 884 if (a->date < b->date) 885 return 1; 886 else if (a->date > b->date) 887 return -1; 888 return 0; 889} 890 891int compare_commits_by_commit_date(const void *a_, const void *b_, 892 void *unused UNUSED) 893{ 894 const struct commit *a = a_, *b = b_; 895 /* newer commits with larger date first */ 896 if (a->date < b->date) 897 return 1; 898 else if (a->date > b->date) 899 return -1; 900 return 0; 901} 902 903/* 904 * Performs an in-place topological sort on the list supplied. 905 */ 906void sort_in_topological_order(struct commit_list **list, enum rev_sort_order sort_order) 907{ 908 struct commit_list *next, *orig = *list; 909 struct commit_list **pptr; 910 struct indegree_slab indegree; 911 struct prio_queue queue; 912 struct commit *commit; 913 struct author_date_slab author_date; 914 915 if (!orig) 916 return; 917 *list = NULL; 918 919 init_indegree_slab(&indegree); 920 memset(&queue, '\0', sizeof(queue)); 921 922 switch (sort_order) { 923 default: /* REV_SORT_IN_GRAPH_ORDER */ 924 queue.compare = NULL; 925 break; 926 case REV_SORT_BY_COMMIT_DATE: 927 queue.compare = compare_commits_by_commit_date; 928 break; 929 case REV_SORT_BY_AUTHOR_DATE: 930 init_author_date_slab(&author_date); 931 queue.compare = compare_commits_by_author_date; 932 queue.cb_data = &author_date; 933 break; 934 } 935 936 /* Mark them and clear the indegree */ 937 for (next = orig; next; next = next->next) { 938 struct commit *commit = next->item; 939 *(indegree_slab_at(&indegree, commit)) = 1; 940 /* also record the author dates, if needed */ 941 if (sort_order == REV_SORT_BY_AUTHOR_DATE) 942 record_author_date(&author_date, commit); 943 } 944 945 /* update the indegree */ 946 for (next = orig; next; next = next->next) { 947 struct commit_list *parents = next->item->parents; 948 while (parents) { 949 struct commit *parent = parents->item; 950 int *pi = indegree_slab_at(&indegree, parent); 951 952 if (*pi) 953 (*pi)++; 954 parents = parents->next; 955 } 956 } 957 958 /* 959 * find the tips 960 * 961 * tips are nodes not reachable from any other node in the list 962 * 963 * the tips serve as a starting set for the work queue. 964 */ 965 for (next = orig; next; next = next->next) { 966 struct commit *commit = next->item; 967 968 if (*(indegree_slab_at(&indegree, commit)) == 1) 969 prio_queue_put(&queue, commit); 970 } 971 972 /* 973 * This is unfortunate; the initial tips need to be shown 974 * in the order given from the revision traversal machinery. 975 */ 976 if (sort_order == REV_SORT_IN_GRAPH_ORDER) 977 prio_queue_reverse(&queue); 978 979 /* We no longer need the commit list */ 980 free_commit_list(orig); 981 982 pptr = list; 983 *list = NULL; 984 while ((commit = prio_queue_get(&queue)) != NULL) { 985 struct commit_list *parents; 986 987 for (parents = commit->parents; parents ; parents = parents->next) { 988 struct commit *parent = parents->item; 989 int *pi = indegree_slab_at(&indegree, parent); 990 991 if (!*pi) 992 continue; 993 994 /* 995 * parents are only enqueued for emission 996 * when all their children have been emitted thereby 997 * guaranteeing topological order. 998 */ 999 if (--(*pi) == 1) 1000 prio_queue_put(&queue, parent); 1001 } 1002 /* 1003 * all children of commit have already been 1004 * emitted. we can emit it now. 1005 */ 1006 *(indegree_slab_at(&indegree, commit)) = 0; 1007 1008 pptr = &commit_list_insert(commit, pptr)->next; 1009 } 1010 1011 clear_indegree_slab(&indegree); 1012 clear_prio_queue(&queue); 1013 if (sort_order == REV_SORT_BY_AUTHOR_DATE) 1014 clear_author_date_slab(&author_date); 1015} 1016 1017struct rev_collect { 1018 struct commit **commit; 1019 int nr; 1020 int alloc; 1021 unsigned int initial : 1; 1022}; 1023 1024static void add_one_commit(struct object_id *oid, struct rev_collect *revs) 1025{ 1026 struct commit *commit; 1027 1028 if (is_null_oid(oid)) 1029 return; 1030 1031 commit = lookup_commit(the_repository, oid); 1032 if (!commit || 1033 (commit->object.flags & TMP_MARK) || 1034 repo_parse_commit(the_repository, commit)) 1035 return; 1036 1037 ALLOC_GROW(revs->commit, revs->nr + 1, revs->alloc); 1038 revs->commit[revs->nr++] = commit; 1039 commit->object.flags |= TMP_MARK; 1040} 1041 1042static int collect_one_reflog_ent(struct object_id *ooid, struct object_id *noid, 1043 const char *ident UNUSED, 1044 timestamp_t timestamp UNUSED, int tz UNUSED, 1045 const char *message UNUSED, void *cbdata) 1046{ 1047 struct rev_collect *revs = cbdata; 1048 1049 if (revs->initial) { 1050 revs->initial = 0; 1051 add_one_commit(ooid, revs); 1052 } 1053 add_one_commit(noid, revs); 1054 return 0; 1055} 1056 1057struct commit *get_fork_point(const char *refname, struct commit *commit) 1058{ 1059 struct object_id oid; 1060 struct rev_collect revs; 1061 struct commit_list *bases = NULL; 1062 int i; 1063 struct commit *ret = NULL; 1064 char *full_refname; 1065 1066 switch (repo_dwim_ref(the_repository, refname, strlen(refname), &oid, 1067 &full_refname, 0)) { 1068 case 0: 1069 die("No such ref: '%s'", refname); 1070 case 1: 1071 break; /* good */ 1072 default: 1073 die("Ambiguous refname: '%s'", refname); 1074 } 1075 1076 memset(&revs, 0, sizeof(revs)); 1077 revs.initial = 1; 1078 refs_for_each_reflog_ent(get_main_ref_store(the_repository), 1079 full_refname, collect_one_reflog_ent, &revs); 1080 1081 if (!revs.nr) 1082 add_one_commit(&oid, &revs); 1083 1084 for (i = 0; i < revs.nr; i++) 1085 revs.commit[i]->object.flags &= ~TMP_MARK; 1086 1087 if (repo_get_merge_bases_many(the_repository, commit, revs.nr, 1088 revs.commit, &bases) < 0) 1089 exit(128); 1090 1091 /* 1092 * There should be one and only one merge base, when we found 1093 * a common ancestor among reflog entries. 1094 */ 1095 if (!bases || bases->next) 1096 goto cleanup_return; 1097 1098 /* And the found one must be one of the reflog entries */ 1099 for (i = 0; i < revs.nr; i++) 1100 if (&bases->item->object == &revs.commit[i]->object) 1101 break; /* found */ 1102 if (revs.nr <= i) 1103 goto cleanup_return; 1104 1105 ret = bases->item; 1106 1107cleanup_return: 1108 free(revs.commit); 1109 free_commit_list(bases); 1110 free(full_refname); 1111 return ret; 1112} 1113 1114/* 1115 * Indexed by hash algorithm identifier. 1116 */ 1117static const char *gpg_sig_headers[] = { 1118 NULL, 1119 "gpgsig", 1120 "gpgsig-sha256", 1121}; 1122 1123int add_header_signature(struct strbuf *buf, struct strbuf *sig, const struct git_hash_algo *algo) 1124{ 1125 int inspos, copypos; 1126 const char *eoh; 1127 const char *gpg_sig_header = gpg_sig_headers[hash_algo_by_ptr(algo)]; 1128 int gpg_sig_header_len = strlen(gpg_sig_header); 1129 1130 /* find the end of the header */ 1131 eoh = strstr(buf->buf, "\n\n"); 1132 if (!eoh) 1133 inspos = buf->len; 1134 else 1135 inspos = eoh - buf->buf + 1; 1136 1137 for (copypos = 0; sig->buf[copypos]; ) { 1138 const char *bol = sig->buf + copypos; 1139 const char *eol = strchrnul(bol, '\n'); 1140 int len = (eol - bol) + !!*eol; 1141 1142 if (!copypos) { 1143 strbuf_insert(buf, inspos, gpg_sig_header, gpg_sig_header_len); 1144 inspos += gpg_sig_header_len; 1145 } 1146 strbuf_insertstr(buf, inspos++, " "); 1147 strbuf_insert(buf, inspos, bol, len); 1148 inspos += len; 1149 copypos += len; 1150 } 1151 return 0; 1152} 1153 1154static int sign_commit_to_strbuf(struct strbuf *sig, struct strbuf *buf, const char *keyid) 1155{ 1156 char *keyid_to_free = NULL; 1157 int ret = 0; 1158 if (!keyid || !*keyid) 1159 keyid = keyid_to_free = get_signing_key(); 1160 if (sign_buffer(buf, sig, keyid)) 1161 ret = -1; 1162 free(keyid_to_free); 1163 return ret; 1164} 1165 1166int parse_signed_commit(const struct commit *commit, 1167 struct strbuf *payload, struct strbuf *signature, 1168 const struct git_hash_algo *algop) 1169{ 1170 unsigned long size; 1171 const char *buffer = repo_get_commit_buffer(the_repository, commit, 1172 &size); 1173 int ret = parse_buffer_signed_by_header(buffer, size, payload, signature, algop); 1174 1175 repo_unuse_commit_buffer(the_repository, commit, buffer); 1176 return ret; 1177} 1178 1179int parse_buffer_signed_by_header(const char *buffer, 1180 unsigned long size, 1181 struct strbuf *payload, 1182 struct strbuf *signature, 1183 const struct git_hash_algo *algop) 1184{ 1185 int in_signature = 0, saw_signature = 0, other_signature = 0; 1186 const char *line, *tail, *p; 1187 const char *gpg_sig_header = gpg_sig_headers[hash_algo_by_ptr(algop)]; 1188 1189 line = buffer; 1190 tail = buffer + size; 1191 while (line < tail) { 1192 const char *sig = NULL; 1193 const char *next = memchr(line, '\n', tail - line); 1194 1195 next = next ? next + 1 : tail; 1196 if (in_signature && line[0] == ' ') 1197 sig = line + 1; 1198 else if (skip_prefix(line, gpg_sig_header, &p) && 1199 *p == ' ') { 1200 sig = line + strlen(gpg_sig_header) + 1; 1201 other_signature = 0; 1202 } 1203 else if (starts_with(line, "gpgsig")) 1204 other_signature = 1; 1205 else if (other_signature && line[0] != ' ') 1206 other_signature = 0; 1207 if (sig) { 1208 strbuf_add(signature, sig, next - sig); 1209 saw_signature = 1; 1210 in_signature = 1; 1211 } else { 1212 if (*line == '\n') 1213 /* dump the whole remainder of the buffer */ 1214 next = tail; 1215 if (!other_signature) 1216 strbuf_add(payload, line, next - line); 1217 in_signature = 0; 1218 } 1219 line = next; 1220 } 1221 return saw_signature; 1222} 1223 1224int remove_signature(struct strbuf *buf) 1225{ 1226 const char *line = buf->buf; 1227 const char *tail = buf->buf + buf->len; 1228 int in_signature = 0; 1229 struct sigbuf { 1230 const char *start; 1231 const char *end; 1232 } sigs[2], *sigp = &sigs[0]; 1233 int i; 1234 const char *orig_buf = buf->buf; 1235 1236 memset(sigs, 0, sizeof(sigs)); 1237 1238 while (line < tail) { 1239 const char *next = memchr(line, '\n', tail - line); 1240 next = next ? next + 1 : tail; 1241 1242 if (in_signature && line[0] == ' ') 1243 sigp->end = next; 1244 else if (starts_with(line, "gpgsig")) { 1245 int i; 1246 for (i = 1; i < GIT_HASH_NALGOS; i++) { 1247 const char *p; 1248 if (skip_prefix(line, gpg_sig_headers[i], &p) && 1249 *p == ' ') { 1250 sigp->start = line; 1251 sigp->end = next; 1252 in_signature = 1; 1253 } 1254 } 1255 } else { 1256 if (*line == '\n') 1257 /* dump the whole remainder of the buffer */ 1258 next = tail; 1259 if (in_signature && sigp - sigs != ARRAY_SIZE(sigs)) 1260 sigp++; 1261 in_signature = 0; 1262 } 1263 line = next; 1264 } 1265 1266 for (i = ARRAY_SIZE(sigs) - 1; i >= 0; i--) 1267 if (sigs[i].start) 1268 strbuf_remove(buf, sigs[i].start - orig_buf, sigs[i].end - sigs[i].start); 1269 1270 return sigs[0].start != NULL; 1271} 1272 1273static void handle_signed_tag(const struct commit *parent, struct commit_extra_header ***tail) 1274{ 1275 struct merge_remote_desc *desc; 1276 struct commit_extra_header *mergetag; 1277 char *buf; 1278 unsigned long size; 1279 enum object_type type; 1280 struct strbuf payload = STRBUF_INIT; 1281 struct strbuf signature = STRBUF_INIT; 1282 1283 desc = merge_remote_util(parent); 1284 if (!desc || !desc->obj) 1285 return; 1286 buf = odb_read_object(the_repository->objects, &desc->obj->oid, 1287 &type, &size); 1288 if (!buf || type != OBJ_TAG) 1289 goto free_return; 1290 if (!parse_signature(buf, size, &payload, &signature)) 1291 goto free_return; 1292 /* 1293 * We could verify this signature and either omit the tag when 1294 * it does not validate, but the integrator may not have the 1295 * public key of the signer of the tag being merged, while a 1296 * later auditor may have it while auditing, so let's not run 1297 * verify-signed-buffer here for now... 1298 * 1299 * if (verify_signed_buffer(buf, len, buf + len, size - len, ...)) 1300 * warn("warning: signed tag unverified."); 1301 */ 1302 CALLOC_ARRAY(mergetag, 1); 1303 mergetag->key = xstrdup("mergetag"); 1304 mergetag->value = buf; 1305 mergetag->len = size; 1306 1307 **tail = mergetag; 1308 *tail = &mergetag->next; 1309 strbuf_release(&payload); 1310 strbuf_release(&signature); 1311 return; 1312 1313free_return: 1314 free(buf); 1315} 1316 1317int check_commit_signature(const struct commit *commit, struct signature_check *sigc) 1318{ 1319 struct strbuf payload = STRBUF_INIT; 1320 struct strbuf signature = STRBUF_INIT; 1321 int ret = 1; 1322 1323 sigc->result = 'N'; 1324 1325 if (parse_signed_commit(commit, &payload, &signature, the_hash_algo) <= 0) 1326 goto out; 1327 1328 sigc->payload_type = SIGNATURE_PAYLOAD_COMMIT; 1329 sigc->payload = strbuf_detach(&payload, &sigc->payload_len); 1330 ret = check_signature(sigc, signature.buf, signature.len); 1331 1332 out: 1333 strbuf_release(&payload); 1334 strbuf_release(&signature); 1335 1336 return ret; 1337} 1338 1339void verify_merge_signature(struct commit *commit, int verbosity, 1340 int check_trust) 1341{ 1342 char hex[GIT_MAX_HEXSZ + 1]; 1343 struct signature_check signature_check; 1344 int ret; 1345 memset(&signature_check, 0, sizeof(signature_check)); 1346 1347 ret = check_commit_signature(commit, &signature_check); 1348 1349 repo_find_unique_abbrev_r(the_repository, hex, &commit->object.oid, 1350 DEFAULT_ABBREV); 1351 switch (signature_check.result) { 1352 case 'G': 1353 if (ret || (check_trust && signature_check.trust_level < TRUST_MARGINAL)) 1354 die(_("Commit %s has an untrusted GPG signature, " 1355 "allegedly by %s."), hex, signature_check.signer); 1356 break; 1357 case 'B': 1358 die(_("Commit %s has a bad GPG signature " 1359 "allegedly by %s."), hex, signature_check.signer); 1360 default: /* 'N' */ 1361 die(_("Commit %s does not have a GPG signature."), hex); 1362 } 1363 if (verbosity >= 0 && signature_check.result == 'G') 1364 printf(_("Commit %s has a good GPG signature by %s\n"), 1365 hex, signature_check.signer); 1366 1367 signature_check_clear(&signature_check); 1368} 1369 1370void append_merge_tag_headers(const struct commit_list *parents, 1371 struct commit_extra_header ***tail) 1372{ 1373 while (parents) { 1374 const struct commit *parent = parents->item; 1375 handle_signed_tag(parent, tail); 1376 parents = parents->next; 1377 } 1378} 1379 1380static int convert_commit_extra_headers(const struct commit_extra_header *orig, 1381 struct commit_extra_header **result) 1382{ 1383 const struct git_hash_algo *compat = the_repository->compat_hash_algo; 1384 const struct git_hash_algo *algo = the_repository->hash_algo; 1385 struct commit_extra_header *extra = NULL, **tail = &extra; 1386 struct strbuf out = STRBUF_INIT; 1387 while (orig) { 1388 struct commit_extra_header *new; 1389 CALLOC_ARRAY(new, 1); 1390 if (!strcmp(orig->key, "mergetag")) { 1391 if (convert_object_file(the_repository, &out, algo, compat, 1392 orig->value, orig->len, 1393 OBJ_TAG, 1)) { 1394 free(new); 1395 free_commit_extra_headers(extra); 1396 return -1; 1397 } 1398 new->key = xstrdup("mergetag"); 1399 new->value = strbuf_detach(&out, &new->len); 1400 } else { 1401 new->key = xstrdup(orig->key); 1402 new->len = orig->len; 1403 new->value = xmemdupz(orig->value, orig->len); 1404 } 1405 *tail = new; 1406 tail = &new->next; 1407 orig = orig->next; 1408 } 1409 *result = extra; 1410 return 0; 1411} 1412 1413static void add_extra_header(struct strbuf *buffer, 1414 const struct commit_extra_header *extra) 1415{ 1416 strbuf_addstr(buffer, extra->key); 1417 if (extra->len) 1418 strbuf_add_lines(buffer, " ", extra->value, extra->len); 1419 else 1420 strbuf_addch(buffer, '\n'); 1421} 1422 1423struct commit_extra_header *read_commit_extra_headers(struct commit *commit, 1424 const char **exclude) 1425{ 1426 struct commit_extra_header *extra = NULL; 1427 unsigned long size; 1428 const char *buffer = repo_get_commit_buffer(the_repository, commit, 1429 &size); 1430 extra = read_commit_extra_header_lines(buffer, size, exclude); 1431 repo_unuse_commit_buffer(the_repository, commit, buffer); 1432 return extra; 1433} 1434 1435int for_each_mergetag(each_mergetag_fn fn, struct commit *commit, void *data) 1436{ 1437 struct commit_extra_header *extra, *to_free; 1438 int res = 0; 1439 1440 to_free = read_commit_extra_headers(commit, NULL); 1441 for (extra = to_free; !res && extra; extra = extra->next) { 1442 if (strcmp(extra->key, "mergetag")) 1443 continue; /* not a merge tag */ 1444 res = fn(commit, extra, data); 1445 } 1446 free_commit_extra_headers(to_free); 1447 return res; 1448} 1449 1450static inline int standard_header_field(const char *field, size_t len) 1451{ 1452 return ((len == 4 && !memcmp(field, "tree", 4)) || 1453 (len == 6 && !memcmp(field, "parent", 6)) || 1454 (len == 6 && !memcmp(field, "author", 6)) || 1455 (len == 9 && !memcmp(field, "committer", 9)) || 1456 (len == 8 && !memcmp(field, "encoding", 8))); 1457} 1458 1459static int excluded_header_field(const char *field, size_t len, const char **exclude) 1460{ 1461 if (!exclude) 1462 return 0; 1463 1464 while (*exclude) { 1465 size_t xlen = strlen(*exclude); 1466 if (len == xlen && !memcmp(field, *exclude, xlen)) 1467 return 1; 1468 exclude++; 1469 } 1470 return 0; 1471} 1472 1473static struct commit_extra_header *read_commit_extra_header_lines( 1474 const char *buffer, size_t size, 1475 const char **exclude) 1476{ 1477 struct commit_extra_header *extra = NULL, **tail = &extra, *it = NULL; 1478 const char *line, *next, *eof, *eob; 1479 struct strbuf buf = STRBUF_INIT; 1480 1481 for (line = buffer, eob = line + size; 1482 line < eob && *line != '\n'; 1483 line = next) { 1484 next = memchr(line, '\n', eob - line); 1485 next = next ? next + 1 : eob; 1486 if (*line == ' ') { 1487 /* continuation */ 1488 if (it) 1489 strbuf_add(&buf, line + 1, next - (line + 1)); 1490 continue; 1491 } 1492 if (it) 1493 it->value = strbuf_detach(&buf, &it->len); 1494 strbuf_reset(&buf); 1495 it = NULL; 1496 1497 eof = memchr(line, ' ', next - line); 1498 if (!eof) 1499 eof = next; 1500 else if (standard_header_field(line, eof - line) || 1501 excluded_header_field(line, eof - line, exclude)) 1502 continue; 1503 1504 CALLOC_ARRAY(it, 1); 1505 it->key = xmemdupz(line, eof-line); 1506 *tail = it; 1507 tail = &it->next; 1508 if (eof + 1 < next) 1509 strbuf_add(&buf, eof + 1, next - (eof + 1)); 1510 } 1511 if (it) 1512 it->value = strbuf_detach(&buf, &it->len); 1513 return extra; 1514} 1515 1516void free_commit_extra_headers(struct commit_extra_header *extra) 1517{ 1518 while (extra) { 1519 struct commit_extra_header *next = extra->next; 1520 free(extra->key); 1521 free(extra->value); 1522 free(extra); 1523 extra = next; 1524 } 1525} 1526 1527int commit_tree(const char *msg, size_t msg_len, const struct object_id *tree, 1528 const struct commit_list *parents, struct object_id *ret, 1529 const char *author, const char *sign_commit) 1530{ 1531 struct commit_extra_header *extra = NULL, **tail = &extra; 1532 int result; 1533 1534 append_merge_tag_headers(parents, &tail); 1535 result = commit_tree_extended(msg, msg_len, tree, parents, ret, author, 1536 NULL, sign_commit, extra); 1537 free_commit_extra_headers(extra); 1538 return result; 1539} 1540 1541static int find_invalid_utf8(const char *buf, int len) 1542{ 1543 int offset = 0; 1544 static const unsigned int max_codepoint[] = { 1545 0x7f, 0x7ff, 0xffff, 0x10ffff 1546 }; 1547 1548 while (len) { 1549 unsigned char c = *buf++; 1550 int bytes, bad_offset; 1551 unsigned int codepoint; 1552 unsigned int min_val, max_val; 1553 1554 len--; 1555 offset++; 1556 1557 /* Simple US-ASCII? No worries. */ 1558 if (c < 0x80) 1559 continue; 1560 1561 bad_offset = offset-1; 1562 1563 /* 1564 * Count how many more high bits set: that's how 1565 * many more bytes this sequence should have. 1566 */ 1567 bytes = 0; 1568 while (c & 0x40) { 1569 c <<= 1; 1570 bytes++; 1571 } 1572 1573 /* 1574 * Must be between 1 and 3 more bytes. Longer sequences result in 1575 * codepoints beyond U+10FFFF, which are guaranteed never to exist. 1576 */ 1577 if (bytes < 1 || 3 < bytes) 1578 return bad_offset; 1579 1580 /* Do we *have* that many bytes? */ 1581 if (len < bytes) 1582 return bad_offset; 1583 1584 /* 1585 * Place the encoded bits at the bottom of the value and compute the 1586 * valid range. 1587 */ 1588 codepoint = (c & 0x7f) >> bytes; 1589 min_val = max_codepoint[bytes-1] + 1; 1590 max_val = max_codepoint[bytes]; 1591 1592 offset += bytes; 1593 len -= bytes; 1594 1595 /* And verify that they are good continuation bytes */ 1596 do { 1597 codepoint <<= 6; 1598 codepoint |= *buf & 0x3f; 1599 if ((*buf++ & 0xc0) != 0x80) 1600 return bad_offset; 1601 } while (--bytes); 1602 1603 /* Reject codepoints that are out of range for the sequence length. */ 1604 if (codepoint < min_val || codepoint > max_val) 1605 return bad_offset; 1606 /* Surrogates are only for UTF-16 and cannot be encoded in UTF-8. */ 1607 if ((codepoint & 0x1ff800) == 0xd800) 1608 return bad_offset; 1609 /* U+xxFFFE and U+xxFFFF are guaranteed non-characters. */ 1610 if ((codepoint & 0xfffe) == 0xfffe) 1611 return bad_offset; 1612 /* So are anything in the range U+FDD0..U+FDEF. */ 1613 if (codepoint >= 0xfdd0 && codepoint <= 0xfdef) 1614 return bad_offset; 1615 } 1616 return -1; 1617} 1618 1619/* 1620 * This verifies that the buffer is in proper utf8 format. 1621 * 1622 * If it isn't, it assumes any non-utf8 characters are Latin1, 1623 * and does the conversion. 1624 */ 1625static int verify_utf8(struct strbuf *buf) 1626{ 1627 int ok = 1; 1628 long pos = 0; 1629 1630 for (;;) { 1631 int bad; 1632 unsigned char c; 1633 unsigned char replace[2]; 1634 1635 bad = find_invalid_utf8(buf->buf + pos, buf->len - pos); 1636 if (bad < 0) 1637 return ok; 1638 pos += bad; 1639 ok = 0; 1640 c = buf->buf[pos]; 1641 strbuf_remove(buf, pos, 1); 1642 1643 /* We know 'c' must be in the range 128-255 */ 1644 replace[0] = 0xc0 + (c >> 6); 1645 replace[1] = 0x80 + (c & 0x3f); 1646 strbuf_insert(buf, pos, replace, 2); 1647 pos += 2; 1648 } 1649} 1650 1651static const char commit_utf8_warn[] = 1652N_("Warning: commit message did not conform to UTF-8.\n" 1653 "You may want to amend it after fixing the message, or set the config\n" 1654 "variable i18n.commitEncoding to the encoding your project uses.\n"); 1655 1656static void write_commit_tree(struct strbuf *buffer, const char *msg, size_t msg_len, 1657 const struct object_id *tree, 1658 const struct object_id *parents, size_t parents_len, 1659 const char *author, const char *committer, 1660 const struct commit_extra_header *extra) 1661{ 1662 int encoding_is_utf8; 1663 size_t i; 1664 1665 /* Not having i18n.commitencoding is the same as having utf-8 */ 1666 encoding_is_utf8 = is_encoding_utf8(git_commit_encoding); 1667 1668 strbuf_grow(buffer, 8192); /* should avoid reallocs for the headers */ 1669 strbuf_addf(buffer, "tree %s\n", oid_to_hex(tree)); 1670 1671 /* 1672 * NOTE! This ordering means that the same exact tree merged with a 1673 * different order of parents will be a _different_ changeset even 1674 * if everything else stays the same. 1675 */ 1676 for (i = 0; i < parents_len; i++) 1677 strbuf_addf(buffer, "parent %s\n", oid_to_hex(&parents[i])); 1678 1679 /* Person/date information */ 1680 if (!author) 1681 author = git_author_info(IDENT_STRICT); 1682 strbuf_addf(buffer, "author %s\n", author); 1683 if (!committer) 1684 committer = git_committer_info(IDENT_STRICT); 1685 strbuf_addf(buffer, "committer %s\n", committer); 1686 if (!encoding_is_utf8) 1687 strbuf_addf(buffer, "encoding %s\n", git_commit_encoding); 1688 1689 while (extra) { 1690 add_extra_header(buffer, extra); 1691 extra = extra->next; 1692 } 1693 strbuf_addch(buffer, '\n'); 1694 1695 /* And add the comment */ 1696 strbuf_add(buffer, msg, msg_len); 1697} 1698 1699int commit_tree_extended(const char *msg, size_t msg_len, 1700 const struct object_id *tree, 1701 const struct commit_list *parents, struct object_id *ret, 1702 const char *author, const char *committer, 1703 const char *sign_commit, 1704 const struct commit_extra_header *extra) 1705{ 1706 struct repository *r = the_repository; 1707 int result = 0; 1708 int encoding_is_utf8; 1709 struct strbuf buffer = STRBUF_INIT, compat_buffer = STRBUF_INIT; 1710 struct strbuf sig = STRBUF_INIT, compat_sig = STRBUF_INIT; 1711 struct object_id *parent_buf = NULL, *compat_oid = NULL; 1712 struct object_id compat_oid_buf; 1713 size_t i, nparents; 1714 1715 /* Not having i18n.commitencoding is the same as having utf-8 */ 1716 encoding_is_utf8 = is_encoding_utf8(git_commit_encoding); 1717 1718 odb_assert_oid_type(the_repository->objects, tree, OBJ_TREE); 1719 1720 if (memchr(msg, '\0', msg_len)) 1721 return error("a NUL byte in commit log message not allowed."); 1722 1723 nparents = commit_list_count(parents); 1724 CALLOC_ARRAY(parent_buf, nparents); 1725 i = 0; 1726 for (const struct commit_list *p = parents; p; p = p->next) 1727 oidcpy(&parent_buf[i++], &p->item->object.oid); 1728 1729 write_commit_tree(&buffer, msg, msg_len, tree, parent_buf, nparents, author, committer, extra); 1730 if (sign_commit && sign_commit_to_strbuf(&sig, &buffer, sign_commit)) { 1731 result = -1; 1732 goto out; 1733 } 1734 if (r->compat_hash_algo) { 1735 struct commit_extra_header *compat_extra = NULL; 1736 struct object_id mapped_tree; 1737 struct object_id *mapped_parents; 1738 1739 CALLOC_ARRAY(mapped_parents, nparents); 1740 1741 if (repo_oid_to_algop(r, tree, r->compat_hash_algo, &mapped_tree)) { 1742 result = -1; 1743 free(mapped_parents); 1744 goto out; 1745 } 1746 for (i = 0; i < nparents; i++) 1747 if (repo_oid_to_algop(r, &parent_buf[i], r->compat_hash_algo, &mapped_parents[i])) { 1748 result = -1; 1749 free(mapped_parents); 1750 goto out; 1751 } 1752 if (convert_commit_extra_headers(extra, &compat_extra)) { 1753 result = -1; 1754 free(mapped_parents); 1755 goto out; 1756 } 1757 write_commit_tree(&compat_buffer, msg, msg_len, &mapped_tree, 1758 mapped_parents, nparents, author, committer, compat_extra); 1759 free_commit_extra_headers(compat_extra); 1760 free(mapped_parents); 1761 1762 if (sign_commit && sign_commit_to_strbuf(&compat_sig, &compat_buffer, sign_commit)) { 1763 result = -1; 1764 goto out; 1765 } 1766 } 1767 1768 if (sign_commit) { 1769 struct sig_pairs { 1770 struct strbuf *sig; 1771 const struct git_hash_algo *algo; 1772 } bufs [2] = { 1773 { &compat_sig, r->compat_hash_algo }, 1774 { &sig, r->hash_algo }, 1775 }; 1776 1777 /* 1778 * We write algorithms in the order they were implemented in 1779 * Git to produce a stable hash when multiple algorithms are 1780 * used. 1781 */ 1782 if (r->compat_hash_algo && hash_algo_by_ptr(bufs[0].algo) > hash_algo_by_ptr(bufs[1].algo)) 1783 SWAP(bufs[0], bufs[1]); 1784 1785 /* 1786 * We traverse each algorithm in order, and apply the signature 1787 * to each buffer. 1788 */ 1789 for (size_t i = 0; i < ARRAY_SIZE(bufs); i++) { 1790 if (!bufs[i].algo) 1791 continue; 1792 add_header_signature(&buffer, bufs[i].sig, bufs[i].algo); 1793 if (r->compat_hash_algo) 1794 add_header_signature(&compat_buffer, bufs[i].sig, bufs[i].algo); 1795 } 1796 } 1797 1798 /* And check the encoding. */ 1799 if (encoding_is_utf8 && (!verify_utf8(&buffer) || !verify_utf8(&compat_buffer))) 1800 fprintf(stderr, _(commit_utf8_warn)); 1801 1802 if (r->compat_hash_algo) { 1803 hash_object_file(r->compat_hash_algo, compat_buffer.buf, compat_buffer.len, 1804 OBJ_COMMIT, &compat_oid_buf); 1805 compat_oid = &compat_oid_buf; 1806 } 1807 1808 result = odb_write_object_ext(the_repository->objects, buffer.buf, buffer.len, 1809 OBJ_COMMIT, ret, compat_oid, 0); 1810out: 1811 free(parent_buf); 1812 strbuf_release(&buffer); 1813 strbuf_release(&compat_buffer); 1814 strbuf_release(&sig); 1815 strbuf_release(&compat_sig); 1816 return result; 1817} 1818 1819define_commit_slab(merge_desc_slab, struct merge_remote_desc *); 1820static struct merge_desc_slab merge_desc_slab = COMMIT_SLAB_INIT(1, merge_desc_slab); 1821 1822struct merge_remote_desc *merge_remote_util(const struct commit *commit) 1823{ 1824 return *merge_desc_slab_at(&merge_desc_slab, commit); 1825} 1826 1827void set_merge_remote_desc(struct commit *commit, 1828 const char *name, struct object *obj) 1829{ 1830 struct merge_remote_desc *desc; 1831 FLEX_ALLOC_STR(desc, name, name); 1832 desc->obj = obj; 1833 *merge_desc_slab_at(&merge_desc_slab, commit) = desc; 1834} 1835 1836struct commit *get_merge_parent(const char *name) 1837{ 1838 struct object *obj; 1839 struct commit *commit; 1840 struct object_id oid; 1841 if (repo_get_oid(the_repository, name, &oid)) 1842 return NULL; 1843 obj = parse_object(the_repository, &oid); 1844 commit = (struct commit *)repo_peel_to_type(the_repository, name, 0, 1845 obj, OBJ_COMMIT); 1846 if (commit && !merge_remote_util(commit)) 1847 set_merge_remote_desc(commit, name, obj); 1848 return commit; 1849} 1850 1851/* 1852 * Append a commit to the end of the commit_list. 1853 * 1854 * next starts by pointing to the variable that holds the head of an 1855 * empty commit_list, and is updated to point to the "next" field of 1856 * the last item on the list as new commits are appended. 1857 * 1858 * Usage example: 1859 * 1860 * struct commit_list *list; 1861 * struct commit_list **next = &list; 1862 * 1863 * next = commit_list_append(c1, next); 1864 * next = commit_list_append(c2, next); 1865 * assert(commit_list_count(list) == 2); 1866 * return list; 1867 */ 1868struct commit_list **commit_list_append(struct commit *commit, 1869 struct commit_list **next) 1870{ 1871 struct commit_list *new_commit = xmalloc(sizeof(struct commit_list)); 1872 new_commit->item = commit; 1873 *next = new_commit; 1874 new_commit->next = NULL; 1875 return &new_commit->next; 1876} 1877 1878const char *find_commit_header(const char *msg, const char *key, size_t *out_len) 1879{ 1880 int key_len = strlen(key); 1881 const char *line = msg; 1882 1883 while (line) { 1884 const char *eol = strchrnul(line, '\n'); 1885 1886 if (line == eol) 1887 return NULL; 1888 1889 if (eol - line > key_len && 1890 !strncmp(line, key, key_len) && 1891 line[key_len] == ' ') { 1892 *out_len = eol - line - key_len - 1; 1893 return line + key_len + 1; 1894 } 1895 line = *eol ? eol + 1 : NULL; 1896 } 1897 return NULL; 1898} 1899 1900/* 1901 * Inspect the given string and determine the true "end" of the log message, in 1902 * order to find where to put a new Signed-off-by trailer. Ignored are 1903 * trailing comment lines and blank lines. To support "git commit -s 1904 * --amend" on an existing commit, we also ignore "Conflicts:". To 1905 * support "git commit -v", we truncate at cut lines. 1906 * 1907 * Returns the number of bytes from the tail to ignore, to be fed as 1908 * the second parameter to append_signoff(). 1909 */ 1910size_t ignored_log_message_bytes(const char *buf, size_t len) 1911{ 1912 size_t boc = 0; 1913 size_t bol = 0; 1914 int in_old_conflicts_block = 0; 1915 size_t cutoff = wt_status_locate_end(buf, len); 1916 1917 while (bol < cutoff) { 1918 const char *next_line = memchr(buf + bol, '\n', len - bol); 1919 1920 if (!next_line) 1921 next_line = buf + len; 1922 else 1923 next_line++; 1924 1925 if (starts_with_mem(buf + bol, cutoff - bol, comment_line_str) || 1926 buf[bol] == '\n') { 1927 /* is this the first of the run of comments? */ 1928 if (!boc) 1929 boc = bol; 1930 /* otherwise, it is just continuing */ 1931 } else if (starts_with(buf + bol, "Conflicts:\n")) { 1932 in_old_conflicts_block = 1; 1933 if (!boc) 1934 boc = bol; 1935 } else if (in_old_conflicts_block && buf[bol] == '\t') { 1936 ; /* a pathname in the conflicts block */ 1937 } else if (boc) { 1938 /* the previous was not trailing comment */ 1939 boc = 0; 1940 in_old_conflicts_block = 0; 1941 } 1942 bol = next_line - buf; 1943 } 1944 return boc ? len - boc : len - cutoff; 1945} 1946 1947int run_commit_hook(int editor_is_used, const char *index_file, 1948 int *invoked_hook, const char *name, ...) 1949{ 1950 struct run_hooks_opt opt = RUN_HOOKS_OPT_INIT; 1951 va_list args; 1952 const char *arg; 1953 1954 strvec_pushf(&opt.env, "GIT_INDEX_FILE=%s", index_file); 1955 1956 /* 1957 * Let the hook know that no editor will be launched. 1958 */ 1959 if (!editor_is_used) 1960 strvec_push(&opt.env, "GIT_EDITOR=:"); 1961 1962 va_start(args, name); 1963 while ((arg = va_arg(args, const char *))) 1964 strvec_push(&opt.args, arg); 1965 va_end(args); 1966 1967 opt.invoked_hook = invoked_hook; 1968 return run_hooks_opt(the_repository, name, &opt); 1969}