@@ -2431,14 +2431,8 @@ static struct commit *find_single_final(struct rev_info *revs,
24312431 return found ;
24322432}
24332433
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 )
24422436{
24432437 /*
24442438 * DWIM "git blame --reverse ONE -- PATH" as
@@ -2449,11 +2443,11 @@ static const char *dwim_reverse_initial(struct blame_scoreboard *sb)
24492443 struct commit * head_commit ;
24502444 unsigned char head_sha1 [20 ];
24512445
2452- if (sb -> revs -> pending .nr != 1 )
2446+ if (revs -> pending .nr != 1 )
24532447 return NULL ;
24542448
24552449 /* Is that sole rev a committish? */
2456- obj = sb -> revs -> pending .objects [0 ].item ;
2450+ obj = revs -> pending .objects [0 ].item ;
24572451 obj = deref_tag (obj , NULL , 0 );
24582452 if (obj -> type != OBJ_COMMIT )
24592453 return NULL ;
@@ -2467,17 +2461,19 @@ static const char *dwim_reverse_initial(struct blame_scoreboard *sb)
24672461
24682462 /* Turn "ONE" into "ONE..HEAD" then */
24692463 obj -> flags |= UNINTERESTING ;
2470- add_pending_object (sb -> revs , & head_commit -> object , "HEAD" );
2464+ add_pending_object (revs , & head_commit -> object , "HEAD" );
24712465
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 ;
24742469}
24752470
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 )
24772473{
24782474 int i ;
24792475 const char * final_commit_name = NULL ;
2480- struct rev_info * revs = sb -> revs ;
2476+ struct commit * found = NULL ;
24812477
24822478 /*
24832479 * 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)
24902486 obj = deref_tag (obj , NULL , 0 );
24912487 if (obj -> type != OBJ_COMMIT )
24922488 die ("Non commit %s?" , revs -> pending .objects [i ].name );
2493- if (sb -> final )
2489+ if (found )
24942490 die ("More than one commit to dig up from, %s and %s?" ,
24952491 revs -> pending .objects [i ].name ,
24962492 final_commit_name );
2497- sb -> final = (struct commit * ) obj ;
2493+ found = (struct commit * ) obj ;
24982494 final_commit_name = revs -> pending .objects [i ].name ;
24992495 }
25002496
25012497 if (!final_commit_name )
2502- final_commit_name = dwim_reverse_initial (sb );
2498+ found = dwim_reverse_initial (revs , & final_commit_name );
25032499 if (!final_commit_name )
25042500 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 ;
25062505}
25072506
25082507static 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)
25462545 struct blame_origin * o ;
25472546 struct blame_entry * ent = NULL ;
25482547 long dashdash_pos , lno ;
2549- char * final_commit_name = NULL ;
2548+ const char * final_commit_name = NULL ;
25502549 enum object_type type ;
25512550 struct commit * final_commit = NULL ;
25522551 struct progress_info pi = { NULL , 0 };
@@ -2755,14 +2754,15 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
27552754 sb .revs = & revs ;
27562755 sb .contents_from = contents_from ;
27572756 sb .reverse = reverse ;
2757+
27582758 if (!reverse ) {
2759- final_commit_name = prepare_final ( & sb );
2759+ sb . final = find_single_final ( & revs , & final_commit_name );
27602760 sb .commits .compare = compare_commits_by_commit_date ;
27612761 }
27622762 else if (contents_from )
27632763 die (_ ("--contents and --reverse do not blend well." ));
27642764 else {
2765- final_commit_name = prepare_initial ( & sb );
2765+ sb . final = find_single_initial ( & revs , & final_commit_name );
27662766 sb .commits .compare = compare_commits_by_reverse_commit_date ;
27672767 if (revs .first_parent_only )
27682768 revs .children .name = NULL ;
@@ -2917,10 +2917,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
29172917
29182918 if (!incremental )
29192919 setup_pager ();
2920-
2921- free (final_commit_name );
2922-
2923- if (incremental )
2920+ else
29242921 return 0 ;
29252922
29262923 blame_sort_final (& sb );
0 commit comments