blame: rework methods that determine 'final' commit

Either prepare_initial or prepare_final is used to determine which commit is marked as 'final'. Call the underlying methods directly to make this more clear. Signed-off-by: Jeff Smith <whydoubt@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff Smith committed May 24, 2017 at 00:15 UTC 835c49f7d16c5f0307e71da19618fcfe500c2430
1 file changed +23 -26
builtin/blame.c
+23 -26
@@ -2431,14 +2431,8 @@ static struct commit *find_single_final(struct rev_info *revs,
2431 return found;
2432 }
2433
2434 -static char *prepare_final(struct blame_scoreboard *sb)
2435 -{
2436 - const char *name;
2437 - sb->final = find_single_final(sb->revs, &name);
2438 - return xstrdup_or_null(name);
2439 -}
2440 -
2441 -static const char *dwim_reverse_initial(struct blame_scoreboard *sb)
2434 +static struct commit *dwim_reverse_initial(struct rev_info *revs,
2435 + const char **name_p)
2436 {
2437 /*
2438 * DWIM "git blame --reverse ONE -- PATH" as
@@ -2449,11 +2443,11 @@ static const char *dwim_reverse_initial(struct blame_scoreboard *sb)
2443 struct commit *head_commit;
2444 unsigned char head_sha1[20];
2445
2452 - if (sb->revs->pending.nr != 1)
2446 + if (revs->pending.nr != 1)
2447 return NULL;
2448
2449 /* Is that sole rev a committish? */
2456 - obj = sb->revs->pending.objects[0].item;
2450 + obj = revs->pending.objects[0].item;
2451 obj = deref_tag(obj, NULL, 0);
2452 if (obj->type != OBJ_COMMIT)
2453 return NULL;
@@ -2467,17 +2461,19 @@ static const char *dwim_reverse_initial(struct blame_scoreboard *sb)
2461
2462 /* Turn "ONE" into "ONE..HEAD" then */
2463 obj->flags |= UNINTERESTING;
2470 - add_pending_object(sb->revs, &head_commit->object, "HEAD");
2464 + add_pending_object(revs, &head_commit->object, "HEAD");
2465
2472 - sb->final = (struct commit *)obj;
2473 - return sb->revs->pending.objects[0].name;
2466 + if (name_p)
2467 + *name_p = revs->pending.objects[0].name;
2468 + return (struct commit *)obj;
2469 }
2470
2476 -static char *prepare_initial(struct blame_scoreboard *sb)
2471 +static struct commit *find_single_initial(struct rev_info *revs,
2472 + const char **name_p)
2473 {
2474 int i;
2475 const char *final_commit_name = NULL;
2480 - struct rev_info *revs = sb->revs;
2476 + struct commit *found = NULL;
2477
2478 /*
2479 * There must be one and only one negative commit, and it must be
@@ -2490,19 +2486,22 @@ static char *prepare_initial(struct blame_scoreboard *sb)
2486 obj = deref_tag(obj, NULL, 0);
2487 if (obj->type != OBJ_COMMIT)
2488 die("Non commit %s?", revs->pending.objects[i].name);
2493 - if (sb->final)
2489 + if (found)
2490 die("More than one commit to dig up from, %s and %s?",
2491 revs->pending.objects[i].name,
2492 final_commit_name);
2497 - sb->final = (struct commit *) obj;
2493 + found = (struct commit *) obj;
2494 final_commit_name = revs->pending.objects[i].name;
2495 }
2496
2497 if (!final_commit_name)
2502 - final_commit_name = dwim_reverse_initial(sb);
2498 + found = dwim_reverse_initial(revs, &final_commit_name);
2499 if (!final_commit_name)
2500 die("No commit to dig up from?");
2505 - return xstrdup(final_commit_name);
2501 +
2502 + if (name_p)
2503 + *name_p = final_commit_name;
2504 + return found;
2505 }
2506
2507 static int blame_copy_callback(const struct option *option, const char *arg, int unset)
@@ -2546,7 +2545,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
2545 struct blame_origin *o;
2546 struct blame_entry *ent = NULL;
2547 long dashdash_pos, lno;
2549 - char *final_commit_name = NULL;
2548 + const char *final_commit_name = NULL;
2549 enum object_type type;
2550 struct commit *final_commit = NULL;
2551 struct progress_info pi = { NULL, 0 };
@@ -2755,14 +2754,15 @@ parse_done:
2754 sb.revs = &revs;
2755 sb.contents_from = contents_from;
2756 sb.reverse = reverse;
2757 +
2758 if (!reverse) {
2759 - final_commit_name = prepare_final(&sb);
2759 + sb.final = find_single_final(&revs, &final_commit_name);
2760 sb.commits.compare = compare_commits_by_commit_date;
2761 }
2762 else if (contents_from)
2763 die(_("--contents and --reverse do not blend well."));
2764 else {
2765 - final_commit_name = prepare_initial(&sb);
2765 + sb.final = find_single_initial(&revs, &final_commit_name);
2766 sb.commits.compare = compare_commits_by_reverse_commit_date;
2767 if (revs.first_parent_only)
2768 revs.children.name = NULL;
@@ -2917,10 +2917,7 @@ parse_done:
2917
2918 if (!incremental)
2919 setup_pager();
2920 -
2921 - free(final_commit_name);
2922 -
2923 - if (incremental)
2920 + else
2921 return 0;
2922
2923 blame_sort_final(&sb);