mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
vim-patch:8.2.1970: it is easy to make mistakes when cleaning up swap files
Problem: It is easy to make mistakes when cleaning up swap files after the
system crashed.
Solution: Warn for the process still running after recovery. Do not
automatically delete a swap file created on another system.
(David Fries, closes vim/vim#7273)
f883508e36
This commit is contained in:
parent
98bcf49d26
commit
abe1dd308e
@ -1138,7 +1138,14 @@ void ml_recover(bool checkext)
|
|||||||
} else {
|
} else {
|
||||||
msg(_("Recovery completed. Buffer contents equals file contents."));
|
msg(_("Recovery completed. Buffer contents equals file contents."));
|
||||||
}
|
}
|
||||||
msg_puts(_("\nYou may want to delete the .swp file now.\n\n"));
|
msg_puts(_("\nYou may want to delete the .swp file now."));
|
||||||
|
if (os_proc_running((int)char_to_long(b0p->b0_pid))) {
|
||||||
|
// Warn there could be an active Vim on the same file, the user may
|
||||||
|
// want to kill it.
|
||||||
|
msg_puts(_("\nNote: process STILL RUNNING: "));
|
||||||
|
msg_outnum(char_to_long(b0p->b0_pid));
|
||||||
|
}
|
||||||
|
msg_puts("\n\n");
|
||||||
cmdline_row = msg_row;
|
cmdline_row = msg_row;
|
||||||
}
|
}
|
||||||
redraw_curbuf_later(UPD_NOT_VALID);
|
redraw_curbuf_later(UPD_NOT_VALID);
|
||||||
@ -1533,14 +1540,27 @@ static bool swapfile_unchanged(char *fname)
|
|||||||
ret = false;
|
ret = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Host name must be known and must equal the current host name, otherwise
|
||||||
|
// comparing pid is meaningless.
|
||||||
|
if (*(b0.b0_hname) == NUL) {
|
||||||
|
ret = false;
|
||||||
|
} else {
|
||||||
|
char hostname[B0_HNAME_SIZE];
|
||||||
|
os_get_hostname(hostname, B0_HNAME_SIZE);
|
||||||
|
hostname[B0_HNAME_SIZE - 1] = NUL;
|
||||||
|
if (STRICMP(b0.b0_hname, hostname) != 0) {
|
||||||
|
ret = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// process must be known and not running.
|
// process must be known and not running.
|
||||||
long pid = char_to_long(b0.b0_pid);
|
long pid = char_to_long(b0.b0_pid);
|
||||||
if (pid == 0L || os_proc_running((int)pid)) {
|
if (pid == 0L || os_proc_running((int)pid)) {
|
||||||
ret = false;
|
ret = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(bram): Should we check if the swap file was created on the current
|
// We do not check the user, it should be irrelevant for whether the swap
|
||||||
// system? And the current user?
|
// file is still useful.
|
||||||
|
|
||||||
close(fd);
|
close(fd);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -421,6 +421,52 @@ func Test_swap_symlink()
|
|||||||
call delete('Xswapdir', 'rf')
|
call delete('Xswapdir', 'rf')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_swap_auto_delete()
|
||||||
|
" Create a valid swapfile by editing a file with a special extension.
|
||||||
|
split Xtest.scr
|
||||||
|
call setline(1, ['one', 'two', 'three'])
|
||||||
|
write " file is written, not modified
|
||||||
|
write " write again to make sure the swapfile is created
|
||||||
|
" read the swapfile as a Blob
|
||||||
|
let swapfile_name = swapname('%')
|
||||||
|
let swapfile_bytes = readfile(swapfile_name, 'B')
|
||||||
|
|
||||||
|
" Forget about the file, recreate the swap file, then edit it again. The
|
||||||
|
" swap file should be automatically deleted.
|
||||||
|
bwipe!
|
||||||
|
" change the process ID to avoid the "still running" warning
|
||||||
|
let swapfile_bytes[24] = 0x99
|
||||||
|
call writefile(swapfile_bytes, swapfile_name)
|
||||||
|
edit Xtest.scr
|
||||||
|
" will end up using the same swap file after deleting the existing one
|
||||||
|
call assert_equal(swapfile_name, swapname('%'))
|
||||||
|
bwipe!
|
||||||
|
|
||||||
|
" create the swap file again, but change the host name so that it won't be
|
||||||
|
" deleted
|
||||||
|
autocmd! SwapExists
|
||||||
|
augroup test_swap_recover_ext
|
||||||
|
autocmd!
|
||||||
|
autocmd SwapExists * let v:swapchoice = 'e'
|
||||||
|
augroup END
|
||||||
|
|
||||||
|
" change the host name
|
||||||
|
let swapfile_bytes[28 + 40] = 0x89
|
||||||
|
call writefile(swapfile_bytes, swapfile_name)
|
||||||
|
edit Xtest.scr
|
||||||
|
call assert_equal(1, filereadable(swapfile_name))
|
||||||
|
" will use another same swap file name
|
||||||
|
call assert_notequal(swapfile_name, swapname('%'))
|
||||||
|
bwipe!
|
||||||
|
|
||||||
|
call delete('Xtest.scr')
|
||||||
|
call delete(swapfile_name)
|
||||||
|
augroup test_swap_recover_ext
|
||||||
|
autocmd!
|
||||||
|
augroup END
|
||||||
|
augroup! test_swap_recover_ext
|
||||||
|
endfunc
|
||||||
|
|
||||||
func Test_no_swap_file()
|
func Test_no_swap_file()
|
||||||
call assert_equal("\nNo swap file", execute('swapname'))
|
call assert_equal("\nNo swap file", execute('swapname'))
|
||||||
endfunc
|
endfunc
|
||||||
|
Loading…
Reference in New Issue
Block a user