From 075cc224736af82edf5cea0181ef827ee0807cc4 Mon Sep 17 00:00:00 2001 From: David Telenko <63603558+DavidTelenko@users.noreply.github.com> Date: Thu, 8 Jan 2026 04:23:30 +0200 Subject: [PATCH] feat: move file/directory into new directory by renaming POC --- lua/oil/mutator/parser.lua | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/lua/oil/mutator/parser.lua b/lua/oil/mutator/parser.lua index bb222749..d9a51ae5 100644 --- a/lua/oil/mutator/parser.lua +++ b/lua/oil/mutator/parser.lua @@ -57,8 +57,14 @@ local function compare_link_target(meta, parsed_entry) return meta_name == parsed_name end +---@class oil.ParseResultData +---@field _type 'directory'|'file'|'link' +---@field id number +---@field name string +---@field link_target string + ---@class (exact) oil.ParseResult ----@field data table Parsed entry data +---@field data oil.ParseResultData | table Parsed entry data ---@field ranges table Locations of the various columns ---@field entry nil|oil.InternalEntry If the entry already exists @@ -220,8 +226,6 @@ M.parse = function(bufnr) err_message = "No filename found" elseif not entry then err_message = "Could not find existing entry (was the ID changed?)" - elseif parsed_entry.name:match("/") or parsed_entry.name:match(fs.sep) then - err_message = "Filename cannot contain path separator" end if err_message then table.insert(errors, { @@ -235,6 +239,16 @@ M.parse = function(bufnr) assert(entry) check_dupe(parsed_entry.name, i) + + local maybe_new_dir = parsed_entry.name:gsub("/[^/]+$", "") + if #maybe_new_dir ~= 0 and maybe_new_dir ~= parsed_entry.name then + table.insert(diffs, { + type = "new", + name = maybe_new_dir, + entry_type = "directory", + }) + end + local meta = entry[FIELD_META] if original_entries[parsed_entry.name] == parsed_entry.id then if entry[FIELD_TYPE] == "link" and not compare_link_target(meta, parsed_entry) then