diff --git a/frontend/docsettings.lua b/frontend/docsettings.lua index ab1d630b2..39c52bd47 100644 --- a/frontend/docsettings.lua +++ b/frontend/docsettings.lua @@ -63,15 +63,19 @@ function DocSettings:open(docfile) -- can handle two files with only different suffixes. new.sidecar_file = sidecar.."/metadata.".. docfile:match(".*%.(.*)")..".lua" + if docfile:find("/") then + new.legacy_sidecar_file = sidecar.."/".. + docfile:match(".*%/(.*)")..".lua" + else + new.legacy_sidecar_file = sidecar.."/"..docfile..".lua" + end end new.candidates = {} -- New sidecar file table.insert(new.candidates, buildCandidate(new.sidecar_file)) -- Legacy sidecar file - table.insert(new.candidates, buildCandidate( - sidecar.."/".. - docfile:match(".*%/(.*)")..".lua")) + table.insert(new.candidates, buildCandidate(new.legacy_sidecar_file)) -- Legacy history folder table.insert(new.candidates, buildCandidate(new.history_file)) -- Legacy kpdfview setting diff --git a/spec/unit/docsettings_spec.lua b/spec/unit/docsettings_spec.lua index ee08802cd..6677bf731 100644 --- a/spec/unit/docsettings_spec.lua +++ b/spec/unit/docsettings_spec.lua @@ -1,40 +1,76 @@ describe("docsettings module", function() - local docsettings + local docsettings, lfs setup(function() require("commonrequire") docsettings = require("docsettings") + lfs = require("libs/libkoreader-lfs") end) it("should generate sidecar directory path", function() assert.Equals("../../foo.sdr", docsettings:getSidecarDir("../../foo.pdf")) assert.Equals("/foo/bar.sdr", docsettings:getSidecarDir("/foo/bar.pdf")) assert.Equals("baz.sdr", docsettings:getSidecarDir("baz.pdf")) end) + it("should read legacy history file", function() local file = "file.pdf" local d = docsettings:open(file) d:saveSetting("a", "b") + d:saveSetting("c", "d") d:close() -- Now the sidecar file should be written. - assert.False(os.rename(d.sidecar_file, d.history_file) == nil) - d = docsettings:open(file) - assert.Equals(d:readSetting("a"), "b") - d:close() - -- history_file should be removed as sidecar_file is preferred. + local legacy_files = { + d.history_file, + d.sidecar .. "/file.pdf.lua", + "file.pdf.kpdfview.lua", + } + + for _, f in pairs(legacy_files) do + assert.False(os.rename(d.sidecar_file, f) == nil) + d = docsettings:open(file) + assert.True(os.remove(d.sidecar_file) == nil) + -- Legacy history files should not be removed before flush has been + -- called. + assert.Equals(lfs.attributes(f, "mode"), "file") + assert.Equals(d:readSetting("a"), "b") + assert.Equals(d:readSetting("c"), "d") + assert.Equals(d:readSetting("e"), nil) + d:close() + -- legacy history files should be removed as sidecar_file is + -- preferred. + assert.True(os.remove(f) == nil) + end + assert.False(os.remove(d.sidecar_file) == nil) - assert.True(os.remove(d.history_file) == nil) + d:purge() + end) + + it("should respect newest history file", function() + local file = "file.pdf" + local d = docsettings:open(file) + + local legacy_files = { + d.history_file, + d.sidecar .. "/file.pdf.lua", + "file.pdf.kpdfview.lua", + } + + -- docsettings:flush will remove legacy files. + for i, v in pairs(legacy_files) do + d:saveSetting("a", i) + d:flush() + assert.False(os.rename(d.sidecar_file, v.."1") == nil) + end - assert.False(os.rename(d.sidecar_file, d.sidecar .. "/file.lua") == nil) - d = docsettings:open(file) - assert.Equals(d:readSetting("a"), "b") d:close() + for _, v in pairs(legacy_files) do + assert.False(os.rename(v.."1", v) == nil) + end - assert.False(os.rename(d.sidecar_file, "file.kpdfview.lua") == nil) d = docsettings:open(file) - assert.Equals(d:readSetting("a"), "b") + assert.Equals(d:readSetting("a"), #legacy_files) d:close() - d:purge() end) end)