From d1ca8bc4940542547c33da48767916149c7d3128 Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Wed, 6 Jan 2016 22:44:07 -0800 Subject: [PATCH] fix(filemanager): delete document with settings --- base | 2 +- frontend/apps/filemanager/filemanager.lua | 30 +++++-- .../filemanager/filemanagerfilesearcher.lua | 2 +- spec/unit/filemanager_spec.lua | 84 +++++++++++++++++++ 4 files changed, 110 insertions(+), 8 deletions(-) diff --git a/base b/base index 9a2503bac..9bad2e838 160000 --- a/base +++ b/base @@ -1 +1 @@ -Subproject commit 9a2503bacc3fe52f5946d8392439f946a5d8dae4 +Subproject commit 9bad2e83870de728e00ce387136a4e0fa4827de4 diff --git a/frontend/apps/filemanager/filemanager.lua b/frontend/apps/filemanager/filemanager.lua index 5358e2da6..ac7e53d14 100644 --- a/frontend/apps/filemanager/filemanager.lua +++ b/frontend/apps/filemanager/filemanager.lua @@ -11,6 +11,7 @@ local FileChooser = require("ui/widget/filechooser") local TextWidget = require("ui/widget/textwidget") local Blitbuffer = require("ffi/blitbuffer") local lfs = require("libs/libkoreader-lfs") +local docsettings = require("docsettings") local UIManager = require("ui/uimanager") local Screen = require("device").screen local Geom = require("ui/geometry") @@ -277,18 +278,35 @@ function FileManager:pasteHere(file) end function FileManager:deleteFile(file) + local ok, err local InfoMessage = require("ui/widget/infomessage") - DEBUG("File to remove", util.realpath(file)) - local rm = util.execute(self.rm_bin, "-rf", util.realpath(file)) - DEBUG("rm status", rm) - if rm == 0 then + local file_abs_path = util.realpath(file) + if file_abs_path == nil then UIManager:show(InfoMessage:new{ - text = _("Successfully deleted\n") .. file, + text = util.template(_("File %1 not found"), file), + }) + return + end + + local is_doc = DocumentRegistry:getProvider(file_abs_path) + ok, err = os.remove(file_abs_path) + if err == nil then + if is_doc ~= nil then + -- also delete history/settings for documents + local sidecar_dir = docsettings:getSidecarDir(file_abs_path) + if lfs.attributes(sidecar_dir, "mode") == "directory" then + util.purgeDir(sidecar_dir) + end + local legacy_history_file = docsettings:getHistoryPath(file) + ok, err = os.remove(legacy_history_file) + end + UIManager:show(InfoMessage:new{ + text = util.template(_("Successfully deleted %1"), file), timeout = 2, }) else UIManager:show(InfoMessage:new{ - text = _("An error occurred while trying to delete\n") .. file, + text = util.template(_("An error occurred while trying to delete %1"), file), }) end end diff --git a/frontend/apps/filemanager/filemanagerfilesearcher.lua b/frontend/apps/filemanager/filemanagerfilesearcher.lua index f9f480b3b..1d6ea1f65 100644 --- a/frontend/apps/filemanager/filemanagerfilesearcher.lua +++ b/frontend/apps/filemanager/filemanagerfilesearcher.lua @@ -41,7 +41,7 @@ function FileSearcher:readDir() local fullpath = d.."/"..f local attributes = lfs.attributes(fullpath) if attributes.mode == "directory" and f ~= "." and f~=".." then - table.insert(new_dirs, d.."/"..f) + table.insert(new_dirs, fullpath) elseif attributes.mode == "file" and DocumentRegistry:getProvider(fullpath) then table.insert(self.files, {name = f, path = fullpath, attr = attributes}) end diff --git a/spec/unit/filemanager_spec.lua b/spec/unit/filemanager_spec.lua index 9eded5650..ea88cc9f8 100644 --- a/spec/unit/filemanager_spec.lua +++ b/spec/unit/filemanager_spec.lua @@ -1,7 +1,10 @@ require("commonrequire") local FileManager = require("apps/filemanager/filemanager") +local lfs = require("libs/libkoreader-lfs") +local docsettings = require("docsettings") local UIManager = require("ui/uimanager") local Screen = require("device").screen +local util = require("ffi/util") local DEBUG = require("dbg") describe("FileManager module", function() @@ -15,4 +18,85 @@ describe("FileManager module", function() UIManager:scheduleIn(1, function() UIManager:close(filemanager) end) UIManager:run() end) + it("should show error on non-existent file", function() + local filemanager = FileManager:new{ + dimen = Screen:getSize(), + root_path = "../../test", + } + local old_show = UIManager.show + local tmp_fn = "/abc/123/test/foo.bar.baz.tmp.epub.pdf" + UIManager.show = function(self, w) + assert.Equals(w.text, "File "..tmp_fn.." not found") + end + assert.is_nil(lfs.attributes(tmp_fn)) + filemanager:deleteFile(tmp_fn) + UIManager.show = old_show + end) + it("should not delete settings for non-document file", function() + local filemanager = FileManager:new{ + dimen = Screen:getSize(), + root_path = "../../test", + } + + local tmp_fn = "../../test/2col.test.tmp.sh" + util.copyFile("../../test/2col.pdf", tmp_fn) + + local tmp_sidecar = docsettings:getSidecarDir(util.realpath(tmp_fn)) + lfs.mkdir(tmp_sidecar) + local tmp_history = docsettings:getHistoryPath(tmp_fn) + local tmpfp = io.open(tmp_history, "w") + tmpfp:write("{}") + tmpfp:close() + local old_show = UIManager.show + + -- make sure file exists + assert.is_not_nil(lfs.attributes(tmp_fn)) + assert.is_not_nil(lfs.attributes(tmp_sidecar)) + assert.is_not_nil(lfs.attributes(tmp_history)) + + UIManager.show = function(self, w) + assert.Equals(w.text, "Successfully deleted "..tmp_fn) + end + filemanager:deleteFile(tmp_fn) + UIManager.show = old_show + + -- make sure history file exists + assert.is_nil(lfs.attributes(tmp_fn)) + assert.is_not_nil(lfs.attributes(tmp_sidecar)) + assert.is_not_nil(lfs.attributes(tmp_history)) + os.remove(tmp_sidecar) + os.remove(tmp_history) + end) + it("should delete document with its settings", function() + local filemanager = FileManager:new{ + dimen = Screen:getSize(), + root_path = "../../test", + } + + local tmp_fn = "../../test/2col.test.tmp.pdf" + util.copyFile("../../test/2col.pdf", tmp_fn) + + local tmp_sidecar = docsettings:getSidecarDir(util.realpath(tmp_fn)) + lfs.mkdir(tmp_sidecar) + local tmp_history = docsettings:getHistoryPath(tmp_fn) + local tmpfp = io.open(tmp_history, "w") + tmpfp:write("{}") + tmpfp:close() + local old_show = UIManager.show + + -- make sure file exists + assert.is_not_nil(lfs.attributes(tmp_fn)) + assert.is_not_nil(lfs.attributes(tmp_sidecar)) + assert.is_not_nil(lfs.attributes(tmp_history)) + + UIManager.show = function(self, w) + assert.Equals(w.text, "Successfully deleted "..tmp_fn) + end + filemanager:deleteFile(tmp_fn) + UIManager.show = old_show + + assert.is_nil(lfs.attributes(tmp_fn)) + assert.is_nil(lfs.attributes(tmp_sidecar)) + assert.is_nil(lfs.attributes(tmp_history)) + end) end)