@@ -553,6 +553,7 @@ static const char *get_oneline_for_filename(struct commit *commit,
553553
554554static FILE * realstdout = NULL ;
555555static const char * output_directory = NULL ;
556+ static int outdir_offset ;
556557
557558static int reopen_stdout (const char * oneline , int nr , int total )
558559{
@@ -579,7 +580,7 @@ static int reopen_stdout(const char *oneline, int nr, int total)
579580 strcpy (filename + len , fmt_patch_suffix );
580581 }
581582
582- fprintf (realstdout , "%s\n" , filename );
583+ fprintf (realstdout , "%s\n" , filename + outdir_offset );
583584 if (freopen (filename , "w" , stdout ) == NULL )
584585 return error ("Cannot open patch file %s" ,filename );
585586
@@ -740,6 +741,27 @@ static const char *clean_message_id(const char *msg_id)
740741 return xmemdupz (a , z - a );
741742}
742743
744+ static const char * set_outdir (const char * prefix , const char * output_directory )
745+ {
746+ if (output_directory && is_absolute_path (output_directory ))
747+ return output_directory ;
748+
749+ if (!prefix || !* prefix ) {
750+ if (output_directory )
751+ return output_directory ;
752+ /* The user did not explicitly ask for "./" */
753+ outdir_offset = 2 ;
754+ return "./" ;
755+ }
756+
757+ outdir_offset = strlen (prefix );
758+ if (!output_directory )
759+ return prefix ;
760+
761+ return xstrdup (prefix_filename (prefix , outdir_offset ,
762+ output_directory ));
763+ }
764+
743765int cmd_format_patch (int argc , const char * * argv , const char * prefix )
744766{
745767 struct commit * commit ;
@@ -917,8 +939,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
917939 if (!DIFF_OPT_TST (& rev .diffopt , TEXT ) && !no_binary_diff )
918940 DIFF_OPT_SET (& rev .diffopt , BINARY );
919941
920- if (!output_directory && ! use_stdout )
921- output_directory = prefix ;
942+ if (!use_stdout )
943+ output_directory = set_outdir ( prefix , output_directory ) ;
922944
923945 if (output_directory ) {
924946 if (use_stdout )
0 commit comments