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, 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(opt->flags.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_object_file(buf.buf, buf.len, OBJ_BLOB, &origin->blob_oid); 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(opt->flags.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); 544 diff_opts.flags.recursive =1; 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); 618 diff_opts.flags.recursive =1; 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 potential[] are both a split of an existing blame_entry1002 * that passes blame to the parent. Maintain best_so_far the best split so1003 * far, by comparing potential and best_so_far and copying potential 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 *potential)1009{1010int i;10111012if(!potential[1].suspect)1013return;1014if(best_so_far[1].suspect) {1015if(blame_entry_score(sb, &potential[1]) <1016blame_entry_score(sb, &best_so_far[1]))1017return;1018}10191020for(i =0; i <3; i++)1021blame_origin_incref(potential[i].suspect);1022decref_split(best_so_far);1023memcpy(best_so_far, potential,sizeof(struct blame_entry[3]));1024}10251026/*1027 * We are looking at a part of the final image represented by1028 * ent (tlno and same are offset by ent->s_lno).1029 * tlno is where we are looking at in the final image.1030 * up to (but not including) same match preimage.1031 * plno is where we are looking at in the preimage.1032 *1033 * <-------------- final image ---------------------->1034 * <------ent------>1035 * ^tlno ^same1036 * <---------preimage----->1037 * ^plno1038 *1039 * All line numbers are 0-based.1040 */1041static voidhandle_split(struct blame_scoreboard *sb,1042struct blame_entry *ent,1043int tlno,int plno,int same,1044struct blame_origin *parent,1045struct blame_entry *split)1046{1047if(ent->num_lines <= tlno)1048return;1049if(tlno < same) {1050struct blame_entry potential[3];1051 tlno += ent->s_lno;1052 same += ent->s_lno;1053split_overlap(potential, ent, tlno, plno, same, parent);1054copy_split_if_better(sb, split, potential);1055decref_split(potential);1056}1057}10581059struct handle_split_cb_data {1060struct blame_scoreboard *sb;1061struct blame_entry *ent;1062struct blame_origin *parent;1063struct blame_entry *split;1064long plno;1065long tlno;1066};10671068static inthandle_split_cb(long start_a,long count_a,1069long start_b,long count_b,void*data)1070{1071struct handle_split_cb_data *d = data;1072handle_split(d->sb, d->ent, d->tlno, d->plno, start_b, d->parent,1073 d->split);1074 d->plno = start_a + count_a;1075 d->tlno = start_b + count_b;1076return0;1077}10781079/*1080 * Find the lines from parent that are the same as ent so that1081 * we can pass blames to it. file_p has the blob contents for1082 * the parent.1083 */1084static voidfind_copy_in_blob(struct blame_scoreboard *sb,1085struct blame_entry *ent,1086struct blame_origin *parent,1087struct blame_entry *split,1088 mmfile_t *file_p)1089{1090const char*cp;1091 mmfile_t file_o;1092struct handle_split_cb_data d;10931094memset(&d,0,sizeof(d));1095 d.sb = sb; d.ent = ent; d.parent = parent; d.split = split;1096/*1097 * Prepare mmfile that contains only the lines in ent.1098 */1099 cp =blame_nth_line(sb, ent->lno);1100 file_o.ptr = (char*) cp;1101 file_o.size =blame_nth_line(sb, ent->lno + ent->num_lines) - cp;11021103/*1104 * file_o is a part of final image we are annotating.1105 * file_p partially may match that image.1106 */1107memset(split,0,sizeof(struct blame_entry [3]));1108if(diff_hunks(file_p, &file_o, handle_split_cb, &d, sb->xdl_opts))1109die("unable to generate diff (%s)",1110oid_to_hex(&parent->commit->object.oid));1111/* remainder, if any, all match the preimage */1112handle_split(sb, ent, d.tlno, d.plno, ent->num_lines, parent, split);1113}11141115/* Move all blame entries from list *source that have a score smaller1116 * than score_min to the front of list *small.1117 * Returns a pointer to the link pointing to the old head of the small list.1118 */11191120static struct blame_entry **filter_small(struct blame_scoreboard *sb,1121struct blame_entry **small,1122struct blame_entry **source,1123unsigned score_min)1124{1125struct blame_entry *p = *source;1126struct blame_entry *oldsmall = *small;1127while(p) {1128if(blame_entry_score(sb, p) <= score_min) {1129*small = p;1130 small = &p->next;1131 p = *small;1132}else{1133*source = p;1134 source = &p->next;1135 p = *source;1136}1137}1138*small = oldsmall;1139*source = NULL;1140return small;1141}11421143/*1144 * See if lines currently target is suspected for can be attributed to1145 * parent.1146 */1147static voidfind_move_in_parent(struct blame_scoreboard *sb,1148struct blame_entry ***blamed,1149struct blame_entry **toosmall,1150struct blame_origin *target,1151struct blame_origin *parent)1152{1153struct blame_entry *e, split[3];1154struct blame_entry *unblamed = target->suspects;1155struct blame_entry *leftover = NULL;1156 mmfile_t file_p;11571158if(!unblamed)1159return;/* nothing remains for this target */11601161fill_origin_blob(&sb->revs->diffopt, parent, &file_p, &sb->num_read_blob);1162if(!file_p.ptr)1163return;11641165/* At each iteration, unblamed has a NULL-terminated list of1166 * entries that have not yet been tested for blame. leftover1167 * contains the reversed list of entries that have been tested1168 * without being assignable to the parent.1169 */1170do{1171struct blame_entry **unblamedtail = &unblamed;1172struct blame_entry *next;1173for(e = unblamed; e; e = next) {1174 next = e->next;1175find_copy_in_blob(sb, e, parent, split, &file_p);1176if(split[1].suspect &&1177 sb->move_score <blame_entry_score(sb, &split[1])) {1178split_blame(blamed, &unblamedtail, split, e);1179}else{1180 e->next = leftover;1181 leftover = e;1182}1183decref_split(split);1184}1185*unblamedtail = NULL;1186 toosmall =filter_small(sb, toosmall, &unblamed, sb->move_score);1187}while(unblamed);1188 target->suspects =reverse_blame(leftover, NULL);1189}11901191struct blame_list {1192struct blame_entry *ent;1193struct blame_entry split[3];1194};11951196/*1197 * Count the number of entries the target is suspected for,1198 * and prepare a list of entry and the best split.1199 */1200static struct blame_list *setup_blame_list(struct blame_entry *unblamed,1201int*num_ents_p)1202{1203struct blame_entry *e;1204int num_ents, i;1205struct blame_list *blame_list = NULL;12061207for(e = unblamed, num_ents =0; e; e = e->next)1208 num_ents++;1209if(num_ents) {1210 blame_list =xcalloc(num_ents,sizeof(struct blame_list));1211for(e = unblamed, i =0; e; e = e->next)1212 blame_list[i++].ent = e;1213}1214*num_ents_p = num_ents;1215return blame_list;1216}12171218/*1219 * For lines target is suspected for, see if we can find code movement1220 * across file boundary from the parent commit. porigin is the path1221 * in the parent we already tried.1222 */1223static voidfind_copy_in_parent(struct blame_scoreboard *sb,1224struct blame_entry ***blamed,1225struct blame_entry **toosmall,1226struct blame_origin *target,1227struct commit *parent,1228struct blame_origin *porigin,1229int opt)1230{1231struct diff_options diff_opts;1232int i, j;1233struct blame_list *blame_list;1234int num_ents;1235struct blame_entry *unblamed = target->suspects;1236struct blame_entry *leftover = NULL;12371238if(!unblamed)1239return;/* nothing remains for this target */12401241diff_setup(&diff_opts);1242 diff_opts.flags.recursive =1;1243 diff_opts.output_format = DIFF_FORMAT_NO_OUTPUT;12441245diff_setup_done(&diff_opts);12461247/* Try "find copies harder" on new path if requested;1248 * we do not want to use diffcore_rename() actually to1249 * match things up; find_copies_harder is set only to1250 * force diff_tree_oid() to feed all filepairs to diff_queue,1251 * and this code needs to be after diff_setup_done(), which1252 * usually makes find-copies-harder imply copy detection.1253 */1254if((opt & PICKAXE_BLAME_COPY_HARDEST)1255|| ((opt & PICKAXE_BLAME_COPY_HARDER)1256&& (!porigin ||strcmp(target->path, porigin->path))))1257 diff_opts.flags.find_copies_harder =1;12581259if(is_null_oid(&target->commit->object.oid))1260do_diff_cache(&parent->tree->object.oid, &diff_opts);1261else1262diff_tree_oid(&parent->tree->object.oid,1263&target->commit->tree->object.oid,1264"", &diff_opts);12651266if(!diff_opts.flags.find_copies_harder)1267diffcore_std(&diff_opts);12681269do{1270struct blame_entry **unblamedtail = &unblamed;1271 blame_list =setup_blame_list(unblamed, &num_ents);12721273for(i =0; i < diff_queued_diff.nr; i++) {1274struct diff_filepair *p = diff_queued_diff.queue[i];1275struct blame_origin *norigin;1276 mmfile_t file_p;1277struct blame_entry potential[3];12781279if(!DIFF_FILE_VALID(p->one))1280continue;/* does not exist in parent */1281if(S_ISGITLINK(p->one->mode))1282continue;/* ignore git links */1283if(porigin && !strcmp(p->one->path, porigin->path))1284/* find_move already dealt with this path */1285continue;12861287 norigin =get_origin(parent, p->one->path);1288oidcpy(&norigin->blob_oid, &p->one->oid);1289 norigin->mode = p->one->mode;1290fill_origin_blob(&sb->revs->diffopt, norigin, &file_p, &sb->num_read_blob);1291if(!file_p.ptr)1292continue;12931294for(j =0; j < num_ents; j++) {1295find_copy_in_blob(sb, blame_list[j].ent,1296 norigin, potential, &file_p);1297copy_split_if_better(sb, blame_list[j].split,1298 potential);1299decref_split(potential);1300}1301blame_origin_decref(norigin);1302}13031304for(j =0; j < num_ents; j++) {1305struct blame_entry *split = blame_list[j].split;1306if(split[1].suspect &&1307 sb->copy_score <blame_entry_score(sb, &split[1])) {1308split_blame(blamed, &unblamedtail, split,1309 blame_list[j].ent);1310}else{1311 blame_list[j].ent->next = leftover;1312 leftover = blame_list[j].ent;1313}1314decref_split(split);1315}1316free(blame_list);1317*unblamedtail = NULL;1318 toosmall =filter_small(sb, toosmall, &unblamed, sb->copy_score);1319}while(unblamed);1320 target->suspects =reverse_blame(leftover, NULL);1321diff_flush(&diff_opts);1322clear_pathspec(&diff_opts.pathspec);1323}13241325/*1326 * The blobs of origin and porigin exactly match, so everything1327 * origin is suspected for can be blamed on the parent.1328 */1329static voidpass_whole_blame(struct blame_scoreboard *sb,1330struct blame_origin *origin,struct blame_origin *porigin)1331{1332struct blame_entry *e, *suspects;13331334if(!porigin->file.ptr && origin->file.ptr) {1335/* Steal its file */1336 porigin->file = origin->file;1337 origin->file.ptr = NULL;1338}1339 suspects = origin->suspects;1340 origin->suspects = NULL;1341for(e = suspects; e; e = e->next) {1342blame_origin_incref(porigin);1343blame_origin_decref(e->suspect);1344 e->suspect = porigin;1345}1346queue_blames(sb, porigin, suspects);1347}13481349/*1350 * We pass blame from the current commit to its parents. We keep saying1351 * "parent" (and "porigin"), but what we mean is to find scapegoat to1352 * exonerate ourselves.1353 */1354static struct commit_list *first_scapegoat(struct rev_info *revs,struct commit *commit,1355int reverse)1356{1357if(!reverse) {1358if(revs->first_parent_only &&1359 commit->parents &&1360 commit->parents->next) {1361free_commit_list(commit->parents->next);1362 commit->parents->next = NULL;1363}1364return commit->parents;1365}1366returnlookup_decoration(&revs->children, &commit->object);1367}13681369static intnum_scapegoats(struct rev_info *revs,struct commit *commit,int reverse)1370{1371struct commit_list *l =first_scapegoat(revs, commit, reverse);1372returncommit_list_count(l);1373}13741375/* Distribute collected unsorted blames to the respected sorted lists1376 * in the various origins.1377 */1378static voiddistribute_blame(struct blame_scoreboard *sb,struct blame_entry *blamed)1379{1380 blamed =llist_mergesort(blamed, get_next_blame, set_next_blame,1381 compare_blame_suspect);1382while(blamed)1383{1384struct blame_origin *porigin = blamed->suspect;1385struct blame_entry *suspects = NULL;1386do{1387struct blame_entry *next = blamed->next;1388 blamed->next = suspects;1389 suspects = blamed;1390 blamed = next;1391}while(blamed && blamed->suspect == porigin);1392 suspects =reverse_blame(suspects, NULL);1393queue_blames(sb, porigin, suspects);1394}1395}13961397#define MAXSG 1613981399static voidpass_blame(struct blame_scoreboard *sb,struct blame_origin *origin,int opt)1400{1401struct rev_info *revs = sb->revs;1402int i, pass, num_sg;1403struct commit *commit = origin->commit;1404struct commit_list *sg;1405struct blame_origin *sg_buf[MAXSG];1406struct blame_origin *porigin, **sg_origin = sg_buf;1407struct blame_entry *toosmall = NULL;1408struct blame_entry *blames, **blametail = &blames;14091410 num_sg =num_scapegoats(revs, commit, sb->reverse);1411if(!num_sg)1412goto finish;1413else if(num_sg <ARRAY_SIZE(sg_buf))1414memset(sg_buf,0,sizeof(sg_buf));1415else1416 sg_origin =xcalloc(num_sg,sizeof(*sg_origin));14171418/*1419 * The first pass looks for unrenamed path to optimize for1420 * common cases, then we look for renames in the second pass.1421 */1422for(pass =0; pass <2- sb->no_whole_file_rename; pass++) {1423struct blame_origin *(*find)(struct commit *,struct blame_origin *);1424 find = pass ? find_rename : find_origin;14251426for(i =0, sg =first_scapegoat(revs, commit, sb->reverse);1427 i < num_sg && sg;1428 sg = sg->next, i++) {1429struct commit *p = sg->item;1430int j, same;14311432if(sg_origin[i])1433continue;1434if(parse_commit(p))1435continue;1436 porigin =find(p, origin);1437if(!porigin)1438continue;1439if(!oidcmp(&porigin->blob_oid, &origin->blob_oid)) {1440pass_whole_blame(sb, origin, porigin);1441blame_origin_decref(porigin);1442goto finish;1443}1444for(j = same =0; j < i; j++)1445if(sg_origin[j] &&1446!oidcmp(&sg_origin[j]->blob_oid, &porigin->blob_oid)) {1447 same =1;1448break;1449}1450if(!same)1451 sg_origin[i] = porigin;1452else1453blame_origin_decref(porigin);1454}1455}14561457 sb->num_commits++;1458for(i =0, sg =first_scapegoat(revs, commit, sb->reverse);1459 i < num_sg && sg;1460 sg = sg->next, i++) {1461struct blame_origin *porigin = sg_origin[i];1462if(!porigin)1463continue;1464if(!origin->previous) {1465blame_origin_incref(porigin);1466 origin->previous = porigin;1467}1468pass_blame_to_parent(sb, origin, porigin);1469if(!origin->suspects)1470goto finish;1471}14721473/*1474 * Optionally find moves in parents' files.1475 */1476if(opt & PICKAXE_BLAME_MOVE) {1477filter_small(sb, &toosmall, &origin->suspects, sb->move_score);1478if(origin->suspects) {1479for(i =0, sg =first_scapegoat(revs, commit, sb->reverse);1480 i < num_sg && sg;1481 sg = sg->next, i++) {1482struct blame_origin *porigin = sg_origin[i];1483if(!porigin)1484continue;1485find_move_in_parent(sb, &blametail, &toosmall, origin, porigin);1486if(!origin->suspects)1487break;1488}1489}1490}14911492/*1493 * Optionally find copies from parents' files.1494 */1495if(opt & PICKAXE_BLAME_COPY) {1496if(sb->copy_score > sb->move_score)1497filter_small(sb, &toosmall, &origin->suspects, sb->copy_score);1498else if(sb->copy_score < sb->move_score) {1499 origin->suspects =blame_merge(origin->suspects, toosmall);1500 toosmall = NULL;1501filter_small(sb, &toosmall, &origin->suspects, sb->copy_score);1502}1503if(!origin->suspects)1504goto finish;15051506for(i =0, sg =first_scapegoat(revs, commit, sb->reverse);1507 i < num_sg && sg;1508 sg = sg->next, i++) {1509struct blame_origin *porigin = sg_origin[i];1510find_copy_in_parent(sb, &blametail, &toosmall,1511 origin, sg->item, porigin, opt);1512if(!origin->suspects)1513goto finish;1514}1515}15161517finish:1518*blametail = NULL;1519distribute_blame(sb, blames);1520/*1521 * prepend toosmall to origin->suspects1522 *1523 * There is no point in sorting: this ends up on a big1524 * unsorted list in the caller anyway.1525 */1526if(toosmall) {1527struct blame_entry **tail = &toosmall;1528while(*tail)1529 tail = &(*tail)->next;1530*tail = origin->suspects;1531 origin->suspects = toosmall;1532}1533for(i =0; i < num_sg; i++) {1534if(sg_origin[i]) {1535drop_origin_blob(sg_origin[i]);1536blame_origin_decref(sg_origin[i]);1537}1538}1539drop_origin_blob(origin);1540if(sg_buf != sg_origin)1541free(sg_origin);1542}15431544/*1545 * The main loop -- while we have blobs with lines whose true origin1546 * is still unknown, pick one blob, and allow its lines to pass blames1547 * to its parents. */1548voidassign_blame(struct blame_scoreboard *sb,int opt)1549{1550struct rev_info *revs = sb->revs;1551struct commit *commit =prio_queue_get(&sb->commits);15521553while(commit) {1554struct blame_entry *ent;1555struct blame_origin *suspect = commit->util;15561557/* find one suspect to break down */1558while(suspect && !suspect->suspects)1559 suspect = suspect->next;15601561if(!suspect) {1562 commit =prio_queue_get(&sb->commits);1563continue;1564}15651566assert(commit == suspect->commit);15671568/*1569 * We will use this suspect later in the loop,1570 * so hold onto it in the meantime.1571 */1572blame_origin_incref(suspect);1573parse_commit(commit);1574if(sb->reverse ||1575(!(commit->object.flags & UNINTERESTING) &&1576!(revs->max_age != -1&& commit->date < revs->max_age)))1577pass_blame(sb, suspect, opt);1578else{1579 commit->object.flags |= UNINTERESTING;1580if(commit->object.parsed)1581mark_parents_uninteresting(commit);1582}1583/* treat root commit as boundary */1584if(!commit->parents && !sb->show_root)1585 commit->object.flags |= UNINTERESTING;15861587/* Take responsibility for the remaining entries */1588 ent = suspect->suspects;1589if(ent) {1590 suspect->guilty =1;1591for(;;) {1592struct blame_entry *next = ent->next;1593if(sb->found_guilty_entry)1594 sb->found_guilty_entry(ent, sb->found_guilty_entry_data);1595if(next) {1596 ent = next;1597continue;1598}1599 ent->next = sb->ent;1600 sb->ent = suspect->suspects;1601 suspect->suspects = NULL;1602break;1603}1604}1605blame_origin_decref(suspect);16061607if(sb->debug)/* sanity */1608sanity_check_refcnt(sb);1609}1610}16111612static const char*get_next_line(const char*start,const char*end)1613{1614const char*nl =memchr(start,'\n', end - start);1615return nl ? nl +1: end;1616}16171618/*1619 * To allow quick access to the contents of nth line in the1620 * final image, prepare an index in the scoreboard.1621 */1622static intprepare_lines(struct blame_scoreboard *sb)1623{1624const char*buf = sb->final_buf;1625unsigned long len = sb->final_buf_size;1626const char*end = buf + len;1627const char*p;1628int*lineno;1629int num =0;16301631for(p = buf; p < end; p =get_next_line(p, end))1632 num++;16331634ALLOC_ARRAY(sb->lineno, num +1);1635 lineno = sb->lineno;16361637for(p = buf; p < end; p =get_next_line(p, end))1638*lineno++ = p - buf;16391640*lineno = len;16411642 sb->num_lines = num;1643return sb->num_lines;1644}16451646static struct commit *find_single_final(struct rev_info *revs,1647const char**name_p)1648{1649int i;1650struct commit *found = NULL;1651const char*name = NULL;16521653for(i =0; i < revs->pending.nr; i++) {1654struct object *obj = revs->pending.objects[i].item;1655if(obj->flags & UNINTERESTING)1656continue;1657 obj =deref_tag(obj, NULL,0);1658if(obj->type != OBJ_COMMIT)1659die("Non commit%s?", revs->pending.objects[i].name);1660if(found)1661die("More than one commit to dig from%sand%s?",1662 revs->pending.objects[i].name, name);1663 found = (struct commit *)obj;1664 name = revs->pending.objects[i].name;1665}1666if(name_p)1667*name_p =xstrdup_or_null(name);1668return found;1669}16701671static struct commit *dwim_reverse_initial(struct rev_info *revs,1672const char**name_p)1673{1674/*1675 * DWIM "git blame --reverse ONE -- PATH" as1676 * "git blame --reverse ONE..HEAD -- PATH" but only do so1677 * when it makes sense.1678 */1679struct object *obj;1680struct commit *head_commit;1681struct object_id head_oid;16821683if(revs->pending.nr !=1)1684return NULL;16851686/* Is that sole rev a committish? */1687 obj = revs->pending.objects[0].item;1688 obj =deref_tag(obj, NULL,0);1689if(obj->type != OBJ_COMMIT)1690return NULL;16911692/* Do we have HEAD? */1693if(!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING, &head_oid, NULL))1694return NULL;1695 head_commit =lookup_commit_reference_gently(&head_oid,1);1696if(!head_commit)1697return NULL;16981699/* Turn "ONE" into "ONE..HEAD" then */1700 obj->flags |= UNINTERESTING;1701add_pending_object(revs, &head_commit->object,"HEAD");17021703if(name_p)1704*name_p = revs->pending.objects[0].name;1705return(struct commit *)obj;1706}17071708static struct commit *find_single_initial(struct rev_info *revs,1709const char**name_p)1710{1711int i;1712struct commit *found = NULL;1713const char*name = NULL;17141715/*1716 * There must be one and only one negative commit, and it must be1717 * the boundary.1718 */1719for(i =0; i < revs->pending.nr; i++) {1720struct object *obj = revs->pending.objects[i].item;1721if(!(obj->flags & UNINTERESTING))1722continue;1723 obj =deref_tag(obj, NULL,0);1724if(obj->type != OBJ_COMMIT)1725die("Non commit%s?", revs->pending.objects[i].name);1726if(found)1727die("More than one commit to dig up from,%sand%s?",1728 revs->pending.objects[i].name, name);1729 found = (struct commit *) obj;1730 name = revs->pending.objects[i].name;1731}17321733if(!name)1734 found =dwim_reverse_initial(revs, &name);1735if(!name)1736die("No commit to dig up from?");17371738if(name_p)1739*name_p =xstrdup(name);1740return found;1741}17421743voidinit_scoreboard(struct blame_scoreboard *sb)1744{1745memset(sb,0,sizeof(struct blame_scoreboard));1746 sb->move_score = BLAME_DEFAULT_MOVE_SCORE;1747 sb->copy_score = BLAME_DEFAULT_COPY_SCORE;1748}17491750voidsetup_scoreboard(struct blame_scoreboard *sb,const char*path,struct blame_origin **orig)1751{1752const char*final_commit_name = NULL;1753struct blame_origin *o;1754struct commit *final_commit = NULL;1755enum object_type type;17561757if(sb->reverse && sb->contents_from)1758die(_("--contents and --reverse do not blend well."));17591760if(!sb->reverse) {1761 sb->final =find_single_final(sb->revs, &final_commit_name);1762 sb->commits.compare = compare_commits_by_commit_date;1763}else{1764 sb->final =find_single_initial(sb->revs, &final_commit_name);1765 sb->commits.compare = compare_commits_by_reverse_commit_date;1766}17671768if(sb->final && sb->contents_from)1769die(_("cannot use --contents with final commit object name"));17701771if(sb->reverse && sb->revs->first_parent_only)1772 sb->revs->children.name = NULL;17731774if(!sb->final) {1775/*1776 * "--not A B -- path" without anything positive;1777 * do not default to HEAD, but use the working tree1778 * or "--contents".1779 */1780setup_work_tree();1781 sb->final =fake_working_tree_commit(&sb->revs->diffopt,1782 path, sb->contents_from);1783add_pending_object(sb->revs, &(sb->final->object),":");1784}17851786if(sb->reverse && sb->revs->first_parent_only) {1787 final_commit =find_single_final(sb->revs, NULL);1788if(!final_commit)1789die(_("--reverse and --first-parent together require specified latest commit"));1790}17911792/*1793 * If we have bottom, this will mark the ancestors of the1794 * bottom commits we would reach while traversing as1795 * uninteresting.1796 */1797if(prepare_revision_walk(sb->revs))1798die(_("revision walk setup failed"));17991800if(sb->reverse && sb->revs->first_parent_only) {1801struct commit *c = final_commit;18021803 sb->revs->children.name ="children";1804while(c->parents &&1805oidcmp(&c->object.oid, &sb->final->object.oid)) {1806struct commit_list *l =xcalloc(1,sizeof(*l));18071808 l->item = c;1809if(add_decoration(&sb->revs->children,1810&c->parents->item->object, l))1811die("BUG: not unique item in first-parent chain");1812 c = c->parents->item;1813}18141815if(oidcmp(&c->object.oid, &sb->final->object.oid))1816die(_("--reverse --first-parent together require range along first-parent chain"));1817}18181819if(is_null_oid(&sb->final->object.oid)) {1820 o = sb->final->util;1821 sb->final_buf =xmemdupz(o->file.ptr, o->file.size);1822 sb->final_buf_size = o->file.size;1823}1824else{1825 o =get_origin(sb->final, path);1826if(fill_blob_sha1_and_mode(o))1827die(_("no such path%sin%s"), path, final_commit_name);18281829if(sb->revs->diffopt.flags.allow_textconv &&1830textconv_object(path, o->mode, &o->blob_oid,1, (char**) &sb->final_buf,1831&sb->final_buf_size))1832;1833else1834 sb->final_buf =read_sha1_file(o->blob_oid.hash, &type,1835&sb->final_buf_size);18361837if(!sb->final_buf)1838die(_("cannot read blob%sfor path%s"),1839oid_to_hex(&o->blob_oid),1840 path);1841}1842 sb->num_read_blob++;1843prepare_lines(sb);18441845if(orig)1846*orig = o;18471848free((char*)final_commit_name);1849}1850185118521853struct blame_entry *blame_entry_prepend(struct blame_entry *head,1854long start,long end,1855struct blame_origin *o)1856{1857struct blame_entry *new_head =xcalloc(1,sizeof(struct blame_entry));1858 new_head->lno = start;1859 new_head->num_lines = end - start;1860 new_head->suspect = o;1861 new_head->s_lno = start;1862 new_head->next = head;1863blame_origin_incref(o);1864return new_head;1865}