1#include"cache.h" 2#include"refs.h" 3#include"cache-tree.h" 4#include"mergesort.h" 5#include"diff.h" 6#include"diffcore.h" 7#include"tag.h" 8#include"blame.h" 9 10voidblame_origin_decref(struct blame_origin *o) 11{ 12if(o && --o->refcnt <=0) { 13struct blame_origin *p, *l = NULL; 14if(o->previous) 15blame_origin_decref(o->previous); 16free(o->file.ptr); 17/* Should be present exactly once in commit chain */ 18for(p = o->commit->util; p; l = p, p = p->next) { 19if(p == o) { 20if(l) 21 l->next = p->next; 22else 23 o->commit->util = p->next; 24free(o); 25return; 26} 27} 28die("internal error in blame_origin_decref"); 29} 30} 31 32/* 33 * Given a commit and a path in it, create a new origin structure. 34 * The callers that add blame to the scoreboard should use 35 * get_origin() to obtain shared, refcounted copy instead of calling 36 * this function directly. 37 */ 38static struct blame_origin *make_origin(struct commit *commit,const char*path) 39{ 40struct blame_origin *o; 41FLEX_ALLOC_STR(o, path, path); 42 o->commit = commit; 43 o->refcnt =1; 44 o->next = commit->util; 45 commit->util = o; 46return o; 47} 48 49/* 50 * Locate an existing origin or create a new one. 51 * This moves the origin to front position in the commit util list. 52 */ 53static struct blame_origin *get_origin(struct commit *commit,const char*path) 54{ 55struct blame_origin *o, *l; 56 57for(o = commit->util, l = NULL; o; l = o, o = o->next) { 58if(!strcmp(o->path, path)) { 59/* bump to front */ 60if(l) { 61 l->next = o->next; 62 o->next = commit->util; 63 commit->util = o; 64} 65returnblame_origin_incref(o); 66} 67} 68returnmake_origin(commit, path); 69} 70 71 72 73static voidverify_working_tree_path(struct commit *work_tree,const char*path) 74{ 75struct commit_list *parents; 76int pos; 77 78for(parents = work_tree->parents; parents; parents = parents->next) { 79const struct object_id *commit_oid = &parents->item->object.oid; 80struct object_id blob_oid; 81unsigned mode; 82 83if(!get_tree_entry(commit_oid->hash, path, blob_oid.hash, &mode) && 84sha1_object_info(blob_oid.hash, NULL) == OBJ_BLOB) 85return; 86} 87 88 pos =cache_name_pos(path,strlen(path)); 89if(pos >=0) 90;/* path is in the index */ 91else if(-1- pos < active_nr && 92!strcmp(active_cache[-1- pos]->name, path)) 93;/* path is in the index, unmerged */ 94else 95die("no such path '%s' in HEAD", path); 96} 97 98static struct commit_list **append_parent(struct commit_list **tail,const struct object_id *oid) 99{ 100struct commit *parent; 101 102 parent =lookup_commit_reference(oid); 103if(!parent) 104die("no such commit%s",oid_to_hex(oid)); 105return&commit_list_insert(parent, tail)->next; 106} 107 108static voidappend_merge_parents(struct commit_list **tail) 109{ 110int merge_head; 111struct strbuf line = STRBUF_INIT; 112 113 merge_head =open(git_path_merge_head(), O_RDONLY); 114if(merge_head <0) { 115if(errno == ENOENT) 116return; 117die("cannot open '%s' for reading",git_path_merge_head()); 118} 119 120while(!strbuf_getwholeline_fd(&line, merge_head,'\n')) { 121struct object_id oid; 122if(line.len < GIT_SHA1_HEXSZ ||get_oid_hex(line.buf, &oid)) 123die("unknown line in '%s':%s",git_path_merge_head(), line.buf); 124 tail =append_parent(tail, &oid); 125} 126close(merge_head); 127strbuf_release(&line); 128} 129 130/* 131 * This isn't as simple as passing sb->buf and sb->len, because we 132 * want to transfer ownership of the buffer to the commit (so we 133 * must use detach). 134 */ 135static voidset_commit_buffer_from_strbuf(struct commit *c,struct strbuf *sb) 136{ 137size_t len; 138void*buf =strbuf_detach(sb, &len); 139set_commit_buffer(c, buf, len); 140} 141 142/* 143 * Prepare a dummy commit that represents the work tree (or staged) item. 144 * Note that annotating work tree item never works in the reverse. 145 */ 146static struct commit *fake_working_tree_commit(struct diff_options *opt, 147const char*path, 148const char*contents_from) 149{ 150struct commit *commit; 151struct blame_origin *origin; 152struct commit_list **parent_tail, *parent; 153struct object_id head_oid; 154struct strbuf buf = STRBUF_INIT; 155const char*ident; 156time_t now; 157int size, len; 158struct cache_entry *ce; 159unsigned mode; 160struct strbuf msg = STRBUF_INIT; 161 162read_cache(); 163time(&now); 164 commit =alloc_commit_node(); 165 commit->object.parsed =1; 166 commit->date = now; 167 parent_tail = &commit->parents; 168 169if(!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING, head_oid.hash, NULL)) 170die("no such ref: HEAD"); 171 172 parent_tail =append_parent(parent_tail, &head_oid); 173append_merge_parents(parent_tail); 174verify_working_tree_path(commit, path); 175 176 origin =make_origin(commit, path); 177 178 ident =fmt_ident("Not Committed Yet","not.committed.yet", NULL,0); 179strbuf_addstr(&msg,"tree 0000000000000000000000000000000000000000\n"); 180for(parent = commit->parents; parent; parent = parent->next) 181strbuf_addf(&msg,"parent%s\n", 182oid_to_hex(&parent->item->object.oid)); 183strbuf_addf(&msg, 184"author%s\n" 185"committer%s\n\n" 186"Version of%sfrom%s\n", 187 ident, ident, path, 188(!contents_from ? path : 189(!strcmp(contents_from,"-") ?"standard input": contents_from))); 190set_commit_buffer_from_strbuf(commit, &msg); 191 192if(!contents_from ||strcmp("-", contents_from)) { 193struct stat st; 194const char*read_from; 195char*buf_ptr; 196unsigned long buf_len; 197 198if(contents_from) { 199if(stat(contents_from, &st) <0) 200die_errno("Cannot stat '%s'", contents_from); 201 read_from = contents_from; 202} 203else{ 204if(lstat(path, &st) <0) 205die_errno("Cannot lstat '%s'", path); 206 read_from = path; 207} 208 mode =canon_mode(st.st_mode); 209 210switch(st.st_mode & S_IFMT) { 211case S_IFREG: 212if(DIFF_OPT_TST(opt, ALLOW_TEXTCONV) && 213textconv_object(read_from, mode, &null_oid,0, &buf_ptr, &buf_len)) 214strbuf_attach(&buf, buf_ptr, buf_len, buf_len +1); 215else if(strbuf_read_file(&buf, read_from, st.st_size) != st.st_size) 216die_errno("cannot open or read '%s'", read_from); 217break; 218case S_IFLNK: 219if(strbuf_readlink(&buf, read_from, st.st_size) <0) 220die_errno("cannot readlink '%s'", read_from); 221break; 222default: 223die("unsupported file type%s", read_from); 224} 225} 226else{ 227/* Reading from stdin */ 228 mode =0; 229if(strbuf_read(&buf,0,0) <0) 230die_errno("failed to read from stdin"); 231} 232convert_to_git(&the_index, path, buf.buf, buf.len, &buf,0); 233 origin->file.ptr = buf.buf; 234 origin->file.size = buf.len; 235pretend_sha1_file(buf.buf, buf.len, OBJ_BLOB, origin->blob_oid.hash); 236 237/* 238 * Read the current index, replace the path entry with 239 * origin->blob_sha1 without mucking with its mode or type 240 * bits; we are not going to write this index out -- we just 241 * want to run "diff-index --cached". 242 */ 243discard_cache(); 244read_cache(); 245 246 len =strlen(path); 247if(!mode) { 248int pos =cache_name_pos(path, len); 249if(0<= pos) 250 mode = active_cache[pos]->ce_mode; 251else 252/* Let's not bother reading from HEAD tree */ 253 mode = S_IFREG |0644; 254} 255 size =cache_entry_size(len); 256 ce =xcalloc(1, size); 257oidcpy(&ce->oid, &origin->blob_oid); 258memcpy(ce->name, path, len); 259 ce->ce_flags =create_ce_flags(0); 260 ce->ce_namelen = len; 261 ce->ce_mode =create_ce_mode(mode); 262add_cache_entry(ce, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE); 263 264cache_tree_invalidate_path(&the_index, path); 265 266return commit; 267} 268 269 270 271static intdiff_hunks(mmfile_t *file_a, mmfile_t *file_b, 272 xdl_emit_hunk_consume_func_t hunk_func,void*cb_data,int xdl_opts) 273{ 274 xpparam_t xpp = {0}; 275 xdemitconf_t xecfg = {0}; 276 xdemitcb_t ecb = {NULL}; 277 278 xpp.flags = xdl_opts; 279 xecfg.hunk_func = hunk_func; 280 ecb.priv = cb_data; 281returnxdi_diff(file_a, file_b, &xpp, &xecfg, &ecb); 282} 283 284/* 285 * Given an origin, prepare mmfile_t structure to be used by the 286 * diff machinery 287 */ 288static voidfill_origin_blob(struct diff_options *opt, 289struct blame_origin *o, mmfile_t *file,int*num_read_blob) 290{ 291if(!o->file.ptr) { 292enum object_type type; 293unsigned long file_size; 294 295(*num_read_blob)++; 296if(DIFF_OPT_TST(opt, ALLOW_TEXTCONV) && 297textconv_object(o->path, o->mode, &o->blob_oid,1, &file->ptr, &file_size)) 298; 299else 300 file->ptr =read_sha1_file(o->blob_oid.hash, &type, 301&file_size); 302 file->size = file_size; 303 304if(!file->ptr) 305die("Cannot read blob%sfor path%s", 306oid_to_hex(&o->blob_oid), 307 o->path); 308 o->file = *file; 309} 310else 311*file = o->file; 312} 313 314static voiddrop_origin_blob(struct blame_origin *o) 315{ 316if(o->file.ptr) { 317FREE_AND_NULL(o->file.ptr); 318} 319} 320 321/* 322 * Any merge of blames happens on lists of blames that arrived via 323 * different parents in a single suspect. In this case, we want to 324 * sort according to the suspect line numbers as opposed to the final 325 * image line numbers. The function body is somewhat longish because 326 * it avoids unnecessary writes. 327 */ 328 329static struct blame_entry *blame_merge(struct blame_entry *list1, 330struct blame_entry *list2) 331{ 332struct blame_entry *p1 = list1, *p2 = list2, 333**tail = &list1; 334 335if(!p1) 336return p2; 337if(!p2) 338return p1; 339 340if(p1->s_lno <= p2->s_lno) { 341do{ 342 tail = &p1->next; 343if((p1 = *tail) == NULL) { 344*tail = p2; 345return list1; 346} 347}while(p1->s_lno <= p2->s_lno); 348} 349for(;;) { 350*tail = p2; 351do{ 352 tail = &p2->next; 353if((p2 = *tail) == NULL) { 354*tail = p1; 355return list1; 356} 357}while(p1->s_lno > p2->s_lno); 358*tail = p1; 359do{ 360 tail = &p1->next; 361if((p1 = *tail) == NULL) { 362*tail = p2; 363return list1; 364} 365}while(p1->s_lno <= p2->s_lno); 366} 367} 368 369static void*get_next_blame(const void*p) 370{ 371return((struct blame_entry *)p)->next; 372} 373 374static voidset_next_blame(void*p1,void*p2) 375{ 376((struct blame_entry *)p1)->next = p2; 377} 378 379/* 380 * Final image line numbers are all different, so we don't need a 381 * three-way comparison here. 382 */ 383 384static intcompare_blame_final(const void*p1,const void*p2) 385{ 386return((struct blame_entry *)p1)->lno > ((struct blame_entry *)p2)->lno 387?1: -1; 388} 389 390static intcompare_blame_suspect(const void*p1,const void*p2) 391{ 392const struct blame_entry *s1 = p1, *s2 = p2; 393/* 394 * to allow for collating suspects, we sort according to the 395 * respective pointer value as the primary sorting criterion. 396 * The actual relation is pretty unimportant as long as it 397 * establishes a total order. Comparing as integers gives us 398 * that. 399 */ 400if(s1->suspect != s2->suspect) 401return(intptr_t)s1->suspect > (intptr_t)s2->suspect ?1: -1; 402if(s1->s_lno == s2->s_lno) 403return0; 404return s1->s_lno > s2->s_lno ?1: -1; 405} 406 407voidblame_sort_final(struct blame_scoreboard *sb) 408{ 409 sb->ent =llist_mergesort(sb->ent, get_next_blame, set_next_blame, 410 compare_blame_final); 411} 412 413static intcompare_commits_by_reverse_commit_date(const void*a, 414const void*b, 415void*c) 416{ 417return-compare_commits_by_commit_date(a, b, c); 418} 419 420/* 421 * For debugging -- origin is refcounted, and this asserts that 422 * we do not underflow. 423 */ 424static voidsanity_check_refcnt(struct blame_scoreboard *sb) 425{ 426int baa =0; 427struct blame_entry *ent; 428 429for(ent = sb->ent; ent; ent = ent->next) { 430/* Nobody should have zero or negative refcnt */ 431if(ent->suspect->refcnt <=0) { 432fprintf(stderr,"%sin%shas negative refcnt%d\n", 433 ent->suspect->path, 434oid_to_hex(&ent->suspect->commit->object.oid), 435 ent->suspect->refcnt); 436 baa =1; 437} 438} 439if(baa) 440 sb->on_sanity_fail(sb, baa); 441} 442 443/* 444 * If two blame entries that are next to each other came from 445 * contiguous lines in the same origin (i.e. <commit, path> pair), 446 * merge them together. 447 */ 448voidblame_coalesce(struct blame_scoreboard *sb) 449{ 450struct blame_entry *ent, *next; 451 452for(ent = sb->ent; ent && (next = ent->next); ent = next) { 453if(ent->suspect == next->suspect && 454 ent->s_lno + ent->num_lines == next->s_lno) { 455 ent->num_lines += next->num_lines; 456 ent->next = next->next; 457blame_origin_decref(next->suspect); 458free(next); 459 ent->score =0; 460 next = ent;/* again */ 461} 462} 463 464if(sb->debug)/* sanity */ 465sanity_check_refcnt(sb); 466} 467 468/* 469 * Merge the given sorted list of blames into a preexisting origin. 470 * If there were no previous blames to that commit, it is entered into 471 * the commit priority queue of the score board. 472 */ 473 474static voidqueue_blames(struct blame_scoreboard *sb,struct blame_origin *porigin, 475struct blame_entry *sorted) 476{ 477if(porigin->suspects) 478 porigin->suspects =blame_merge(porigin->suspects, sorted); 479else{ 480struct blame_origin *o; 481for(o = porigin->commit->util; o; o = o->next) { 482if(o->suspects) { 483 porigin->suspects = sorted; 484return; 485} 486} 487 porigin->suspects = sorted; 488prio_queue_put(&sb->commits, porigin->commit); 489} 490} 491 492/* 493 * Fill the blob_sha1 field of an origin if it hasn't, so that later 494 * call to fill_origin_blob() can use it to locate the data. blob_sha1 495 * for an origin is also used to pass the blame for the entire file to 496 * the parent to detect the case where a child's blob is identical to 497 * that of its parent's. 498 * 499 * This also fills origin->mode for corresponding tree path. 500 */ 501static intfill_blob_sha1_and_mode(struct blame_origin *origin) 502{ 503if(!is_null_oid(&origin->blob_oid)) 504return0; 505if(get_tree_entry(origin->commit->object.oid.hash, 506 origin->path, 507 origin->blob_oid.hash, &origin->mode)) 508goto error_out; 509if(sha1_object_info(origin->blob_oid.hash, NULL) != OBJ_BLOB) 510goto error_out; 511return0; 512 error_out: 513oidclr(&origin->blob_oid); 514 origin->mode = S_IFINVALID; 515return-1; 516} 517 518/* 519 * We have an origin -- check if the same path exists in the 520 * parent and return an origin structure to represent it. 521 */ 522static struct blame_origin *find_origin(struct commit *parent, 523struct blame_origin *origin) 524{ 525struct blame_origin *porigin; 526struct diff_options diff_opts; 527const char*paths[2]; 528 529/* First check any existing origins */ 530for(porigin = parent->util; porigin; porigin = porigin->next) 531if(!strcmp(porigin->path, origin->path)) { 532/* 533 * The same path between origin and its parent 534 * without renaming -- the most common case. 535 */ 536returnblame_origin_incref(porigin); 537} 538 539/* See if the origin->path is different between parent 540 * and origin first. Most of the time they are the 541 * same and diff-tree is fairly efficient about this. 542 */ 543diff_setup(&diff_opts); 544DIFF_OPT_SET(&diff_opts, RECURSIVE); 545 diff_opts.detect_rename =0; 546 diff_opts.output_format = DIFF_FORMAT_NO_OUTPUT; 547 paths[0] = origin->path; 548 paths[1] = NULL; 549 550parse_pathspec(&diff_opts.pathspec, 551 PATHSPEC_ALL_MAGIC & ~PATHSPEC_LITERAL, 552 PATHSPEC_LITERAL_PATH,"", paths); 553diff_setup_done(&diff_opts); 554 555if(is_null_oid(&origin->commit->object.oid)) 556do_diff_cache(&parent->tree->object.oid, &diff_opts); 557else 558diff_tree_oid(&parent->tree->object.oid, 559&origin->commit->tree->object.oid, 560"", &diff_opts); 561diffcore_std(&diff_opts); 562 563if(!diff_queued_diff.nr) { 564/* The path is the same as parent */ 565 porigin =get_origin(parent, origin->path); 566oidcpy(&porigin->blob_oid, &origin->blob_oid); 567 porigin->mode = origin->mode; 568}else{ 569/* 570 * Since origin->path is a pathspec, if the parent 571 * commit had it as a directory, we will see a whole 572 * bunch of deletion of files in the directory that we 573 * do not care about. 574 */ 575int i; 576struct diff_filepair *p = NULL; 577for(i =0; i < diff_queued_diff.nr; i++) { 578const char*name; 579 p = diff_queued_diff.queue[i]; 580 name = p->one->path ? p->one->path : p->two->path; 581if(!strcmp(name, origin->path)) 582break; 583} 584if(!p) 585die("internal error in blame::find_origin"); 586switch(p->status) { 587default: 588die("internal error in blame::find_origin (%c)", 589 p->status); 590case'M': 591 porigin =get_origin(parent, origin->path); 592oidcpy(&porigin->blob_oid, &p->one->oid); 593 porigin->mode = p->one->mode; 594break; 595case'A': 596case'T': 597/* Did not exist in parent, or type changed */ 598break; 599} 600} 601diff_flush(&diff_opts); 602clear_pathspec(&diff_opts.pathspec); 603return porigin; 604} 605 606/* 607 * We have an origin -- find the path that corresponds to it in its 608 * parent and return an origin structure to represent it. 609 */ 610static struct blame_origin *find_rename(struct commit *parent, 611struct blame_origin *origin) 612{ 613struct blame_origin *porigin = NULL; 614struct diff_options diff_opts; 615int i; 616 617diff_setup(&diff_opts); 618DIFF_OPT_SET(&diff_opts, RECURSIVE); 619 diff_opts.detect_rename = DIFF_DETECT_RENAME; 620 diff_opts.output_format = DIFF_FORMAT_NO_OUTPUT; 621 diff_opts.single_follow = origin->path; 622diff_setup_done(&diff_opts); 623 624if(is_null_oid(&origin->commit->object.oid)) 625do_diff_cache(&parent->tree->object.oid, &diff_opts); 626else 627diff_tree_oid(&parent->tree->object.oid, 628&origin->commit->tree->object.oid, 629"", &diff_opts); 630diffcore_std(&diff_opts); 631 632for(i =0; i < diff_queued_diff.nr; i++) { 633struct diff_filepair *p = diff_queued_diff.queue[i]; 634if((p->status =='R'|| p->status =='C') && 635!strcmp(p->two->path, origin->path)) { 636 porigin =get_origin(parent, p->one->path); 637oidcpy(&porigin->blob_oid, &p->one->oid); 638 porigin->mode = p->one->mode; 639break; 640} 641} 642diff_flush(&diff_opts); 643clear_pathspec(&diff_opts.pathspec); 644return porigin; 645} 646 647/* 648 * Append a new blame entry to a given output queue. 649 */ 650static voidadd_blame_entry(struct blame_entry ***queue, 651const struct blame_entry *src) 652{ 653struct blame_entry *e =xmalloc(sizeof(*e)); 654memcpy(e, src,sizeof(*e)); 655blame_origin_incref(e->suspect); 656 657 e->next = **queue; 658**queue = e; 659*queue = &e->next; 660} 661 662/* 663 * src typically is on-stack; we want to copy the information in it to 664 * a malloced blame_entry that gets added to the given queue. The 665 * origin of dst loses a refcnt. 666 */ 667static voiddup_entry(struct blame_entry ***queue, 668struct blame_entry *dst,struct blame_entry *src) 669{ 670blame_origin_incref(src->suspect); 671blame_origin_decref(dst->suspect); 672memcpy(dst, src,sizeof(*src)); 673 dst->next = **queue; 674**queue = dst; 675*queue = &dst->next; 676} 677 678const char*blame_nth_line(struct blame_scoreboard *sb,long lno) 679{ 680return sb->final_buf + sb->lineno[lno]; 681} 682 683/* 684 * It is known that lines between tlno to same came from parent, and e 685 * has an overlap with that range. it also is known that parent's 686 * line plno corresponds to e's line tlno. 687 * 688 * <---- e -----> 689 * <------> 690 * <------------> 691 * <------------> 692 * <------------------> 693 * 694 * Split e into potentially three parts; before this chunk, the chunk 695 * to be blamed for the parent, and after that portion. 696 */ 697static voidsplit_overlap(struct blame_entry *split, 698struct blame_entry *e, 699int tlno,int plno,int same, 700struct blame_origin *parent) 701{ 702int chunk_end_lno; 703memset(split,0,sizeof(struct blame_entry [3])); 704 705if(e->s_lno < tlno) { 706/* there is a pre-chunk part not blamed on parent */ 707 split[0].suspect =blame_origin_incref(e->suspect); 708 split[0].lno = e->lno; 709 split[0].s_lno = e->s_lno; 710 split[0].num_lines = tlno - e->s_lno; 711 split[1].lno = e->lno + tlno - e->s_lno; 712 split[1].s_lno = plno; 713} 714else{ 715 split[1].lno = e->lno; 716 split[1].s_lno = plno + (e->s_lno - tlno); 717} 718 719if(same < e->s_lno + e->num_lines) { 720/* there is a post-chunk part not blamed on parent */ 721 split[2].suspect =blame_origin_incref(e->suspect); 722 split[2].lno = e->lno + (same - e->s_lno); 723 split[2].s_lno = e->s_lno + (same - e->s_lno); 724 split[2].num_lines = e->s_lno + e->num_lines - same; 725 chunk_end_lno = split[2].lno; 726} 727else 728 chunk_end_lno = e->lno + e->num_lines; 729 split[1].num_lines = chunk_end_lno - split[1].lno; 730 731/* 732 * if it turns out there is nothing to blame the parent for, 733 * forget about the splitting. !split[1].suspect signals this. 734 */ 735if(split[1].num_lines <1) 736return; 737 split[1].suspect =blame_origin_incref(parent); 738} 739 740/* 741 * split_overlap() divided an existing blame e into up to three parts 742 * in split. Any assigned blame is moved to queue to 743 * reflect the split. 744 */ 745static voidsplit_blame(struct blame_entry ***blamed, 746struct blame_entry ***unblamed, 747struct blame_entry *split, 748struct blame_entry *e) 749{ 750if(split[0].suspect && split[2].suspect) { 751/* The first part (reuse storage for the existing entry e) */ 752dup_entry(unblamed, e, &split[0]); 753 754/* The last part -- me */ 755add_blame_entry(unblamed, &split[2]); 756 757/* ... and the middle part -- parent */ 758add_blame_entry(blamed, &split[1]); 759} 760else if(!split[0].suspect && !split[2].suspect) 761/* 762 * The parent covers the entire area; reuse storage for 763 * e and replace it with the parent. 764 */ 765dup_entry(blamed, e, &split[1]); 766else if(split[0].suspect) { 767/* me and then parent */ 768dup_entry(unblamed, e, &split[0]); 769add_blame_entry(blamed, &split[1]); 770} 771else{ 772/* parent and then me */ 773dup_entry(blamed, e, &split[1]); 774add_blame_entry(unblamed, &split[2]); 775} 776} 777 778/* 779 * After splitting the blame, the origins used by the 780 * on-stack blame_entry should lose one refcnt each. 781 */ 782static voiddecref_split(struct blame_entry *split) 783{ 784int i; 785 786for(i =0; i <3; i++) 787blame_origin_decref(split[i].suspect); 788} 789 790/* 791 * reverse_blame reverses the list given in head, appending tail. 792 * That allows us to build lists in reverse order, then reverse them 793 * afterwards. This can be faster than building the list in proper 794 * order right away. The reason is that building in proper order 795 * requires writing a link in the _previous_ element, while building 796 * in reverse order just requires placing the list head into the 797 * _current_ element. 798 */ 799 800static struct blame_entry *reverse_blame(struct blame_entry *head, 801struct blame_entry *tail) 802{ 803while(head) { 804struct blame_entry *next = head->next; 805 head->next = tail; 806 tail = head; 807 head = next; 808} 809return tail; 810} 811 812/* 813 * Process one hunk from the patch between the current suspect for 814 * blame_entry e and its parent. This first blames any unfinished 815 * entries before the chunk (which is where target and parent start 816 * differing) on the parent, and then splits blame entries at the 817 * start and at the end of the difference region. Since use of -M and 818 * -C options may lead to overlapping/duplicate source line number 819 * ranges, all we can rely on from sorting/merging is the order of the 820 * first suspect line number. 821 */ 822static voidblame_chunk(struct blame_entry ***dstq,struct blame_entry ***srcq, 823int tlno,int offset,int same, 824struct blame_origin *parent) 825{ 826struct blame_entry *e = **srcq; 827struct blame_entry *samep = NULL, *diffp = NULL; 828 829while(e && e->s_lno < tlno) { 830struct blame_entry *next = e->next; 831/* 832 * current record starts before differing portion. If 833 * it reaches into it, we need to split it up and 834 * examine the second part separately. 835 */ 836if(e->s_lno + e->num_lines > tlno) { 837/* Move second half to a new record */ 838int len = tlno - e->s_lno; 839struct blame_entry *n =xcalloc(1,sizeof(struct blame_entry)); 840 n->suspect = e->suspect; 841 n->lno = e->lno + len; 842 n->s_lno = e->s_lno + len; 843 n->num_lines = e->num_lines - len; 844 e->num_lines = len; 845 e->score =0; 846/* Push new record to diffp */ 847 n->next = diffp; 848 diffp = n; 849}else 850blame_origin_decref(e->suspect); 851/* Pass blame for everything before the differing 852 * chunk to the parent */ 853 e->suspect =blame_origin_incref(parent); 854 e->s_lno += offset; 855 e->next = samep; 856 samep = e; 857 e = next; 858} 859/* 860 * As we don't know how much of a common stretch after this 861 * diff will occur, the currently blamed parts are all that we 862 * can assign to the parent for now. 863 */ 864 865if(samep) { 866**dstq =reverse_blame(samep, **dstq); 867*dstq = &samep->next; 868} 869/* 870 * Prepend the split off portions: everything after e starts 871 * after the blameable portion. 872 */ 873 e =reverse_blame(diffp, e); 874 875/* 876 * Now retain records on the target while parts are different 877 * from the parent. 878 */ 879 samep = NULL; 880 diffp = NULL; 881while(e && e->s_lno < same) { 882struct blame_entry *next = e->next; 883 884/* 885 * If current record extends into sameness, need to split. 886 */ 887if(e->s_lno + e->num_lines > same) { 888/* 889 * Move second half to a new record to be 890 * processed by later chunks 891 */ 892int len = same - e->s_lno; 893struct blame_entry *n =xcalloc(1,sizeof(struct blame_entry)); 894 n->suspect =blame_origin_incref(e->suspect); 895 n->lno = e->lno + len; 896 n->s_lno = e->s_lno + len; 897 n->num_lines = e->num_lines - len; 898 e->num_lines = len; 899 e->score =0; 900/* Push new record to samep */ 901 n->next = samep; 902 samep = n; 903} 904 e->next = diffp; 905 diffp = e; 906 e = next; 907} 908**srcq =reverse_blame(diffp,reverse_blame(samep, e)); 909/* Move across elements that are in the unblamable portion */ 910if(diffp) 911*srcq = &diffp->next; 912} 913 914struct blame_chunk_cb_data { 915struct blame_origin *parent; 916long offset; 917struct blame_entry **dstq; 918struct blame_entry **srcq; 919}; 920 921/* diff chunks are from parent to target */ 922static intblame_chunk_cb(long start_a,long count_a, 923long start_b,long count_b,void*data) 924{ 925struct blame_chunk_cb_data *d = data; 926if(start_a - start_b != d->offset) 927die("internal error in blame::blame_chunk_cb"); 928blame_chunk(&d->dstq, &d->srcq, start_b, start_a - start_b, 929 start_b + count_b, d->parent); 930 d->offset = start_a + count_a - (start_b + count_b); 931return0; 932} 933 934/* 935 * We are looking at the origin 'target' and aiming to pass blame 936 * for the lines it is suspected to its parent. Run diff to find 937 * which lines came from parent and pass blame for them. 938 */ 939static voidpass_blame_to_parent(struct blame_scoreboard *sb, 940struct blame_origin *target, 941struct blame_origin *parent) 942{ 943 mmfile_t file_p, file_o; 944struct blame_chunk_cb_data d; 945struct blame_entry *newdest = NULL; 946 947if(!target->suspects) 948return;/* nothing remains for this target */ 949 950 d.parent = parent; 951 d.offset =0; 952 d.dstq = &newdest; d.srcq = &target->suspects; 953 954fill_origin_blob(&sb->revs->diffopt, parent, &file_p, &sb->num_read_blob); 955fill_origin_blob(&sb->revs->diffopt, target, &file_o, &sb->num_read_blob); 956 sb->num_get_patch++; 957 958if(diff_hunks(&file_p, &file_o, blame_chunk_cb, &d, sb->xdl_opts)) 959die("unable to generate diff (%s->%s)", 960oid_to_hex(&parent->commit->object.oid), 961oid_to_hex(&target->commit->object.oid)); 962/* The rest are the same as the parent */ 963blame_chunk(&d.dstq, &d.srcq, INT_MAX, d.offset, INT_MAX, parent); 964*d.dstq = NULL; 965queue_blames(sb, parent, newdest); 966 967return; 968} 969 970/* 971 * The lines in blame_entry after splitting blames many times can become 972 * very small and trivial, and at some point it becomes pointless to 973 * blame the parents. E.g. "\t\t}\n\t}\n\n" appears everywhere in any 974 * ordinary C program, and it is not worth to say it was copied from 975 * totally unrelated file in the parent. 976 * 977 * Compute how trivial the lines in the blame_entry are. 978 */ 979unsignedblame_entry_score(struct blame_scoreboard *sb,struct blame_entry *e) 980{ 981unsigned score; 982const char*cp, *ep; 983 984if(e->score) 985return e->score; 986 987 score =1; 988 cp =blame_nth_line(sb, e->lno); 989 ep =blame_nth_line(sb, e->lno + e->num_lines); 990while(cp < ep) { 991unsigned ch = *((unsigned char*)cp); 992if(isalnum(ch)) 993 score++; 994 cp++; 995} 996 e->score = score; 997return score; 998} 9991000/*1001 * best_so_far[] and this[] are both a split of an existing blame_entry1002 * that passes blame to the parent. Maintain best_so_far the best split1003 * so far, by comparing this and best_so_far and copying this into1004 * bst_so_far as needed.1005 */1006static voidcopy_split_if_better(struct blame_scoreboard *sb,1007struct blame_entry *best_so_far,1008struct blame_entry *this)1009{1010int i;10111012if(!this[1].suspect)1013return;1014if(best_so_far[1].suspect) {1015if(blame_entry_score(sb, &this[1]) <blame_entry_score(sb, &best_so_far[1]))1016return;1017}10181019for(i =0; i <3; i++)1020blame_origin_incref(this[i].suspect);1021decref_split(best_so_far);1022memcpy(best_so_far,this,sizeof(struct blame_entry [3]));1023}10241025/*1026 * We are looking at a part of the final image represented by1027 * ent (tlno and same are offset by ent->s_lno).1028 * tlno is where we are looking at in the final image.1029 * up to (but not including) same match preimage.1030 * plno is where we are looking at in the preimage.1031 *1032 * <-------------- final image ---------------------->1033 * <------ent------>1034 * ^tlno ^same1035 * <---------preimage----->1036 * ^plno1037 *1038 * All line numbers are 0-based.1039 */1040static voidhandle_split(struct blame_scoreboard *sb,1041struct blame_entry *ent,1042int tlno,int plno,int same,1043struct blame_origin *parent,1044struct blame_entry *split)1045{1046if(ent->num_lines <= tlno)1047return;1048if(tlno < same) {1049struct blame_entry this[3];1050 tlno += ent->s_lno;1051 same += ent->s_lno;1052split_overlap(this, ent, tlno, plno, same, parent);1053copy_split_if_better(sb, split,this);1054decref_split(this);1055}1056}10571058struct handle_split_cb_data {1059struct blame_scoreboard *sb;1060struct blame_entry *ent;1061struct blame_origin *parent;1062struct blame_entry *split;1063long plno;1064long tlno;1065};10661067static inthandle_split_cb(long start_a,long count_a,1068long start_b,long count_b,void*data)1069{1070struct handle_split_cb_data *d = data;1071handle_split(d->sb, d->ent, d->tlno, d->plno, start_b, d->parent,1072 d->split);1073 d->plno = start_a + count_a;1074 d->tlno = start_b + count_b;1075return0;1076}10771078/*1079 * Find the lines from parent that are the same as ent so that1080 * we can pass blames to it. file_p has the blob contents for1081 * the parent.1082 */1083static voidfind_copy_in_blob(struct blame_scoreboard *sb,1084struct blame_entry *ent,1085struct blame_origin *parent,1086struct blame_entry *split,1087 mmfile_t *file_p)1088{1089const char*cp;1090 mmfile_t file_o;1091struct handle_split_cb_data d;10921093memset(&d,0,sizeof(d));1094 d.sb = sb; d.ent = ent; d.parent = parent; d.split = split;1095/*1096 * Prepare mmfile that contains only the lines in ent.1097 */1098 cp =blame_nth_line(sb, ent->lno);1099 file_o.ptr = (char*) cp;1100 file_o.size =blame_nth_line(sb, ent->lno + ent->num_lines) - cp;11011102/*1103 * file_o is a part of final image we are annotating.1104 * file_p partially may match that image.1105 */1106memset(split,0,sizeof(struct blame_entry [3]));1107if(diff_hunks(file_p, &file_o, handle_split_cb, &d, sb->xdl_opts))1108die("unable to generate diff (%s)",1109oid_to_hex(&parent->commit->object.oid));1110/* remainder, if any, all match the preimage */1111handle_split(sb, ent, d.tlno, d.plno, ent->num_lines, parent, split);1112}11131114/* Move all blame entries from list *source that have a score smaller1115 * than score_min to the front of list *small.1116 * Returns a pointer to the link pointing to the old head of the small list.1117 */11181119static struct blame_entry **filter_small(struct blame_scoreboard *sb,1120struct blame_entry **small,1121struct blame_entry **source,1122unsigned score_min)1123{1124struct blame_entry *p = *source;1125struct blame_entry *oldsmall = *small;1126while(p) {1127if(blame_entry_score(sb, p) <= score_min) {1128*small = p;1129 small = &p->next;1130 p = *small;1131}else{1132*source = p;1133 source = &p->next;1134 p = *source;1135}1136}1137*small = oldsmall;1138*source = NULL;1139return small;1140}11411142/*1143 * See if lines currently target is suspected for can be attributed to1144 * parent.1145 */1146static voidfind_move_in_parent(struct blame_scoreboard *sb,1147struct blame_entry ***blamed,1148struct blame_entry **toosmall,1149struct blame_origin *target,1150struct blame_origin *parent)1151{1152struct blame_entry *e, split[3];1153struct blame_entry *unblamed = target->suspects;1154struct blame_entry *leftover = NULL;1155 mmfile_t file_p;11561157if(!unblamed)1158return;/* nothing remains for this target */11591160fill_origin_blob(&sb->revs->diffopt, parent, &file_p, &sb->num_read_blob);1161if(!file_p.ptr)1162return;11631164/* At each iteration, unblamed has a NULL-terminated list of1165 * entries that have not yet been tested for blame. leftover1166 * contains the reversed list of entries that have been tested1167 * without being assignable to the parent.1168 */1169do{1170struct blame_entry **unblamedtail = &unblamed;1171struct blame_entry *next;1172for(e = unblamed; e; e = next) {1173 next = e->next;1174find_copy_in_blob(sb, e, parent, split, &file_p);1175if(split[1].suspect &&1176 sb->move_score <blame_entry_score(sb, &split[1])) {1177split_blame(blamed, &unblamedtail, split, e);1178}else{1179 e->next = leftover;1180 leftover = e;1181}1182decref_split(split);1183}1184*unblamedtail = NULL;1185 toosmall =filter_small(sb, toosmall, &unblamed, sb->move_score);1186}while(unblamed);1187 target->suspects =reverse_blame(leftover, NULL);1188}11891190struct blame_list {1191struct blame_entry *ent;1192struct blame_entry split[3];1193};11941195/*1196 * Count the number of entries the target is suspected for,1197 * and prepare a list of entry and the best split.1198 */1199static struct blame_list *setup_blame_list(struct blame_entry *unblamed,1200int*num_ents_p)1201{1202struct blame_entry *e;1203int num_ents, i;1204struct blame_list *blame_list = NULL;12051206for(e = unblamed, num_ents =0; e; e = e->next)1207 num_ents++;1208if(num_ents) {1209 blame_list =xcalloc(num_ents,sizeof(struct blame_list));1210for(e = unblamed, i =0; e; e = e->next)1211 blame_list[i++].ent = e;1212}1213*num_ents_p = num_ents;1214return blame_list;1215}12161217/*1218 * For lines target is suspected for, see if we can find code movement1219 * across file boundary from the parent commit. porigin is the path1220 * in the parent we already tried.1221 */1222static voidfind_copy_in_parent(struct blame_scoreboard *sb,1223struct blame_entry ***blamed,1224struct blame_entry **toosmall,1225struct blame_origin *target,1226struct commit *parent,1227struct blame_origin *porigin,1228int opt)1229{1230struct diff_options diff_opts;1231int i, j;1232struct blame_list *blame_list;1233int num_ents;1234struct blame_entry *unblamed = target->suspects;1235struct blame_entry *leftover = NULL;12361237if(!unblamed)1238return;/* nothing remains for this target */12391240diff_setup(&diff_opts);1241DIFF_OPT_SET(&diff_opts, RECURSIVE);1242 diff_opts.output_format = DIFF_FORMAT_NO_OUTPUT;12431244diff_setup_done(&diff_opts);12451246/* Try "find copies harder" on new path if requested;1247 * we do not want to use diffcore_rename() actually to1248 * match things up; find_copies_harder is set only to1249 * force diff_tree_oid() to feed all filepairs to diff_queue,1250 * and this code needs to be after diff_setup_done(), which1251 * usually makes find-copies-harder imply copy detection.1252 */1253if((opt & PICKAXE_BLAME_COPY_HARDEST)1254|| ((opt & PICKAXE_BLAME_COPY_HARDER)1255&& (!porigin ||strcmp(target->path, porigin->path))))1256DIFF_OPT_SET(&diff_opts, FIND_COPIES_HARDER);12571258if(is_null_oid(&target->commit->object.oid))1259do_diff_cache(&parent->tree->object.oid, &diff_opts);1260else1261diff_tree_oid(&parent->tree->object.oid,1262&target->commit->tree->object.oid,1263"", &diff_opts);12641265if(!DIFF_OPT_TST(&diff_opts, FIND_COPIES_HARDER))1266diffcore_std(&diff_opts);12671268do{1269struct blame_entry **unblamedtail = &unblamed;1270 blame_list =setup_blame_list(unblamed, &num_ents);12711272for(i =0; i < diff_queued_diff.nr; i++) {1273struct diff_filepair *p = diff_queued_diff.queue[i];1274struct blame_origin *norigin;1275 mmfile_t file_p;1276struct blame_entry this[3];12771278if(!DIFF_FILE_VALID(p->one))1279continue;/* does not exist in parent */1280if(S_ISGITLINK(p->one->mode))1281continue;/* ignore git links */1282if(porigin && !strcmp(p->one->path, porigin->path))1283/* find_move already dealt with this path */1284continue;12851286 norigin =get_origin(parent, p->one->path);1287oidcpy(&norigin->blob_oid, &p->one->oid);1288 norigin->mode = p->one->mode;1289fill_origin_blob(&sb->revs->diffopt, norigin, &file_p, &sb->num_read_blob);1290if(!file_p.ptr)1291continue;12921293for(j =0; j < num_ents; j++) {1294find_copy_in_blob(sb, blame_list[j].ent,1295 norigin,this, &file_p);1296copy_split_if_better(sb, blame_list[j].split,1297this);1298decref_split(this);1299}1300blame_origin_decref(norigin);1301}13021303for(j =0; j < num_ents; j++) {1304struct blame_entry *split = blame_list[j].split;1305if(split[1].suspect &&1306 sb->copy_score <blame_entry_score(sb, &split[1])) {1307split_blame(blamed, &unblamedtail, split,1308 blame_list[j].ent);1309}else{1310 blame_list[j].ent->next = leftover;1311 leftover = blame_list[j].ent;1312}1313decref_split(split);1314}1315free(blame_list);1316*unblamedtail = NULL;1317 toosmall =filter_small(sb, toosmall, &unblamed, sb->copy_score);1318}while(unblamed);1319 target->suspects =reverse_blame(leftover, NULL);1320diff_flush(&diff_opts);1321clear_pathspec(&diff_opts.pathspec);1322}13231324/*1325 * The blobs of origin and porigin exactly match, so everything1326 * origin is suspected for can be blamed on the parent.1327 */1328static voidpass_whole_blame(struct blame_scoreboard *sb,1329struct blame_origin *origin,struct blame_origin *porigin)1330{1331struct blame_entry *e, *suspects;13321333if(!porigin->file.ptr && origin->file.ptr) {1334/* Steal its file */1335 porigin->file = origin->file;1336 origin->file.ptr = NULL;1337}1338 suspects = origin->suspects;1339 origin->suspects = NULL;1340for(e = suspects; e; e = e->next) {1341blame_origin_incref(porigin);1342blame_origin_decref(e->suspect);1343 e->suspect = porigin;1344}1345queue_blames(sb, porigin, suspects);1346}13471348/*1349 * We pass blame from the current commit to its parents. We keep saying1350 * "parent" (and "porigin"), but what we mean is to find scapegoat to1351 * exonerate ourselves.1352 */1353static struct commit_list *first_scapegoat(struct rev_info *revs,struct commit *commit,1354int reverse)1355{1356if(!reverse) {1357if(revs->first_parent_only &&1358 commit->parents &&1359 commit->parents->next) {1360free_commit_list(commit->parents->next);1361 commit->parents->next = NULL;1362}1363return commit->parents;1364}1365returnlookup_decoration(&revs->children, &commit->object);1366}13671368static intnum_scapegoats(struct rev_info *revs,struct commit *commit,int reverse)1369{1370struct commit_list *l =first_scapegoat(revs, commit, reverse);1371returncommit_list_count(l);1372}13731374/* Distribute collected unsorted blames to the respected sorted lists1375 * in the various origins.1376 */1377static voiddistribute_blame(struct blame_scoreboard *sb,struct blame_entry *blamed)1378{1379 blamed =llist_mergesort(blamed, get_next_blame, set_next_blame,1380 compare_blame_suspect);1381while(blamed)1382{1383struct blame_origin *porigin = blamed->suspect;1384struct blame_entry *suspects = NULL;1385do{1386struct blame_entry *next = blamed->next;1387 blamed->next = suspects;1388 suspects = blamed;1389 blamed = next;1390}while(blamed && blamed->suspect == porigin);1391 suspects =reverse_blame(suspects, NULL);1392queue_blames(sb, porigin, suspects);1393}1394}13951396#define MAXSG 1613971398static voidpass_blame(struct blame_scoreboard *sb,struct blame_origin *origin,int opt)1399{1400struct rev_info *revs = sb->revs;1401int i, pass, num_sg;1402struct commit *commit = origin->commit;1403struct commit_list *sg;1404struct blame_origin *sg_buf[MAXSG];1405struct blame_origin *porigin, **sg_origin = sg_buf;1406struct blame_entry *toosmall = NULL;1407struct blame_entry *blames, **blametail = &blames;14081409 num_sg =num_scapegoats(revs, commit, sb->reverse);1410if(!num_sg)1411goto finish;1412else if(num_sg <ARRAY_SIZE(sg_buf))1413memset(sg_buf,0,sizeof(sg_buf));1414else1415 sg_origin =xcalloc(num_sg,sizeof(*sg_origin));14161417/*1418 * The first pass looks for unrenamed path to optimize for1419 * common cases, then we look for renames in the second pass.1420 */1421for(pass =0; pass <2- sb->no_whole_file_rename; pass++) {1422struct blame_origin *(*find)(struct commit *,struct blame_origin *);1423 find = pass ? find_rename : find_origin;14241425for(i =0, sg =first_scapegoat(revs, commit, sb->reverse);1426 i < num_sg && sg;1427 sg = sg->next, i++) {1428struct commit *p = sg->item;1429int j, same;14301431if(sg_origin[i])1432continue;1433if(parse_commit(p))1434continue;1435 porigin =find(p, origin);1436if(!porigin)1437continue;1438if(!oidcmp(&porigin->blob_oid, &origin->blob_oid)) {1439pass_whole_blame(sb, origin, porigin);1440blame_origin_decref(porigin);1441goto finish;1442}1443for(j = same =0; j < i; j++)1444if(sg_origin[j] &&1445!oidcmp(&sg_origin[j]->blob_oid, &porigin->blob_oid)) {1446 same =1;1447break;1448}1449if(!same)1450 sg_origin[i] = porigin;1451else1452blame_origin_decref(porigin);1453}1454}14551456 sb->num_commits++;1457for(i =0, sg =first_scapegoat(revs, commit, sb->reverse);1458 i < num_sg && sg;1459 sg = sg->next, i++) {1460struct blame_origin *porigin = sg_origin[i];1461if(!porigin)1462continue;1463if(!origin->previous) {1464blame_origin_incref(porigin);1465 origin->previous = porigin;1466}1467pass_blame_to_parent(sb, origin, porigin);1468if(!origin->suspects)1469goto finish;1470}14711472/*1473 * Optionally find moves in parents' files.1474 */1475if(opt & PICKAXE_BLAME_MOVE) {1476filter_small(sb, &toosmall, &origin->suspects, sb->move_score);1477if(origin->suspects) {1478for(i =0, sg =first_scapegoat(revs, commit, sb->reverse);1479 i < num_sg && sg;1480 sg = sg->next, i++) {1481struct blame_origin *porigin = sg_origin[i];1482if(!porigin)1483continue;1484find_move_in_parent(sb, &blametail, &toosmall, origin, porigin);1485if(!origin->suspects)1486break;1487}1488}1489}14901491/*1492 * Optionally find copies from parents' files.1493 */1494if(opt & PICKAXE_BLAME_COPY) {1495if(sb->copy_score > sb->move_score)1496filter_small(sb, &toosmall, &origin->suspects, sb->copy_score);1497else if(sb->copy_score < sb->move_score) {1498 origin->suspects =blame_merge(origin->suspects, toosmall);1499 toosmall = NULL;1500filter_small(sb, &toosmall, &origin->suspects, sb->copy_score);1501}1502if(!origin->suspects)1503goto finish;15041505for(i =0, sg =first_scapegoat(revs, commit, sb->reverse);1506 i < num_sg && sg;1507 sg = sg->next, i++) {1508struct blame_origin *porigin = sg_origin[i];1509find_copy_in_parent(sb, &blametail, &toosmall,1510 origin, sg->item, porigin, opt);1511if(!origin->suspects)1512goto finish;1513}1514}15151516finish:1517*blametail = NULL;1518distribute_blame(sb, blames);1519/*1520 * prepend toosmall to origin->suspects1521 *1522 * There is no point in sorting: this ends up on a big1523 * unsorted list in the caller anyway.1524 */1525if(toosmall) {1526struct blame_entry **tail = &toosmall;1527while(*tail)1528 tail = &(*tail)->next;1529*tail = origin->suspects;1530 origin->suspects = toosmall;1531}1532for(i =0; i < num_sg; i++) {1533if(sg_origin[i]) {1534drop_origin_blob(sg_origin[i]);1535blame_origin_decref(sg_origin[i]);1536}1537}1538drop_origin_blob(origin);1539if(sg_buf != sg_origin)1540free(sg_origin);1541}15421543/*1544 * The main loop -- while we have blobs with lines whose true origin1545 * is still unknown, pick one blob, and allow its lines to pass blames1546 * to its parents. */1547voidassign_blame(struct blame_scoreboard *sb,int opt)1548{1549struct rev_info *revs = sb->revs;1550struct commit *commit =prio_queue_get(&sb->commits);15511552while(commit) {1553struct blame_entry *ent;1554struct blame_origin *suspect = commit->util;15551556/* find one suspect to break down */1557while(suspect && !suspect->suspects)1558 suspect = suspect->next;15591560if(!suspect) {1561 commit =prio_queue_get(&sb->commits);1562continue;1563}15641565assert(commit == suspect->commit);15661567/*1568 * We will use this suspect later in the loop,1569 * so hold onto it in the meantime.1570 */1571blame_origin_incref(suspect);1572parse_commit(commit);1573if(sb->reverse ||1574(!(commit->object.flags & UNINTERESTING) &&1575!(revs->max_age != -1&& commit->date < revs->max_age)))1576pass_blame(sb, suspect, opt);1577else{1578 commit->object.flags |= UNINTERESTING;1579if(commit->object.parsed)1580mark_parents_uninteresting(commit);1581}1582/* treat root commit as boundary */1583if(!commit->parents && !sb->show_root)1584 commit->object.flags |= UNINTERESTING;15851586/* Take responsibility for the remaining entries */1587 ent = suspect->suspects;1588if(ent) {1589 suspect->guilty =1;1590for(;;) {1591struct blame_entry *next = ent->next;1592if(sb->found_guilty_entry)1593 sb->found_guilty_entry(ent, sb->found_guilty_entry_data);1594if(next) {1595 ent = next;1596continue;1597}1598 ent->next = sb->ent;1599 sb->ent = suspect->suspects;1600 suspect->suspects = NULL;1601break;1602}1603}1604blame_origin_decref(suspect);16051606if(sb->debug)/* sanity */1607sanity_check_refcnt(sb);1608}1609}16101611static const char*get_next_line(const char*start,const char*end)1612{1613const char*nl =memchr(start,'\n', end - start);1614return nl ? nl +1: end;1615}16161617/*1618 * To allow quick access to the contents of nth line in the1619 * final image, prepare an index in the scoreboard.1620 */1621static intprepare_lines(struct blame_scoreboard *sb)1622{1623const char*buf = sb->final_buf;1624unsigned long len = sb->final_buf_size;1625const char*end = buf + len;1626const char*p;1627int*lineno;1628int num =0;16291630for(p = buf; p < end; p =get_next_line(p, end))1631 num++;16321633ALLOC_ARRAY(sb->lineno, num +1);1634 lineno = sb->lineno;16351636for(p = buf; p < end; p =get_next_line(p, end))1637*lineno++ = p - buf;16381639*lineno = len;16401641 sb->num_lines = num;1642return sb->num_lines;1643}16441645static struct commit *find_single_final(struct rev_info *revs,1646const char**name_p)1647{1648int i;1649struct commit *found = NULL;1650const char*name = NULL;16511652for(i =0; i < revs->pending.nr; i++) {1653struct object *obj = revs->pending.objects[i].item;1654if(obj->flags & UNINTERESTING)1655continue;1656 obj =deref_tag(obj, NULL,0);1657if(obj->type != OBJ_COMMIT)1658die("Non commit%s?", revs->pending.objects[i].name);1659if(found)1660die("More than one commit to dig from%sand%s?",1661 revs->pending.objects[i].name, name);1662 found = (struct commit *)obj;1663 name = revs->pending.objects[i].name;1664}1665if(name_p)1666*name_p =xstrdup_or_null(name);1667return found;1668}16691670static struct commit *dwim_reverse_initial(struct rev_info *revs,1671const char**name_p)1672{1673/*1674 * DWIM "git blame --reverse ONE -- PATH" as1675 * "git blame --reverse ONE..HEAD -- PATH" but only do so1676 * when it makes sense.1677 */1678struct object *obj;1679struct commit *head_commit;1680struct object_id head_oid;16811682if(revs->pending.nr !=1)1683return NULL;16841685/* Is that sole rev a committish? */1686 obj = revs->pending.objects[0].item;1687 obj =deref_tag(obj, NULL,0);1688if(obj->type != OBJ_COMMIT)1689return NULL;16901691/* Do we have HEAD? */1692if(!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING, head_oid.hash, NULL))1693return NULL;1694 head_commit =lookup_commit_reference_gently(&head_oid,1);1695if(!head_commit)1696return NULL;16971698/* Turn "ONE" into "ONE..HEAD" then */1699 obj->flags |= UNINTERESTING;1700add_pending_object(revs, &head_commit->object,"HEAD");17011702if(name_p)1703*name_p = revs->pending.objects[0].name;1704return(struct commit *)obj;1705}17061707static struct commit *find_single_initial(struct rev_info *revs,1708const char**name_p)1709{1710int i;1711struct commit *found = NULL;1712const char*name = NULL;17131714/*1715 * There must be one and only one negative commit, and it must be1716 * the boundary.1717 */1718for(i =0; i < revs->pending.nr; i++) {1719struct object *obj = revs->pending.objects[i].item;1720if(!(obj->flags & UNINTERESTING))1721continue;1722 obj =deref_tag(obj, NULL,0);1723if(obj->type != OBJ_COMMIT)1724die("Non commit%s?", revs->pending.objects[i].name);1725if(found)1726die("More than one commit to dig up from,%sand%s?",1727 revs->pending.objects[i].name, name);1728 found = (struct commit *) obj;1729 name = revs->pending.objects[i].name;1730}17311732if(!name)1733 found =dwim_reverse_initial(revs, &name);1734if(!name)1735die("No commit to dig up from?");17361737if(name_p)1738*name_p =xstrdup(name);1739return found;1740}17411742voidinit_scoreboard(struct blame_scoreboard *sb)1743{1744memset(sb,0,sizeof(struct blame_scoreboard));1745 sb->move_score = BLAME_DEFAULT_MOVE_SCORE;1746 sb->copy_score = BLAME_DEFAULT_COPY_SCORE;1747}17481749voidsetup_scoreboard(struct blame_scoreboard *sb,const char*path,struct blame_origin **orig)1750{1751const char*final_commit_name = NULL;1752struct blame_origin *o;1753struct commit *final_commit = NULL;1754enum object_type type;17551756if(sb->reverse && sb->contents_from)1757die(_("--contents and --reverse do not blend well."));17581759if(!sb->reverse) {1760 sb->final =find_single_final(sb->revs, &final_commit_name);1761 sb->commits.compare = compare_commits_by_commit_date;1762}else{1763 sb->final =find_single_initial(sb->revs, &final_commit_name);1764 sb->commits.compare = compare_commits_by_reverse_commit_date;1765}17661767if(sb->final && sb->contents_from)1768die(_("cannot use --contents with final commit object name"));17691770if(sb->reverse && sb->revs->first_parent_only)1771 sb->revs->children.name = NULL;17721773if(!sb->final) {1774/*1775 * "--not A B -- path" without anything positive;1776 * do not default to HEAD, but use the working tree1777 * or "--contents".1778 */1779setup_work_tree();1780 sb->final =fake_working_tree_commit(&sb->revs->diffopt,1781 path, sb->contents_from);1782add_pending_object(sb->revs, &(sb->final->object),":");1783}17841785if(sb->reverse && sb->revs->first_parent_only) {1786 final_commit =find_single_final(sb->revs, NULL);1787if(!final_commit)1788die(_("--reverse and --first-parent together require specified latest commit"));1789}17901791/*1792 * If we have bottom, this will mark the ancestors of the1793 * bottom commits we would reach while traversing as1794 * uninteresting.1795 */1796if(prepare_revision_walk(sb->revs))1797die(_("revision walk setup failed"));17981799if(sb->reverse && sb->revs->first_parent_only) {1800struct commit *c = final_commit;18011802 sb->revs->children.name ="children";1803while(c->parents &&1804oidcmp(&c->object.oid, &sb->final->object.oid)) {1805struct commit_list *l =xcalloc(1,sizeof(*l));18061807 l->item = c;1808if(add_decoration(&sb->revs->children,1809&c->parents->item->object, l))1810die("BUG: not unique item in first-parent chain");1811 c = c->parents->item;1812}18131814if(oidcmp(&c->object.oid, &sb->final->object.oid))1815die(_("--reverse --first-parent together require range along first-parent chain"));1816}18171818if(is_null_oid(&sb->final->object.oid)) {1819 o = sb->final->util;1820 sb->final_buf =xmemdupz(o->file.ptr, o->file.size);1821 sb->final_buf_size = o->file.size;1822}1823else{1824 o =get_origin(sb->final, path);1825if(fill_blob_sha1_and_mode(o))1826die(_("no such path%sin%s"), path, final_commit_name);18271828if(DIFF_OPT_TST(&sb->revs->diffopt, ALLOW_TEXTCONV) &&1829textconv_object(path, o->mode, &o->blob_oid,1, (char**) &sb->final_buf,1830&sb->final_buf_size))1831;1832else1833 sb->final_buf =read_sha1_file(o->blob_oid.hash, &type,1834&sb->final_buf_size);18351836if(!sb->final_buf)1837die(_("cannot read blob%sfor path%s"),1838oid_to_hex(&o->blob_oid),1839 path);1840}1841 sb->num_read_blob++;1842prepare_lines(sb);18431844if(orig)1845*orig = o;18461847free((char*)final_commit_name);1848}1849185018511852struct blame_entry *blame_entry_prepend(struct blame_entry *head,1853long start,long end,1854struct blame_origin *o)1855{1856struct blame_entry *new_head =xcalloc(1,sizeof(struct blame_entry));1857 new_head->lno = start;1858 new_head->num_lines = end - start;1859 new_head->suspect = o;1860 new_head->s_lno = start;1861 new_head->next = head;1862blame_origin_incref(o);1863return new_head;1864}