Skip to content

Commit

Permalink
fix: support permissions checks on windows and virtual filesystems (#555
Browse files Browse the repository at this point in the history
)

* use access(2) over file permission checks to workaround systems that change expected file permission view

* cleanup: delete unused function

---------

Co-authored-by: Steven Arcangeli <[email protected]>
  • Loading branch information
BozeBro and stevearc authored Jan 8, 2025
1 parent 1df90fa commit 7041528
Showing 1 changed file with 2 additions and 34 deletions.
36 changes: 2 additions & 34 deletions lua/oil/adapters/files.lua
Original file line number Diff line number Diff line change
Expand Up @@ -455,26 +455,6 @@ M.list = function(url, column_defs, cb)
end, 10000)
end

---@type nil|integer[]
local _group_ids
---@return integer[]
local function get_group_ids()
if not _group_ids then
local output = vim.fn.system({ "id", "-G" })
if vim.v.shell_error == 0 then
_group_ids = vim.tbl_map(tonumber, vim.split(output, "%s+", { trimempty = true }))
else
-- If the id command fails, fall back to just using the process group
_group_ids = { uv.getgid() }
vim.notify(
"[oil] missing the `id` command. Some directories may not be modifiable even if you have group access.",
vim.log.levels.WARN
)
end
end
return _group_ids
end

---@param bufnr integer
---@return boolean
M.is_modifiable = function(bufnr)
Expand All @@ -490,20 +470,8 @@ M.is_modifiable = function(bufnr)
return true
end

-- Can't do permissions checks on windows
if fs.is_windows then
return true
end

local uid = uv.getuid()
local rwx = stat.mode
if uid == stat.uid then
rwx = bit.bor(rwx, bit.rshift(stat.mode, 6))
end
if vim.tbl_contains(get_group_ids(), stat.gid) then
rwx = bit.bor(rwx, bit.rshift(stat.mode, 3))
end
return bit.band(rwx, 2) ~= 0
-- fs_access can return nil, force boolean return
return uv.fs_access(dir, "W") == true
end

---@param action oil.Action
Expand Down

0 comments on commit 7041528

Please sign in to comment.