Skip to content

Commit

Permalink
fix: data loss bug when move + delete (#162)
Browse files Browse the repository at this point in the history
  • Loading branch information
stevearc committed Aug 26, 2023
1 parent 2fde9d8 commit f86d494
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 8 deletions.
4 changes: 2 additions & 2 deletions lua/oil/mutator/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ M.enforce_action_order = function(actions)
local function get_deps(action)
local ret = {}
if action.type == "delete" then
return ret
src_trie:accum_children_of(action.url, ret)
elseif action.type == "create" then
-- Finish operating on parents first
-- e.g. NEW /a BEFORE NEW /a/b
Expand Down Expand Up @@ -289,7 +289,7 @@ M.enforce_action_order = function(actions)
-- We've detected a move cycle (e.g. MOVE /a -> /b + MOVE /b -> /a)
-- Split one of the moves and retry
local intermediate_url =
string.format("%s__oil_tmp_%05d", loop_action.src_url, math.random(999999))
string.format("%s__oil_tmp_%05d", loop_action.src_url, math.random(999999))
local move_1 = {
type = "move",
entry_type = loop_action.entry_type,
Expand Down
25 changes: 19 additions & 6 deletions tests/mutator_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ a.describe("mutator", function()
})
local diffs = parser.parse(bufnr)
assert.are.same({
{ type = "new", id = file[FIELD_ID], name = "b.txt", entry_type = "file" },
{ type = "new", id = file[FIELD_ID], name = "b.txt", entry_type = "file" },
{ type = "delete", id = file[FIELD_ID], name = "a.txt" },
}, diffs)
end)
Expand Down Expand Up @@ -314,7 +314,7 @@ a.describe("mutator", function()
local bufnr = vim.api.nvim_get_current_buf()
local diffs = {
{ type = "delete", name = "a.txt", id = file[FIELD_ID] },
{ type = "new", name = "b.txt", entry_type = "file", id = file[FIELD_ID] },
{ type = "new", name = "b.txt", entry_type = "file", id = file[FIELD_ID] },
}
local actions = mutator.create_actions_from_diffs({
[bufnr] = diffs,
Expand All @@ -335,8 +335,8 @@ a.describe("mutator", function()
local bufnr = vim.api.nvim_get_current_buf()
local diffs = {
{ type = "delete", name = "a.txt", id = file[FIELD_ID] },
{ type = "new", name = "b.txt", entry_type = "file", id = file[FIELD_ID] },
{ type = "new", name = "a.txt", entry_type = "file" },
{ type = "new", name = "b.txt", entry_type = "file", id = file[FIELD_ID] },
{ type = "new", name = "a.txt", entry_type = "file" },
}
local actions = mutator.create_actions_from_diffs({
[bufnr] = diffs,
Expand All @@ -363,9 +363,9 @@ a.describe("mutator", function()
local bufnr = vim.api.nvim_get_current_buf()
local diffs = {
{ type = "delete", name = "a.txt", id = afile[FIELD_ID] },
{ type = "new", name = "b.txt", entry_type = "file", id = afile[FIELD_ID] },
{ type = "new", name = "b.txt", entry_type = "file", id = afile[FIELD_ID] },
{ type = "delete", name = "b.txt", id = bfile[FIELD_ID] },
{ type = "new", name = "a.txt", entry_type = "file", id = bfile[FIELD_ID] },
{ type = "new", name = "a.txt", entry_type = "file", id = bfile[FIELD_ID] },
}
math.randomseed(2983982)
local actions = mutator.create_actions_from_diffs({
Expand Down Expand Up @@ -409,6 +409,19 @@ a.describe("mutator", function()
assert.are.same({ create, move }, ordered_actions)
end)

it("Moves file out of parent before deleting parent", function()
local move = {
type = "move",
src_url = "oil-test:///a/b.txt",
dest_url = "oil-test:///b.txt",
entry_type = "file",
}
local delete = { type = "delete", url = "oil-test:///a", entry_type = "directory" }
local actions = { delete, move }
local ordered_actions = mutator.enforce_action_order(actions)
assert.are.same({ move, delete }, ordered_actions)
end)

it("Handles parent child move ordering", function()
-- move parent into a child and child OUT of parent
-- MOVE /a/b -> /b
Expand Down

0 comments on commit f86d494

Please sign in to comment.