1818 */
1919#define the_repository DO_NOT_USE_THE_REPOSITORY
2020
21- enum replay_mode {
22- REPLAY_MODE_PICK ,
23- REPLAY_MODE_REVERT ,
24- };
25-
2621static const char * short_commit_name (struct repository * repo ,
2722 struct commit * commit )
2823{
@@ -81,7 +76,7 @@ static struct commit *create_commit(struct repository *repo,
8176 struct tree * tree ,
8277 struct commit * based_on ,
8378 struct commit * parent ,
84- enum replay_mode mode )
79+ bool reverse )
8580{
8681 struct object_id ret ;
8782 struct object * obj = NULL ;
@@ -98,15 +93,13 @@ static struct commit *create_commit(struct repository *repo,
9893
9994 commit_list_insert (parent , & parents );
10095 extra = read_commit_extra_headers (based_on , exclude_gpgsig );
101- if (mode == REPLAY_MODE_REVERT ) {
96+ if (reverse ) {
10297 generate_revert_message (& msg , based_on , repo );
10398 /* For revert, use current user as author (NULL = use default) */
104- } else if ( mode == REPLAY_MODE_PICK ) {
99+ } else {
105100 find_commit_subject (message , & orig_message );
106101 strbuf_addstr (& msg , orig_message );
107102 author = get_author (message );
108- } else {
109- BUG ("unexpected replay mode %d" , mode );
110103 }
111104 reset_ident_date ();
112105 if (commit_tree_extended (msg .buf , msg .len , & tree -> object .oid , parents ,
@@ -269,7 +262,7 @@ static struct commit *pick_regular_commit(struct repository *repo,
269262 struct commit * onto ,
270263 struct merge_options * merge_opt ,
271264 struct merge_result * result ,
272- enum replay_mode mode ,
265+ bool reverse ,
273266 enum replay_empty_commit_action empty )
274267{
275268 struct commit * base , * replayed_base ;
@@ -287,7 +280,21 @@ static struct commit *pick_regular_commit(struct repository *repo,
287280 replayed_base_tree = repo_get_commit_tree (repo , replayed_base );
288281 pickme_tree = repo_get_commit_tree (repo , pickme );
289282
290- if (mode == REPLAY_MODE_PICK ) {
283+ if (reverse ) {
284+ /* Revert: swap base and pickme to reverse the diff */
285+ const char * pickme_name = short_commit_name (repo , pickme );
286+ merge_opt -> branch1 = short_commit_name (repo , replayed_base );
287+ merge_opt -> branch2 = xstrfmt ("parent of %s" , pickme_name );
288+ merge_opt -> ancestor = pickme_name ;
289+
290+ merge_incore_nonrecursive (merge_opt ,
291+ pickme_tree ,
292+ replayed_base_tree ,
293+ base_tree ,
294+ result );
295+
296+ free ((char * )merge_opt -> branch2 );
297+ } else {
291298 /* Cherry-pick: normal order */
292299 merge_opt -> branch1 = short_commit_name (repo , replayed_base );
293300 merge_opt -> branch2 = short_commit_name (repo , pickme );
@@ -303,22 +310,6 @@ static struct commit *pick_regular_commit(struct repository *repo,
303310 result );
304311
305312 free ((char * )merge_opt -> ancestor );
306- } else if (mode == REPLAY_MODE_REVERT ) {
307- /* Revert: swap base and pickme to reverse the diff */
308- const char * pickme_name = short_commit_name (repo , pickme );
309- merge_opt -> branch1 = short_commit_name (repo , replayed_base );
310- merge_opt -> branch2 = xstrfmt ("parent of %s" , pickme_name );
311- merge_opt -> ancestor = pickme_name ;
312-
313- merge_incore_nonrecursive (merge_opt ,
314- pickme_tree ,
315- replayed_base_tree ,
316- base_tree ,
317- result );
318-
319- free ((char * )merge_opt -> branch2 );
320- } else {
321- BUG ("unexpected replay mode %d" , mode );
322313 }
323314 merge_opt -> ancestor = NULL ;
324315 merge_opt -> branch2 = NULL ;
@@ -341,7 +332,7 @@ static struct commit *pick_regular_commit(struct repository *repo,
341332 }
342333 }
343334
344- return create_commit (repo , result -> tree , pickme , replayed_base , mode );
335+ return create_commit (repo , result -> tree , pickme , replayed_base , reverse );
345336}
346337
347338void replay_result_release (struct replay_result * result )
@@ -381,13 +372,13 @@ int replay_revisions(struct rev_info *revs,
381372 char * revert ;
382373 const char * ref ;
383374 struct object_id old_oid ;
384- enum replay_mode mode = REPLAY_MODE_PICK ;
375+ bool reverse ;
385376 int ret ;
386377
387378 advance = xstrdup_or_null (opts -> advance );
388379 revert = xstrdup_or_null (opts -> revert );
389- if ( revert )
390- mode = REPLAY_MODE_REVERT ;
380+ reverse = !! revert ;
381+
391382 set_up_replay_mode (revs -> repo , & revs -> cmdline , opts -> onto ,
392383 & detached_head , & advance , & revert , & onto , & update_refs );
393384
@@ -430,8 +421,8 @@ int replay_revisions(struct rev_info *revs,
430421 die (_ ("replaying merge commits is not supported yet!" ));
431422
432423 last_commit = pick_regular_commit (revs -> repo , commit , replayed_commits ,
433- mode == REPLAY_MODE_REVERT ? last_commit : onto ,
434- & merge_opt , & result , mode , opts -> empty );
424+ reverse ? last_commit : onto ,
425+ & merge_opt , & result , reverse , opts -> empty );
435426 if (!last_commit )
436427 break ;
437428
0 commit comments