stevearc / oil.nvim

Neovim file explorer: edit your filesystem like a buffer
MIT License
3.4k stars 92 forks source link

bug: apostrophe's not supported in unix files over ssh #352

Closed favilo closed 2 months ago

favilo commented 2 months ago

Did you check the docs and existing issues?

Neovim version (nvim -v)

NVIM v0.9.5

Operating system/version

6.6.10-1-MANJARO

Describe the bug

Attempting to create/rename/move/interact with files or folders with apostrophes in them with oil-ssh: causes either a hang, or in the case of a move it seems to just ignore the apostrophe, and throw a corresponding error about missing files.

For instance, when attempting to move testing'.txt to testing' 2.txt I get the following error:

[oil] Error applying actions: 1: mv: missing destination file operand after '/Media/testing.txt /Media/testing 2.txt'

What is the severity of this bug?

breaking (some functionality is broken)

Steps To Reproduce

  1. nvim -u repro.lua
  2. G
  3. dd
  4. :w
  5. o

Expected Behavior

The file should be moved/renamed/deleted/opened depending on actions

Directory structure

- tmp/
    - testing/
        -   directory/
            - testing'.txt

Repro

-- save as repro.lua
-- run with nvim -u repro.lua
-- DO NOT change the paths
local root = vim.fn.fnamemodify("./.repro", ":p")

-- set stdpaths to use .repro
for _, name in ipairs({ "config", "data", "state", "runtime", "cache" }) do
    vim.env[("XDG_%s_HOME"):format(name:upper())] = root .. "/" .. name
end

-- bootstrap lazy
local lazypath = root .. "/plugins/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
    vim.fn.system({
        "git",
        "clone",
        "--filter=blob:none",
        "--single-branch",
        "https://github.com/folke/lazy.nvim.git",
        lazypath,
    })
end
vim.opt.runtimepath:prepend(lazypath)

-- install plugins
local plugins = {
    "folke/tokyonight.nvim",
    {
        "stevearc/oil.nvim",
        config = function()
            require("oil").setup({
                -- add any needed settings here
            })
        end,
    },
    -- add any other plugins here
}
require("lazy").setup(plugins, {
    root = root .. "/plugins",
})

vim.cmd.colorscheme("tokyonight")
-- add anything else here
vim.cmd([[:!rm /tmp/oil-test/ -r]])
vim.cmd([[:!mkdir -p /tmp/oil-test/]])
vim.cmd([[:!touch "/tmp/oil-test/testing'.txt"]])
vim.cmd([[:e oil-ssh://localhost//tmp/oil-test/]])

local buf = 0
local enter = vim.api.nvim_replace_termcodes("<CR>", true, false, true)
vim.cmd([[:sleep ]])
vim.api.nvim_feedkeys(enter, "n", true)
vim.api.nvim_feedkeys("dd", "n", true)
vim.cmd([[:w]])

Did you check the bug with a clean config?

favilo commented 2 months ago

After searching through the code, it looks like we need to escape ' characters in this line. Along with all the other places we call self.conn:run()