mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
fix(fileio): use first available directory in backupdir for backupcopy (#20655)
Fix backups failing for symlink files
Set backup to NULL prior to continuing & Clear backup prior to NULL set
to avoid leaking
Fixes #11349
Remove testing hacks in scripts for windows
Skip FreeBSD
Something appears up with these types of tests for FreeBSD on
Circus, see 2d6735d8ce
This commit is contained in:
parent
95f2f3cb5e
commit
19a487bc86
@ -2781,10 +2781,11 @@ int buf_write(buf_T *buf, char *fname, char *sfname, linenr_T start, linenr_T en
|
||||
#endif
|
||||
|
||||
// copy the file
|
||||
if (os_copy(fname, backup, UV_FS_COPYFILE_FICLONE)
|
||||
!= 0) {
|
||||
SET_ERRMSG(_("E506: Can't write to backup file "
|
||||
"(add ! to override)"));
|
||||
if (os_copy(fname, backup, UV_FS_COPYFILE_FICLONE) != 0) {
|
||||
SET_ERRMSG(_("E509: Cannot create backup file (add ! to override)"));
|
||||
XFREE_CLEAR(backup);
|
||||
backup = NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
#ifdef UNIX
|
||||
@ -2795,6 +2796,7 @@ int buf_write(buf_T *buf, char *fname, char *sfname, linenr_T start, linenr_T en
|
||||
#ifdef HAVE_ACL
|
||||
mch_set_acl((char_u *)backup, acl);
|
||||
#endif
|
||||
SET_ERRMSG(NULL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
local lfs = require('lfs')
|
||||
local helpers = require('test.functional.helpers')(after_each)
|
||||
|
||||
local assert_log = helpers.assert_log
|
||||
@ -5,6 +6,7 @@ local assert_nolog = helpers.assert_nolog
|
||||
local clear = helpers.clear
|
||||
local command = helpers.command
|
||||
local eq = helpers.eq
|
||||
local neq = helpers.neq
|
||||
local ok = helpers.ok
|
||||
local feed = helpers.feed
|
||||
local funcs = helpers.funcs
|
||||
@ -132,6 +134,57 @@ describe('fileio', function()
|
||||
eq('foo', foo_contents);
|
||||
end)
|
||||
|
||||
it('backup symlinked files #11349', function()
|
||||
if isCI('cirrus') then
|
||||
pending('FIXME: cirrus')
|
||||
end
|
||||
clear()
|
||||
|
||||
local initial_content = 'foo'
|
||||
local link_file_name = 'Xtest_startup_file2'
|
||||
local backup_file_name = link_file_name .. '~'
|
||||
|
||||
write_file('Xtest_startup_file1', initial_content, false)
|
||||
lfs.link('Xtest_startup_file1', link_file_name, true)
|
||||
command('set backup')
|
||||
command('set backupcopy=yes')
|
||||
command('edit ' .. link_file_name)
|
||||
feed('Abar<esc>')
|
||||
command('write')
|
||||
|
||||
local backup_raw = read_file(backup_file_name)
|
||||
neq(nil, backup_raw, "Expected backup file " .. backup_file_name .. "to exist but did not")
|
||||
eq(initial_content, trim(backup_raw), 'Expected backup to contain original contents')
|
||||
end)
|
||||
|
||||
|
||||
it('backup symlinked files in first avialable backupdir #11349', function()
|
||||
if isCI('cirrus') then
|
||||
pending('FIXME: cirrus')
|
||||
end
|
||||
clear()
|
||||
|
||||
local initial_content = 'foo'
|
||||
local backup_dir = 'Xtest_backupdir'
|
||||
local sep = helpers.get_pathsep()
|
||||
local link_file_name = 'Xtest_startup_file2'
|
||||
local backup_file_name = backup_dir .. sep .. link_file_name .. '~'
|
||||
|
||||
write_file('Xtest_startup_file1', initial_content, false)
|
||||
lfs.link('Xtest_startup_file1', link_file_name, true)
|
||||
mkdir(backup_dir)
|
||||
command('set backup')
|
||||
command('set backupcopy=yes')
|
||||
command('set backupdir=.__this_does_not_exist__,' .. backup_dir)
|
||||
command('edit ' .. link_file_name)
|
||||
feed('Abar<esc>')
|
||||
command('write')
|
||||
|
||||
local backup_raw = read_file(backup_file_name)
|
||||
neq(nil, backup_raw, "Expected backup file " .. backup_file_name .. " to exist but did not")
|
||||
eq(initial_content, trim(backup_raw), 'Expected backup to contain original contents')
|
||||
end)
|
||||
|
||||
it('readfile() on multibyte filename #10586', function()
|
||||
clear()
|
||||
local text = {
|
||||
|
Loading…
Reference in New Issue
Block a user