@@ -1011,6 +1011,7 @@ static void am_setup(struct am_state *state, enum patch_format patch_format,
10111011
10121012 if (mkdir (state -> dir , 0777 ) < 0 && errno != EEXIST )
10131013 die_errno (_ ("failed to create directory '%s'" ), state -> dir );
1014+ delete_ref (NULL , "REBASE_HEAD" , NULL , REF_NO_DEREF );
10141015
10151016 if (split_mail (state , patch_format , paths , keep_cr ) < 0 ) {
10161017 am_destroy (state );
@@ -1110,6 +1111,7 @@ static void am_next(struct am_state *state)
11101111
11111112 oidclr (& state -> orig_commit );
11121113 unlink (am_path (state , "original-commit" ));
1114+ delete_ref (NULL , "REBASE_HEAD" , NULL , REF_NO_DEREF );
11131115
11141116 if (!get_oid ("HEAD" , & head ))
11151117 write_state_text (state , "abort-safety" , oid_to_hex (& head ));
@@ -1441,6 +1443,8 @@ static int parse_mail_rebase(struct am_state *state, const char *mail)
14411443
14421444 oidcpy (& state -> orig_commit , & commit_oid );
14431445 write_state_text (state , "original-commit" , oid_to_hex (& commit_oid ));
1446+ update_ref ("am" , "REBASE_HEAD" , & commit_oid ,
1447+ NULL , REF_NO_DEREF , UPDATE_REFS_DIE_ON_ERR );
14441448
14451449 return 0 ;
14461450}
@@ -1831,8 +1835,7 @@ static void am_run(struct am_state *state, int resume)
18311835 git_config_get_bool ("advice.amworkdir" , & advice_amworkdir );
18321836
18331837 if (advice_amworkdir )
1834- printf_ln (_ ("The copy of the patch that failed is found in: %s" ),
1835- am_path (state , "patch" ));
1838+ printf_ln (_ ("Use 'git am --show-current-patch' to see the failed patch" ));
18361839
18371840 die_user_resolve (state );
18381841 }
@@ -2121,6 +2124,34 @@ static void am_abort(struct am_state *state)
21212124 am_destroy (state );
21222125}
21232126
2127+ static int show_patch (struct am_state * state )
2128+ {
2129+ struct strbuf sb = STRBUF_INIT ;
2130+ const char * patch_path ;
2131+ int len ;
2132+
2133+ if (!is_null_oid (& state -> orig_commit )) {
2134+ const char * av [4 ] = { "show" , NULL , "--" , NULL };
2135+ char * new_oid_str ;
2136+ int ret ;
2137+
2138+ av [1 ] = new_oid_str = xstrdup (oid_to_hex (& state -> orig_commit ));
2139+ ret = run_command_v_opt (av , RUN_GIT_CMD );
2140+ free (new_oid_str );
2141+ return ret ;
2142+ }
2143+
2144+ patch_path = am_path (state , msgnum (state ));
2145+ len = strbuf_read_file (& sb , patch_path , 0 );
2146+ if (len < 0 )
2147+ die_errno (_ ("failed to read '%s'" ), patch_path );
2148+
2149+ setup_pager ();
2150+ write_in_full (1 , sb .buf , sb .len );
2151+ strbuf_release (& sb );
2152+ return 0 ;
2153+ }
2154+
21242155/**
21252156 * parse_options() callback that validates and sets opt->value to the
21262157 * PATCH_FORMAT_* enum value corresponding to `arg`.
@@ -2150,7 +2181,8 @@ enum resume_mode {
21502181 RESUME_RESOLVED ,
21512182 RESUME_SKIP ,
21522183 RESUME_ABORT ,
2153- RESUME_QUIT
2184+ RESUME_QUIT ,
2185+ RESUME_SHOW_PATCH
21542186};
21552187
21562188static int git_am_config (const char * k , const char * v , void * cb )
@@ -2172,6 +2204,7 @@ int cmd_am(int argc, const char **argv, const char *prefix)
21722204 int patch_format = PATCH_FORMAT_UNKNOWN ;
21732205 enum resume_mode resume = RESUME_FALSE ;
21742206 int in_progress ;
2207+ int ret = 0 ;
21752208
21762209 const char * const usage [] = {
21772210 N_ ("git am [<options>] [(<mbox> | <Maildir>)...]" ),
@@ -2253,6 +2286,9 @@ int cmd_am(int argc, const char **argv, const char *prefix)
22532286 OPT_CMDMODE (0 , "quit" , & resume ,
22542287 N_ ("abort the patching operation but keep HEAD where it is." ),
22552288 RESUME_QUIT ),
2289+ OPT_CMDMODE (0 , "show-current-patch" , & resume ,
2290+ N_ ("show the patch being applied." ),
2291+ RESUME_SHOW_PATCH ),
22562292 OPT_BOOL (0 , "committer-date-is-author-date" ,
22572293 & state .committer_date_is_author_date ,
22582294 N_ ("lie about committer date" )),
@@ -2367,11 +2403,14 @@ int cmd_am(int argc, const char **argv, const char *prefix)
23672403 am_rerere_clear ();
23682404 am_destroy (& state );
23692405 break ;
2406+ case RESUME_SHOW_PATCH :
2407+ ret = show_patch (& state );
2408+ break ;
23702409 default :
23712410 die ("BUG: invalid resume value" );
23722411 }
23732412
23742413 am_state_release (& state );
23752414
2376- return 0 ;
2415+ return ret ;
23772416}
0 commit comments