22 * "git replay" builtin command
33 */
44
5- #define USE_THE_REPOSITORY_VARIABLE
65#define DISABLE_SIGN_COMPARE_WARNINGS
76
87#include "git-compat-util.h"
1615#include "object-name.h"
1716#include "parse-options.h"
1817#include "refs.h"
18+ #include "replay.h"
1919#include "revision.h"
2020#include "strmap.h"
2121#include <oidset.h>
@@ -26,13 +26,6 @@ enum ref_action_mode {
2626 REF_ACTION_PRINT ,
2727};
2828
29- static const char * short_commit_name (struct repository * repo ,
30- struct commit * commit )
31- {
32- return repo_find_unique_abbrev (repo , & commit -> object .oid ,
33- DEFAULT_ABBREV );
34- }
35-
3629static struct commit * peel_committish (struct repository * repo , const char * name )
3730{
3831 struct object * obj ;
@@ -45,59 +38,6 @@ static struct commit *peel_committish(struct repository *repo, const char *name)
4538 OBJ_COMMIT );
4639}
4740
48- static char * get_author (const char * message )
49- {
50- size_t len ;
51- const char * a ;
52-
53- a = find_commit_header (message , "author" , & len );
54- if (a )
55- return xmemdupz (a , len );
56-
57- return NULL ;
58- }
59-
60- static struct commit * create_commit (struct repository * repo ,
61- struct tree * tree ,
62- struct commit * based_on ,
63- struct commit * parent )
64- {
65- struct object_id ret ;
66- struct object * obj = NULL ;
67- struct commit_list * parents = NULL ;
68- char * author ;
69- char * sign_commit = NULL ; /* FIXME: cli users might want to sign again */
70- struct commit_extra_header * extra = NULL ;
71- struct strbuf msg = STRBUF_INIT ;
72- const char * out_enc = get_commit_output_encoding ();
73- const char * message = repo_logmsg_reencode (repo , based_on ,
74- NULL , out_enc );
75- const char * orig_message = NULL ;
76- const char * exclude_gpgsig [] = { "gpgsig" , NULL };
77-
78- commit_list_insert (parent , & parents );
79- extra = read_commit_extra_headers (based_on , exclude_gpgsig );
80- find_commit_subject (message , & orig_message );
81- strbuf_addstr (& msg , orig_message );
82- author = get_author (message );
83- reset_ident_date ();
84- if (commit_tree_extended (msg .buf , msg .len , & tree -> object .oid , parents ,
85- & ret , author , NULL , sign_commit , extra )) {
86- error (_ ("failed to write commit object" ));
87- goto out ;
88- }
89-
90- obj = parse_object (repo , & ret );
91-
92- out :
93- repo_unuse_commit_buffer (the_repository , based_on , message );
94- free_commit_extra_headers (extra );
95- free_commit_list (parents );
96- strbuf_release (& msg );
97- free (author );
98- return (struct commit * )obj ;
99- }
100-
10141struct ref_info {
10242 struct commit * onto ;
10343 struct strset positive_refs ;
@@ -246,50 +186,6 @@ static void determine_replay_mode(struct repository *repo,
246186 strset_clear (& rinfo .positive_refs );
247187}
248188
249- static struct commit * mapped_commit (kh_oid_map_t * replayed_commits ,
250- struct commit * commit ,
251- struct commit * fallback )
252- {
253- khint_t pos = kh_get_oid_map (replayed_commits , commit -> object .oid );
254- if (pos == kh_end (replayed_commits ))
255- return fallback ;
256- return kh_value (replayed_commits , pos );
257- }
258-
259- static struct commit * pick_regular_commit (struct repository * repo ,
260- struct commit * pickme ,
261- kh_oid_map_t * replayed_commits ,
262- struct commit * onto ,
263- struct merge_options * merge_opt ,
264- struct merge_result * result )
265- {
266- struct commit * base , * replayed_base ;
267- struct tree * pickme_tree , * base_tree ;
268-
269- base = pickme -> parents -> item ;
270- replayed_base = mapped_commit (replayed_commits , base , onto );
271-
272- result -> tree = repo_get_commit_tree (repo , replayed_base );
273- pickme_tree = repo_get_commit_tree (repo , pickme );
274- base_tree = repo_get_commit_tree (repo , base );
275-
276- merge_opt -> branch1 = short_commit_name (repo , replayed_base );
277- merge_opt -> branch2 = short_commit_name (repo , pickme );
278- merge_opt -> ancestor = xstrfmt ("parent of %s" , merge_opt -> branch2 );
279-
280- merge_incore_nonrecursive (merge_opt ,
281- base_tree ,
282- result -> tree ,
283- pickme_tree ,
284- result );
285-
286- free ((char * )merge_opt -> ancestor );
287- merge_opt -> ancestor = NULL ;
288- if (!result -> clean )
289- return NULL ;
290- return create_commit (repo , result -> tree , pickme , replayed_base );
291- }
292-
293189static enum ref_action_mode parse_ref_action_mode (const char * ref_action , const char * source )
294190{
295191 if (!ref_action || !strcmp (ref_action , "update" ))
@@ -495,8 +391,8 @@ int cmd_replay(int argc,
495391 if (commit -> parents -> next )
496392 die (_ ("replaying merge commits is not supported yet!" ));
497393
498- last_commit = pick_regular_commit (repo , commit , replayed_commits ,
499- onto , & merge_opt , & result );
394+ last_commit = replay_pick_regular_commit (repo , commit , replayed_commits ,
395+ onto , & merge_opt , & result );
500396 if (!last_commit )
501397 break ;
502398
0 commit comments