>From c638cb0cdaf26beba63501646bce60b0235fe768 Mon Sep 17 00:00:00 2001 From: Viorel Bota Date: Thu, 21 Sep 2017 01:37:34 +0300 Subject: [PATCH] files: check for a changed disk file also for 'savefile' and --tempfile This fixes https://savannah.gnu.org/bugs/?51040. Signed-off-by: Viorel Bota Signed-off-by: Benno Schulenberg --- src/files.c | 44 +++++++++++++++++++++++++++++--------------- src/nano.c | 2 +- src/proto.h | 2 +- src/text.c | 2 +- 4 files changed, 32 insertions(+), 18 deletions(-) diff --git a/src/files.c b/src/files.c index e70bbfe9..b2133efe 100644 --- a/src/files.c +++ b/src/files.c @@ -2015,9 +2015,9 @@ bool write_marked_file(const char *name, FILE *f_open, bool tmp, * to disk regardless of whether the mark is on, and without prompting if * the TEMP_FILE flag is set and the current file has a name. Return 0 * on error, 1 on success, and 2 when the buffer is to be discarded. */ -int do_writeout(bool exiting) +int do_writeout(bool exiting, bool noprompt) { - int i; + int i = 0; bool result = FALSE; kind_of_writing_type method = OVERWRITE; char *given; @@ -2031,12 +2031,6 @@ int do_writeout(bool exiting) /* Display newlines in filenames as ^J. */ as_an_at = FALSE; - if (exiting && ISSET(TEMP_FILE) && openfile->filename[0] != '\0') { - if (write_file(openfile->filename, NULL, FALSE, OVERWRITE, FALSE)) - return 1; - /* If writing the file failed, go on to prompt for a new name. */ - } - given = mallocstrcpy(NULL, #ifndef NANO_TINY (openfile->mark_set && !exiting) ? "" : @@ -2071,6 +2065,11 @@ int do_writeout(bool exiting) present_path = mallocstrcpy(present_path, "./"); + /* When we should not prompt, use the existing filename. */ + if ((noprompt || (exiting && ISSET(TEMP_FILE))) && + openfile->filename[0] != '\0') + answer = mallocstrcpy(answer, openfile->filename); + else { /* If we're using restricted mode, and the filename isn't blank, * disable tab completion. */ i = do_prompt(!ISSET(RESTRICTED) || openfile->filename[0] == '\0', @@ -2085,6 +2084,7 @@ int do_writeout(bool exiting) "", "" #endif ); + } if (i < 0) { statusbar(_("Cancelled")); @@ -2214,11 +2214,27 @@ int do_writeout(bool exiting) (openfile->current_stat->st_mtime < st.st_mtime || openfile->current_stat->st_dev != st.st_dev || openfile->current_stat->st_ino != st.st_ino)) { + int response; warn_and_shortly_pause(_("File on disk has changed")); - if (do_yesno_prompt(FALSE, _("File was modified since " - "you opened it; continue saving? ")) < 1) + response = do_yesno_prompt(FALSE, _("File was modified " + "since you opened it; continue saving? ")); + + if (ISSET(TEMP_FILE)) { + if (response == 1) { + if (!write_file(openfile->filename, NULL, FALSE, + OVERWRITE, FALSE)) { + UNSET(TEMP_FILE); + napms(2400); + continue; + } + } else { + blank_statusbar(); + free(given); + return 0; + } + } else if (response < 1) continue; } #endif @@ -2248,7 +2264,7 @@ int do_writeout(bool exiting) void do_writeout_void(void) { /* If the user chose to discard the buffer, close it. */ - if (do_writeout(FALSE) == 2) + if (do_writeout(FALSE, FALSE) == 2) close_and_go(); } @@ -2256,10 +2272,8 @@ void do_writeout_void(void) /* If it has a name, write the current file to disk without prompting. */ void do_savefile(void) { - if (openfile->filename[0] != '\0') - write_file(openfile->filename, NULL, FALSE, OVERWRITE, FALSE); - else - do_writeout_void(); + if (do_writeout(FALSE, TRUE) == 2) + close_and_go(); } #endif diff --git a/src/nano.c b/src/nano.c index fec3a9a8..d977afe3 100644 --- a/src/nano.c +++ b/src/nano.c @@ -1081,7 +1081,7 @@ void do_exit(void) /* If the user chose not to save, or if the user chose to save and * the save succeeded, we're ready to exit. */ - if (i == 0 || (i == 1 && do_writeout(TRUE))) + if (i == 0 || (i == 1 && do_writeout(TRUE, FALSE))) close_and_go(); else if (i != 1) statusbar(_("Cancelled")); diff --git a/src/proto.h b/src/proto.h index 71c12d40..11cc88e0 100644 --- a/src/proto.h +++ b/src/proto.h @@ -307,7 +307,7 @@ bool write_file(const char *name, FILE *f_open, bool tmp, bool write_marked_file(const char *name, FILE *f_open, bool tmp, kind_of_writing_type method); #endif -int do_writeout(bool exiting); +int do_writeout(bool exiting, bool noprompt); void do_writeout_void(void); #ifndef NANO_TINY void do_savefile(void); diff --git a/src/text.c b/src/text.c index 1cc867d4..40cf8f6f 100644 --- a/src/text.c +++ b/src/text.c @@ -3084,7 +3084,7 @@ void do_linter(void) if (i == -1) { statusbar(_("Cancelled")); return; - } else if (i == 1 && (do_writeout(FALSE) != TRUE)) + } else if (i == 1 && (do_writeout(FALSE, TRUE) != 1)) return; } -- 2.14.1