diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c index 465d9e2668..9a23cb7edf 100644 --- a/src/nvim/fileio.c +++ b/src/nvim/fileio.c @@ -2378,11 +2378,10 @@ void shorten_buf_fname(buf_T *buf, char *dirname, int force) XFREE_CLEAR(buf->b_sfname); } char *p = path_shorten_fname(buf->b_ffname, dirname); - if (p != NULL) { + if (p != NULL && *p != NUL) { buf->b_sfname = xstrdup(p); buf->b_fname = buf->b_sfname; - } - if (p == NULL) { + } else { buf->b_fname = buf->b_ffname; } } diff --git a/test/functional/ex_cmds/mksession_spec.lua b/test/functional/ex_cmds/mksession_spec.lua index 40d6564eba..81e39889de 100644 --- a/test/functional/ex_cmds/mksession_spec.lua +++ b/test/functional/ex_cmds/mksession_spec.lua @@ -188,6 +188,22 @@ describe(':mksession', function() eq(expected, api.nvim_buf_get_name(0)) end) + it('restores a directory buffer for the CWD #40939', function() + local cwd_dir = t.fix_slashes(fn.getcwd()) + local expected = cwd_dir .. '/' + + command('set sessionoptions=buffers,curdir') + command('edit ' .. cwd_dir) + command('cd ' .. cwd_dir) + neq('', fn.bufname('%')) + eq(expected, api.nvim_buf_get_name(0)) + + command('mksession ' .. session_file) + command('%bwipeout!') + command('source ' .. session_file) + eq(expected, api.nvim_buf_get_name(0)) + end) + it('restores CWD for :terminal buffers #11288', function() local cwd_dir = fn.fnamemodify('.', ':p:~'):gsub([[/*$]], '') local session_path = cwd_dir .. '/' .. session_file