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>
This commit is contained in:
Jeff Smith 2017-05-24 00:15:28 -05:00 committed by Junio C Hamano
parent 78b06e66be
commit 835c49f7d1

View file

@ -2431,14 +2431,8 @@ static struct commit *find_single_final(struct rev_info *revs,
return found;
}
static char *prepare_final(struct blame_scoreboard *sb)
{
const char *name;
sb->final = find_single_final(sb->revs, &name);
return xstrdup_or_null(name);
}
static const char *dwim_reverse_initial(struct blame_scoreboard *sb)
static struct commit *dwim_reverse_initial(struct rev_info *revs,
const char **name_p)
{
/*
* DWIM "git blame --reverse ONE -- PATH" as
@ -2449,11 +2443,11 @@ static const char *dwim_reverse_initial(struct blame_scoreboard *sb)
struct commit *head_commit;
unsigned char head_sha1[20];
if (sb->revs->pending.nr != 1)
if (revs->pending.nr != 1)
return NULL;
/* Is that sole rev a committish? */
obj = sb->revs->pending.objects[0].item;
obj = revs->pending.objects[0].item;
obj = deref_tag(obj, NULL, 0);
if (obj->type != OBJ_COMMIT)
return NULL;
@ -2467,17 +2461,19 @@ static const char *dwim_reverse_initial(struct blame_scoreboard *sb)
/* Turn "ONE" into "ONE..HEAD" then */
obj->flags |= UNINTERESTING;
add_pending_object(sb->revs, &head_commit->object, "HEAD");
add_pending_object(revs, &head_commit->object, "HEAD");
sb->final = (struct commit *)obj;
return sb->revs->pending.objects[0].name;
if (name_p)
*name_p = revs->pending.objects[0].name;
return (struct commit *)obj;
}
static char *prepare_initial(struct blame_scoreboard *sb)
static struct commit *find_single_initial(struct rev_info *revs,
const char **name_p)
{
int i;
const char *final_commit_name = NULL;
struct rev_info *revs = sb->revs;
struct commit *found = NULL;
/*
* 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)
obj = deref_tag(obj, NULL, 0);
if (obj->type != OBJ_COMMIT)
die("Non commit %s?", revs->pending.objects[i].name);
if (sb->final)
if (found)
die("More than one commit to dig up from, %s and %s?",
revs->pending.objects[i].name,
final_commit_name);
sb->final = (struct commit *) obj;
found = (struct commit *) obj;
final_commit_name = revs->pending.objects[i].name;
}
if (!final_commit_name)
final_commit_name = dwim_reverse_initial(sb);
found = dwim_reverse_initial(revs, &final_commit_name);
if (!final_commit_name)
die("No commit to dig up from?");
return xstrdup(final_commit_name);
if (name_p)
*name_p = final_commit_name;
return found;
}
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)
struct blame_origin *o;
struct blame_entry *ent = NULL;
long dashdash_pos, lno;
char *final_commit_name = NULL;
const char *final_commit_name = NULL;
enum object_type type;
struct commit *final_commit = NULL;
struct progress_info pi = { NULL, 0 };
@ -2755,14 +2754,15 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
sb.revs = &revs;
sb.contents_from = contents_from;
sb.reverse = reverse;
if (!reverse) {
final_commit_name = prepare_final(&sb);
sb.final = find_single_final(&revs, &final_commit_name);
sb.commits.compare = compare_commits_by_commit_date;
}
else if (contents_from)
die(_("--contents and --reverse do not blend well."));
else {
final_commit_name = prepare_initial(&sb);
sb.final = find_single_initial(&revs, &final_commit_name);
sb.commits.compare = compare_commits_by_reverse_commit_date;
if (revs.first_parent_only)
revs.children.name = NULL;
@ -2917,10 +2917,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
if (!incremental)
setup_pager();
free(final_commit_name);
if (incremental)
else
return 0;
blame_sort_final(&sb);