summaryrefslogtreecommitdiff
path: root/data/vim/patches/8.1.1231
diff options
context:
space:
mode:
Diffstat (limited to 'data/vim/patches/8.1.1231')
-rw-r--r--data/vim/patches/8.1.1231943
1 files changed, 0 insertions, 943 deletions
diff --git a/data/vim/patches/8.1.1231 b/data/vim/patches/8.1.1231
deleted file mode 100644
index d7365dffd..000000000
--- a/data/vim/patches/8.1.1231
+++ /dev/null
@@ -1,943 +0,0 @@
-To: vim_dev@googlegroups.com
-Subject: Patch 8.1.1231
-Fcc: outbox
-From: Bram Moolenaar <Bram@moolenaar.net>
-Mime-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-------------
-
-Patch 8.1.1231
-Problem: Asking about existing swap file unnecessarily.
-Solution: When it is safe, delete the swap file. Remove
- HAS_SWAP_EXISTS_ACTION, it is always defined. (closes #1237)
-Files: src/memline.c, src/globals.h, src/buffer.c, src/ex_cmds.c,
- src/fileio.c, src/main.c, src/testdir/test_swap.vim,
- runtime/doc/usr_11.txt, src/os_win32.c, src/proto/os_win32.pro,
- src/os_unix.c, src/proto/os_unix.pro
-
-
-*** ../vim-8.1.1230/src/memline.c 2019-04-28 19:46:17.030060105 +0200
---- src/memline.c 2019-04-28 22:22:42.217091959 +0200
-***************
-*** 2159,2167 ****
- {
- msg_puts(_("\n process ID: "));
- msg_outnum(char_to_long(b0.b0_pid));
-! #if defined(UNIX)
-! /* EMX kill() not working correctly, it seems */
-! if (kill((pid_t)char_to_long(b0.b0_pid), 0) == 0)
- {
- msg_puts(_(" (STILL RUNNING)"));
- # if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
---- 2159,2166 ----
- {
- msg_puts(_("\n process ID: "));
- msg_outnum(char_to_long(b0.b0_pid));
-! #if defined(UNIX) || defined(MSWIN)
-! if (mch_process_running((pid_t)char_to_long(b0.b0_pid)))
- {
- msg_puts(_(" (STILL RUNNING)"));
- # if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
-***************
-*** 2193,2198 ****
---- 2192,2248 ----
- return x;
- }
-
-+ /*
-+ * Return TRUE if the swap file looks OK and there are no changes, thus it can
-+ * be safely deleted.
-+ */
-+ static time_t
-+ swapfile_unchanged(char_u *fname)
-+ {
-+ stat_T st;
-+ int fd;
-+ struct block0 b0;
-+ int ret = TRUE;
-+ #ifdef UNIX
-+ long pid;
-+ #endif
-+
-+ // must be able to stat the swap file
-+ if (mch_stat((char *)fname, &st) == -1)
-+ return FALSE;
-+
-+ // must be able to read the first block
-+ fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0);
-+ if (fd < 0)
-+ return FALSE;
-+ if (read_eintr(fd, &b0, sizeof(b0)) != sizeof(b0))
-+ {
-+ close(fd);
-+ return FALSE;
-+ }
-+
-+ // the ID and magic number must be correct
-+ if (ml_check_b0_id(&b0) == FAIL|| b0_magic_wrong(&b0))
-+ ret = FALSE;
-+
-+ // must be unchanged
-+ if (b0.b0_dirty)
-+ ret = FALSE;
-+
-+ #if defined(UNIX) || defined(MSWIN)
-+ // process must known and not be running
-+ pid = char_to_long(b0.b0_pid);
-+ if (pid == 0L || mch_process_running((pid_t)pid))
-+ ret = FALSE;
-+ #endif
-+
-+ // TODO: Should we check if the swap file was created on the current
-+ // system? And the current user?
-+
-+ close(fd);
-+ return ret;
-+ }
-+
- static int
- recov_file_names(char_u **names, char_u *path, int prepend_dot)
- {
-***************
-*** 4757,4765 ****
- if (differ == FALSE && !(curbuf->b_flags & BF_RECOVERED)
- && vim_strchr(p_shm, SHM_ATTENTION) == NULL)
- {
-- #if defined(HAS_SWAP_EXISTS_ACTION)
- int choice = 0;
-! #endif
- #ifdef CREATE_DUMMY_FILE
- int did_use_dummy = FALSE;
-
---- 4807,4814 ----
- if (differ == FALSE && !(curbuf->b_flags & BF_RECOVERED)
- && vim_strchr(p_shm, SHM_ATTENTION) == NULL)
- {
- int choice = 0;
-! stat_T st;
- #ifdef CREATE_DUMMY_FILE
- int did_use_dummy = FALSE;
-
-***************
-*** 4779,4791 ****
- #if (defined(UNIX) || defined(VMS)) && (defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG))
- process_still_running = FALSE;
- #endif
- #if defined(FEAT_EVAL)
- /*
- * If there is an SwapExists autocommand and we can handle
- * the response, trigger it. It may return 0 to ask the
- * user anyway.
- */
-! if (swap_exists_action != SEA_NONE
- && has_autocmd(EVENT_SWAPEXISTS, buf_fname, buf))
- choice = do_swapexists(buf, fname);
-
---- 4828,4852 ----
- #if (defined(UNIX) || defined(VMS)) && (defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG))
- process_still_running = FALSE;
- #endif
-+ // It's safe to delete the swap file if all these are true:
-+ // - the edited file exists
-+ // - the swap file has no changes and looks OK
-+ if (mch_stat((char *)buf->b_fname, &st) == 0
-+ && swapfile_unchanged(fname))
-+ {
-+ choice = 4;
-+ if (p_verbose > 0)
-+ verb_msg(_("Found a swap file that is not useful, deleting it"));
-+ }
-+
- #if defined(FEAT_EVAL)
- /*
- * If there is an SwapExists autocommand and we can handle
- * the response, trigger it. It may return 0 to ask the
- * user anyway.
- */
-! if (choice == 0
-! && swap_exists_action != SEA_NONE
- && has_autocmd(EVENT_SWAPEXISTS, buf_fname, buf))
- choice = do_swapexists(buf, fname);
-
-***************
-*** 4850,4856 ****
- }
- #endif
-
-- #if defined(HAS_SWAP_EXISTS_ACTION)
- if (choice > 0)
- {
- switch (choice)
---- 4911,4916 ----
-***************
-*** 4880,4886 ****
- break;
- }
- else
-- #endif
- {
- msg_puts("\n");
- if (msg_silent == 0)
---- 4940,4945 ----
-*** ../vim-8.1.1230/src/globals.h 2019-04-28 19:46:17.026060122 +0200
---- src/globals.h 2019-04-28 22:14:01.975212661 +0200
-***************
-*** 966,972 ****
- EXTERN int emsg_noredir INIT(= 0); /* don't redirect error messages */
- EXTERN int cmd_silent INIT(= FALSE); /* don't echo the command line */
-
-- # define HAS_SWAP_EXISTS_ACTION
- EXTERN int swap_exists_action INIT(= SEA_NONE);
- /* For dialog when swap file already
- * exists. */
---- 966,971 ----
-***************
-*** 1644,1649 ****
---- 1643,1651 ----
- #endif
-
- #ifdef MSWIN
-+ # ifdef PROTO
-+ typedef int HINSTANCE;
-+ # endif
- EXTERN int ctrl_break_was_pressed INIT(= FALSE);
- EXTERN HINSTANCE g_hinst INIT(= NULL);
- #endif
-*** ../vim-8.1.1230/src/buffer.c 2019-04-28 18:04:56.054492198 +0200
---- src/buffer.c 2019-04-28 20:19:17.859717974 +0200
-***************
-*** 972,1014 ****
- int dir,
- int count)
- {
-- #if defined(HAS_SWAP_EXISTS_ACTION)
- bufref_T old_curbuf;
-
- set_bufref(&old_curbuf, curbuf);
-
- swap_exists_action = SEA_DIALOG;
-- #endif
- (void)do_buffer(*eap->cmd == 's' ? DOBUF_SPLIT : DOBUF_GOTO,
- start, dir, count, eap->forceit);
-- #if defined(HAS_SWAP_EXISTS_ACTION)
- if (swap_exists_action == SEA_QUIT && *eap->cmd == 's')
- {
-! # if defined(FEAT_EVAL)
- cleanup_T cs;
-
- /* Reset the error/interrupt/exception state here so that
- * aborting() returns FALSE when closing a window. */
- enter_cleanup(&cs);
-! # endif
-
- /* Quitting means closing the split window, nothing else. */
- win_close(curwin, TRUE);
- swap_exists_action = SEA_NONE;
- swap_exists_did_quit = TRUE;
-
-! # if defined(FEAT_EVAL)
- /* Restore the error/interrupt/exception state if not discarded by a
- * new aborting error, interrupt, or uncaught exception. */
- leave_cleanup(&cs);
-! # endif
- }
- else
- handle_swap_exists(&old_curbuf);
-- #endif
- }
-
-- #if defined(HAS_SWAP_EXISTS_ACTION) || defined(PROTO)
- /*
- * Handle the situation of swap_exists_action being set.
- * It is allowed for "old_curbuf" to be NULL or invalid.
---- 972,1009 ----
- int dir,
- int count)
- {
- bufref_T old_curbuf;
-
- set_bufref(&old_curbuf, curbuf);
-
- swap_exists_action = SEA_DIALOG;
- (void)do_buffer(*eap->cmd == 's' ? DOBUF_SPLIT : DOBUF_GOTO,
- start, dir, count, eap->forceit);
- if (swap_exists_action == SEA_QUIT && *eap->cmd == 's')
- {
-! #if defined(FEAT_EVAL)
- cleanup_T cs;
-
- /* Reset the error/interrupt/exception state here so that
- * aborting() returns FALSE when closing a window. */
- enter_cleanup(&cs);
-! #endif
-
- /* Quitting means closing the split window, nothing else. */
- win_close(curwin, TRUE);
- swap_exists_action = SEA_NONE;
- swap_exists_did_quit = TRUE;
-
-! #if defined(FEAT_EVAL)
- /* Restore the error/interrupt/exception state if not discarded by a
- * new aborting error, interrupt, or uncaught exception. */
- leave_cleanup(&cs);
-! #endif
- }
- else
- handle_swap_exists(&old_curbuf);
- }
-
- /*
- * Handle the situation of swap_exists_action being set.
- * It is allowed for "old_curbuf" to be NULL or invalid.
-***************
-*** 1016,1036 ****
- void
- handle_swap_exists(bufref_T *old_curbuf)
- {
-! # if defined(FEAT_EVAL)
- cleanup_T cs;
-! # endif
-! # ifdef FEAT_SYN_HL
- long old_tw = curbuf->b_p_tw;
-! # endif
- buf_T *buf;
-
- if (swap_exists_action == SEA_QUIT)
- {
-! # if defined(FEAT_EVAL)
- /* Reset the error/interrupt/exception state here so that
- * aborting() returns FALSE when closing a buffer. */
- enter_cleanup(&cs);
-! # endif
-
- /* User selected Quit at ATTENTION prompt. Go back to previous
- * buffer. If that buffer is gone or the same as the current one,
---- 1011,1031 ----
- void
- handle_swap_exists(bufref_T *old_curbuf)
- {
-! #if defined(FEAT_EVAL)
- cleanup_T cs;
-! #endif
-! #ifdef FEAT_SYN_HL
- long old_tw = curbuf->b_p_tw;
-! #endif
- buf_T *buf;
-
- if (swap_exists_action == SEA_QUIT)
- {
-! #if defined(FEAT_EVAL)
- /* Reset the error/interrupt/exception state here so that
- * aborting() returns FALSE when closing a buffer. */
- enter_cleanup(&cs);
-! #endif
-
- /* User selected Quit at ATTENTION prompt. Go back to previous
- * buffer. If that buffer is gone or the same as the current one,
-***************
-*** 1053,1078 ****
- // restore msg_silent, so that the command line will be shown
- msg_silent = old_msg_silent;
-
-! # ifdef FEAT_SYN_HL
- if (old_tw != curbuf->b_p_tw)
- check_colorcolumn(curwin);
-! # endif
- }
- /* If "old_curbuf" is NULL we are in big trouble here... */
-
-! # if defined(FEAT_EVAL)
- /* Restore the error/interrupt/exception state if not discarded by a
- * new aborting error, interrupt, or uncaught exception. */
- leave_cleanup(&cs);
-! # endif
- }
- else if (swap_exists_action == SEA_RECOVER)
- {
-! # if defined(FEAT_EVAL)
- /* Reset the error/interrupt/exception state here so that
- * aborting() returns FALSE when closing a buffer. */
- enter_cleanup(&cs);
-! # endif
-
- /* User selected Recover at ATTENTION prompt. */
- msg_scroll = TRUE;
---- 1048,1073 ----
- // restore msg_silent, so that the command line will be shown
- msg_silent = old_msg_silent;
-
-! #ifdef FEAT_SYN_HL
- if (old_tw != curbuf->b_p_tw)
- check_colorcolumn(curwin);
-! #endif
- }
- /* If "old_curbuf" is NULL we are in big trouble here... */
-
-! #if defined(FEAT_EVAL)
- /* Restore the error/interrupt/exception state if not discarded by a
- * new aborting error, interrupt, or uncaught exception. */
- leave_cleanup(&cs);
-! #endif
- }
- else if (swap_exists_action == SEA_RECOVER)
- {
-! #if defined(FEAT_EVAL)
- /* Reset the error/interrupt/exception state here so that
- * aborting() returns FALSE when closing a buffer. */
- enter_cleanup(&cs);
-! #endif
-
- /* User selected Recover at ATTENTION prompt. */
- msg_scroll = TRUE;
-***************
-*** 1081,1095 ****
- cmdline_row = msg_row;
- do_modelines(0);
-
-! # if defined(FEAT_EVAL)
- /* Restore the error/interrupt/exception state if not discarded by a
- * new aborting error, interrupt, or uncaught exception. */
- leave_cleanup(&cs);
-! # endif
- }
- swap_exists_action = SEA_NONE;
- }
-- #endif
-
- /*
- * do_bufdel() - delete or unload buffer(s)
---- 1076,1089 ----
- cmdline_row = msg_row;
- do_modelines(0);
-
-! #if defined(FEAT_EVAL)
- /* Restore the error/interrupt/exception state if not discarded by a
- * new aborting error, interrupt, or uncaught exception. */
- leave_cleanup(&cs);
-! #endif
- }
- swap_exists_action = SEA_NONE;
- }
-
- /*
- * do_bufdel() - delete or unload buffer(s)
-***************
-*** 5259,5286 ****
- continue;
-
- /* Open the buffer in this window. */
-- #if defined(HAS_SWAP_EXISTS_ACTION)
- swap_exists_action = SEA_DIALOG;
-- #endif
- set_curbuf(buf, DOBUF_GOTO);
- if (!bufref_valid(&bufref))
- {
- /* autocommands deleted the buffer!!! */
-- #if defined(HAS_SWAP_EXISTS_ACTION)
- swap_exists_action = SEA_NONE;
-- #endif
- break;
- }
-- #if defined(HAS_SWAP_EXISTS_ACTION)
- if (swap_exists_action == SEA_QUIT)
- {
-! # if defined(FEAT_EVAL)
- cleanup_T cs;
-
- /* Reset the error/interrupt/exception state here so that
- * aborting() returns FALSE when closing a window. */
- enter_cleanup(&cs);
-! # endif
-
- /* User selected Quit at ATTENTION prompt; close this window. */
- win_close(curwin, TRUE);
---- 5253,5275 ----
- continue;
-
- /* Open the buffer in this window. */
- swap_exists_action = SEA_DIALOG;
- set_curbuf(buf, DOBUF_GOTO);
- if (!bufref_valid(&bufref))
- {
- /* autocommands deleted the buffer!!! */
- swap_exists_action = SEA_NONE;
- break;
- }
- if (swap_exists_action == SEA_QUIT)
- {
-! #if defined(FEAT_EVAL)
- cleanup_T cs;
-
- /* Reset the error/interrupt/exception state here so that
- * aborting() returns FALSE when closing a window. */
- enter_cleanup(&cs);
-! #endif
-
- /* User selected Quit at ATTENTION prompt; close this window. */
- win_close(curwin, TRUE);
-***************
-*** 5288,5303 ****
- swap_exists_action = SEA_NONE;
- swap_exists_did_quit = TRUE;
-
-! # if defined(FEAT_EVAL)
- /* Restore the error/interrupt/exception state if not
- * discarded by a new aborting error, interrupt, or uncaught
- * exception. */
- leave_cleanup(&cs);
-! # endif
- }
- else
- handle_swap_exists(NULL);
-- #endif
- }
-
- ui_breakcheck();
---- 5277,5291 ----
- swap_exists_action = SEA_NONE;
- swap_exists_did_quit = TRUE;
-
-! #if defined(FEAT_EVAL)
- /* Restore the error/interrupt/exception state if not
- * discarded by a new aborting error, interrupt, or uncaught
- * exception. */
- leave_cleanup(&cs);
-! #endif
- }
- else
- handle_swap_exists(NULL);
- }
-
- ui_breakcheck();
-*** ../vim-8.1.1230/src/ex_cmds.c 2019-04-28 19:46:17.022060143 +0200
---- src/ex_cmds.c 2019-04-28 20:19:31.859649114 +0200
-***************
-*** 4258,4266 ****
- topline = curwin->w_topline;
- if (!oldbuf) /* need to read the file */
- {
-- #if defined(HAS_SWAP_EXISTS_ACTION)
- swap_exists_action = SEA_DIALOG;
-- #endif
- curbuf->b_flags |= BF_CHECK_RO; /* set/reset 'ro' flag */
-
- /*
---- 4258,4264 ----
-***************
-*** 4273,4283 ****
- (void)open_buffer(FALSE, eap, readfile_flags);
- #endif
-
-- #if defined(HAS_SWAP_EXISTS_ACTION)
- if (swap_exists_action == SEA_QUIT)
- retval = FAIL;
- handle_swap_exists(&old_curbuf);
-- #endif
- }
- else
- {
---- 4271,4279 ----
-*** ../vim-8.1.1230/src/fileio.c 2019-04-28 19:46:17.026060122 +0200
---- src/fileio.c 2019-04-28 20:19:41.807600177 +0200
-***************
-*** 684,698 ****
- #endif
- }
-
-! #if defined(HAS_SWAP_EXISTS_ACTION)
-! /* If "Quit" selected at ATTENTION dialog, don't load the file */
- if (swap_exists_action == SEA_QUIT)
- {
- if (!read_buffer && !read_stdin)
- close(fd);
- return FAIL;
- }
-- #endif
-
- ++no_wait_return; /* don't wait for return yet */
-
---- 684,696 ----
- #endif
- }
-
-! // If "Quit" selected at ATTENTION dialog, don't load the file
- if (swap_exists_action == SEA_QUIT)
- {
- if (!read_buffer && !read_stdin)
- close(fd);
- return FAIL;
- }
-
- ++no_wait_return; /* don't wait for return yet */
-
-*** ../vim-8.1.1230/src/main.c 2019-04-28 19:46:17.030060105 +0200
---- src/main.c 2019-04-28 20:21:01.743207196 +0200
-***************
-*** 50,58 ****
- static void exe_commands(mparm_T *parmp);
- static void source_startup_scripts(mparm_T *parmp);
- static void main_start_gui(void);
-- # if defined(HAS_SWAP_EXISTS_ACTION)
- static void check_swap_exists_action(void);
-- # endif
- # ifdef FEAT_EVAL
- static void set_progpath(char_u *argv0);
- # endif
---- 50,56 ----
-***************
-*** 784,802 ****
- */
- if (params.tagname != NULL)
- {
-- #if defined(HAS_SWAP_EXISTS_ACTION)
- swap_exists_did_quit = FALSE;
-- #endif
-
- vim_snprintf((char *)IObuff, IOSIZE, "ta %s", params.tagname);
- do_cmdline_cmd(IObuff);
- TIME_MSG("jumping to tag");
-
-- #if defined(HAS_SWAP_EXISTS_ACTION)
- /* If the user doesn't want to edit the file then we quit here. */
- if (swap_exists_did_quit)
- getout(1);
-- #endif
- }
-
- /* Execute any "+", "-c" and "-S" arguments. */
---- 782,796 ----
-***************
-*** 2625,2644 ****
- {
- int i;
-
-! #if defined(HAS_SWAP_EXISTS_ACTION)
-! /* When getting the ATTENTION prompt here, use a dialog */
- swap_exists_action = SEA_DIALOG;
-! #endif
- no_wait_return = TRUE;
- i = msg_didany;
- set_buflisted(TRUE);
-! (void)open_buffer(TRUE, NULL, 0); /* create memfile and read file */
- no_wait_return = FALSE;
- msg_didany = i;
- TIME_MSG("reading stdin");
-! #if defined(HAS_SWAP_EXISTS_ACTION)
- check_swap_exists_action();
-- #endif
- #if !(defined(AMIGA) || defined(MACOS_X))
- /*
- * Close stdin and dup it from stderr. Required for GPM to work
---- 2619,2636 ----
- {
- int i;
-
-! // When getting the ATTENTION prompt here, use a dialog
- swap_exists_action = SEA_DIALOG;
-!
- no_wait_return = TRUE;
- i = msg_didany;
- set_buflisted(TRUE);
-! (void)open_buffer(TRUE, NULL, 0); // create memfile and read file
- no_wait_return = FALSE;
- msg_didany = i;
- TIME_MSG("reading stdin");
-!
- check_swap_exists_action();
- #if !(defined(AMIGA) || defined(MACOS_X))
- /*
- * Close stdin and dup it from stderr. Required for GPM to work
-***************
-*** 2741,2756 ****
- if (p_fdls >= 0)
- curwin->w_p_fdl = p_fdls;
- #endif
-! #if defined(HAS_SWAP_EXISTS_ACTION)
-! /* When getting the ATTENTION prompt here, use a dialog */
- swap_exists_action = SEA_DIALOG;
-! #endif
- set_buflisted(TRUE);
-
- /* create memfile, read file */
- (void)open_buffer(FALSE, NULL, 0);
-
-- #if defined(HAS_SWAP_EXISTS_ACTION)
- if (swap_exists_action == SEA_QUIT)
- {
- if (got_int || only_one_window())
---- 2733,2746 ----
- if (p_fdls >= 0)
- curwin->w_p_fdl = p_fdls;
- #endif
-! // When getting the ATTENTION prompt here, use a dialog
- swap_exists_action = SEA_DIALOG;
-!
- set_buflisted(TRUE);
-
- /* create memfile, read file */
- (void)open_buffer(FALSE, NULL, 0);
-
- if (swap_exists_action == SEA_QUIT)
- {
- if (got_int || only_one_window())
-***************
-*** 2768,2774 ****
- }
- else
- handle_swap_exists(NULL);
-- #endif
- dorewind = TRUE; /* start again */
- }
- ui_breakcheck();
---- 2758,2763 ----
-***************
-*** 2865,2877 ****
- curwin->w_arg_idx = arg_idx;
- /* Edit file from arg list, if there is one. When "Quit" selected
- * at the ATTENTION prompt close the window. */
-- # ifdef HAS_SWAP_EXISTS_ACTION
- swap_exists_did_quit = FALSE;
-- # endif
- (void)do_ecmd(0, arg_idx < GARGCOUNT
- ? alist_name(&GARGLIST[arg_idx]) : NULL,
- NULL, NULL, ECMD_LASTL, ECMD_HIDE, curwin);
-- # ifdef HAS_SWAP_EXISTS_ACTION
- if (swap_exists_did_quit)
- {
- /* abort or quit selected */
---- 2854,2863 ----
-***************
-*** 2884,2890 ****
- win_close(curwin, TRUE);
- advance = FALSE;
- }
-- # endif
- if (arg_idx == GARGCOUNT - 1)
- arg_had_last = TRUE;
- ++arg_idx;
---- 2870,2875 ----
-***************
-*** 3485,3491 ****
- mch_exit(0);
- }
-
-- #if defined(HAS_SWAP_EXISTS_ACTION)
- /*
- * Check the result of the ATTENTION dialog:
- * When "Quit" selected, exit Vim.
---- 3470,3475 ----
-***************
-*** 3498,3504 ****
- getout(1);
- handle_swap_exists(NULL);
- }
-- #endif
-
- #endif /* NO_VIM_MAIN */
-
---- 3482,3487 ----
-*** ../vim-8.1.1230/src/testdir/test_swap.vim 2019-01-27 14:29:20.724544960 +0100
---- src/testdir/test_swap.vim 2019-04-28 21:50:37.397318520 +0200
-***************
-*** 164,166 ****
---- 164,222 ----
- call delete('Xtest2')
- call delete('Xtest3')
- endfunc
-+
-+ func Test_swapfile_delete()
-+ autocmd! SwapExists
-+ function s:swap_exists()
-+ let v:swapchoice = s:swap_choice
-+ let s:swapname = v:swapname
-+ let s:filename = expand('<afile>')
-+ endfunc
-+ augroup test_swapfile_delete
-+ autocmd!
-+ autocmd SwapExists * call s:swap_exists()
-+ augroup END
-+
-+
-+ " Create a valid swapfile by editing a file.
-+ split XswapfileText
-+ call setline(1, ['one', 'two', 'three'])
-+ write " file is written, not modified
-+ " read the swapfile as a Blob
-+ let swapfile_name = swapname('%')
-+ let swapfile_bytes = readfile(swapfile_name, 'B')
-+
-+ " Close the file and recreate the swap file.
-+ " Now editing the file will run into the process still existing
-+ quit
-+ call writefile(swapfile_bytes, swapfile_name)
-+ let s:swap_choice = 'e'
-+ let s:swapname = ''
-+ split XswapfileText
-+ quit
-+ call assert_equal(swapfile_name, s:swapname)
-+
-+ " Write the swapfile with a modified PID, now it will be automatically
-+ " deleted. Process one should never be Vim.
-+ let swapfile_bytes[24:27] = 0z01000000
-+ call writefile(swapfile_bytes, swapfile_name)
-+ let s:swapname = ''
-+ split XswapfileText
-+ quit
-+ call assert_equal('', s:swapname)
-+
-+ " Now set the modified flag, the swap file will not be deleted
-+ let swapfile_bytes[28 + 80 + 899] = 0x55
-+ call writefile(swapfile_bytes, swapfile_name)
-+ let s:swapname = ''
-+ split XswapfileText
-+ quit
-+ call assert_equal(swapfile_name, s:swapname)
-+
-+ call delete('XswapfileText')
-+ call delete(swapfile_name)
-+ augroup test_swapfile_delete
-+ autocmd!
-+ augroup END
-+ augroup! test_swapfile_delete
-+ endfunc
-*** ../vim-8.1.1230/runtime/doc/usr_11.txt 2018-05-17 13:42:03.000000000 +0200
---- runtime/doc/usr_11.txt 2019-04-28 21:58:09.667057415 +0200
-***************
-*** 120,126 ****
- USING A SPECIFIC SWAP FILE
-
- If you know which swap file needs to be used, you can recover by giving the
-! swap file name. Vim will then finds out the name of the original file from
- the swap file.
-
- Example: >
---- 120,126 ----
- USING A SPECIFIC SWAP FILE
-
- If you know which swap file needs to be used, you can recover by giving the
-! swap file name. Vim will then find out the name of the original file from
- the swap file.
-
- Example: >
-***************
-*** 205,210 ****
---- 205,217 ----
- NEWER than swap file! ~
-
-
-+ NOTE that in the following situation Vim knows the swap file is not useful and
-+ will automatically delete it:
-+ - The file is a valid swap file (Magic number is correct).
-+ - The flag that the file was modified is not set.
-+ - The process is not running.
-+
-+
- UNREADABLE SWAP FILE
-
- Sometimes the line
-***************
-*** 284,289 ****
---- 291,297 ----
- 'shortmess' option. But it's very unusual that you need this.
-
- For remarks about encryption and the swap file, see |:recover-crypt|.
-+ For programatic access to the swap file, see |swapinfo()|.
-
- ==============================================================================
- *11.4* Further reading
-*** ../vim-8.1.1230/src/os_win32.c 2019-04-28 19:46:17.034060084 +0200
---- src/os_win32.c 2019-04-28 22:11:28.811767431 +0200
-***************
-*** 2903,2908 ****
---- 2903,2925 ----
- return (long)GetCurrentProcessId();
- }
-
-+ /*
-+ * return TRUE if process "pid" is still running
-+ */
-+ int
-+ mch_process_running(pid_t pid)
-+ {
-+ HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, (DWORD)pid);
-+ DWORD status = 0;
-+ int ret = FALSE;
-+
-+ if (hProcess == NULL)
-+ return FALSE; // might not have access
-+ if (GetExitCodeProcess(hProcess, &status) )
-+ ret = status == STILL_ACTIVE;
-+ CloseHandle(hProcess);
-+ return ret;
-+ }
-
- /*
- * Get name of current directory into buffer 'buf' of length 'len' bytes.
-*** ../vim-8.1.1230/src/proto/os_win32.pro 2019-04-28 19:46:17.034060084 +0200
---- src/proto/os_win32.pro 2019-04-28 22:14:17.599153672 +0200
-***************
-*** 19,24 ****
---- 19,25 ----
- int mch_get_user_name(char_u *s, int len);
- void mch_get_host_name(char_u *s, int len);
- long mch_get_pid(void);
-+ int mch_process_running(pid_t pid);
- int mch_dirname(char_u *buf, int len);
- long mch_getperm(char_u *name);
- int mch_setperm(char_u *name, long perm);
-*** ../vim-8.1.1230/src/os_unix.c 2019-04-04 20:13:06.001014760 +0200
---- src/os_unix.c 2019-04-28 22:19:41.013860198 +0200
-***************
-*** 2393,2398 ****
---- 2393,2408 ----
- return (long)getpid();
- }
-
-+ /*
-+ * return TRUE if process "pid" is still running
-+ */
-+ int
-+ mch_process_running(pid_t pid)
-+ {
-+ // EMX kill() not working correctly, it seems
-+ return kill(pid, 0) == 0;
-+ }
-+
- #if !defined(HAVE_STRERROR) && defined(USE_GETCWD)
- static char *
- strerror(int err)
-*** ../vim-8.1.1230/src/proto/os_unix.pro 2019-01-20 15:30:36.893328693 +0100
---- src/proto/os_unix.pro 2019-04-28 22:19:14.453970686 +0200
-***************
-*** 27,32 ****
---- 27,33 ----
- int mch_get_uname(uid_t uid, char_u *s, int len);
- void mch_get_host_name(char_u *s, int len);
- long mch_get_pid(void);
-+ int mch_process_running(pid_t pid);
- int mch_dirname(char_u *buf, int len);
- int mch_FullName(char_u *fname, char_u *buf, int len, int force);
- int mch_isFullName(char_u *fname);
-*** ../vim-8.1.1230/src/version.c 2019-04-28 19:46:17.034060084 +0200
---- src/version.c 2019-04-28 22:20:54.909549767 +0200
-***************
-*** 769,770 ****
---- 769,772 ----
- { /* Add new patch number below this line */
-+ /**/
-+ 1231,
- /**/
-
---
-ARTHUR: What?
-BLACK KNIGHT: None shall pass.
-ARTHUR: I have no quarrel with you, good Sir knight, but I must cross
- this bridge.
-BLACK KNIGHT: Then you shall die.
- The Quest for the Holy Grail (Monty Python)
-
- /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
-/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
-\\\ an exciting new programming language -- http://www.Zimbu.org ///
- \\\ help me help AIDS victims -- http://ICCF-Holland.org ///