| 576 | } |
| 577 | |
| 578 | void diff_get_merge_base(const struct rev_info *revs, struct object_id *mb) |
| 579 | { |
| 580 | int i; |
| 581 | struct commit *mb_child[2] = {0}; |
| 582 | struct commit_list *merge_bases = NULL; |
| 583 | |
| 584 | for (i = 0; i < revs->pending.nr; i++) { |
| 585 | struct object *obj = revs->pending.objects[i].item; |
| 586 | if (obj->flags) |
| 587 | die(_("--merge-base does not work with ranges")); |
| 588 | } |
| 589 | |
| 590 | /* |
| 591 | * This check must go after the for loop above because A...B |
| 592 | * ranges produce three pending commits, resulting in a |
| 593 | * misleading error message. |
| 594 | */ |
| 595 | if (revs->pending.nr < 1 || revs->pending.nr > 2) |
| 596 | BUG("unexpected revs->pending.nr: %d", revs->pending.nr); |
| 597 | |
| 598 | for (i = 0; i < revs->pending.nr; i++) |
| 599 | mb_child[i] = lookup_commit_reference(the_repository, &revs->pending.objects[i].item->oid); |
| 600 | if (revs->pending.nr == 1) { |
| 601 | struct object_id oid; |
| 602 | |
| 603 | if (repo_get_oid(the_repository, "HEAD", &oid)) |
| 604 | die(_("unable to get HEAD")); |
| 605 | |
| 606 | mb_child[1] = lookup_commit_reference(the_repository, &oid); |
| 607 | } |
| 608 | |
| 609 | if (repo_get_merge_bases(the_repository, mb_child[0], mb_child[1], &merge_bases) < 0) |
| 610 | exit(128); |
| 611 | if (!merge_bases) |
| 612 | die(_("no merge base found")); |
| 613 | if (merge_bases->next) |
| 614 | die(_("multiple merge bases found")); |
| 615 | |
| 616 | oidcpy(mb, &merge_bases->item->object.oid); |
| 617 | |
| 618 | commit_list_free(merge_bases); |
| 619 | } |
| 620 | |
| 621 | void run_diff_index(struct rev_info *revs, unsigned int option) |
| 622 | { |
no test coverage detected