Currently, git-format-patch, along with the option --cover-letter, unconditionaly overwrites a cover letter with the same name (if present). Although this is a desired behaviour for patches which are auto-generated from Git commits log, it might not be the case for a cover letter whose the content is meticulously written manually. Particulary, this behaviour could be awkward in the following hypothetical situations: * The user can easily erase a cover letter coming from prior versions or another patch series by reusing an old command line (e.g. autocompleted from the shell history). * Assuming that the user is writing a cover letter and realizes that small changes should be made. They make the change, amend and format-patch again to regenerate patches. If it happens that they use the same command again (e.g. with --cover-letter), the cover letter being written is gone. This patch addresses this issue by asking confirmation from the user whenever a cover letter or a patch with the same name already exists. Signed-off-by: Firmin Martin <firminmartin24@xxxxxxxxx> --- builtin/log.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/builtin/log.c b/builtin/log.c index 6102893fcc..bada3db9eb 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -35,6 +35,7 @@ #include "repository.h" #include "commit-reach.h" #include "range-diff.h" +#include "prompt.h" #define MAIL_DEFAULT_WRAP 72 #define COVER_FROM_AUTO_MAX_SUBJECT_LEN 100 @@ -959,6 +960,10 @@ static int open_next_file(struct commit *commit, const char *subject, struct rev_info *rev, int quiet) { struct strbuf filename = STRBUF_INIT; + struct strbuf file_exists_prompt = STRBUF_INIT; + const char *yesno; + static int not_prompted = 1; + int res = 0; if (output_directory) { strbuf_addstr(&filename, output_directory); @@ -972,17 +977,35 @@ static int open_next_file(struct commit *commit, const char *subject, else fmt_output_subject(&filename, subject, rev); - if (!quiet) - printf("%s\n", filename.buf + outdir_offset); + if (not_prompted && !access(filename.buf, F_OK)) { + + /* + * TRANSLATORS: Make sure to include [Y] and [n] in your + * translation. The program will only accept English input + * at this point. + */ + strbuf_addf(&file_exists_prompt, _("The file '%s' already exists.\n" + "Would you overwrite this file and subsequent ones [Y/n]? "), filename.buf); + yesno = git_prompt(file_exists_prompt.buf, PROMPT_ECHO); + not_prompted = 0; + if (tolower(*yesno) == 'n') { + res = -1; + goto done; + } + } if ((rev->diffopt.file = fopen(filename.buf, "w")) == NULL) { error_errno(_("cannot open patch file %s"), filename.buf); - strbuf_release(&filename); - return -1; + res = -1; + goto done; } + if (!quiet) + printf("%s\n", filename.buf + outdir_offset); +done: strbuf_release(&filename); - return 0; + strbuf_release(&file_exists_prompt); + return res; } static void get_patch_ids(struct rev_info *rev, struct patch_ids *ids) -- 2.31.1.449.g4a44fa8106