feat(nx-mods): scan imports/mods for zip candidates

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Andrew Quenehen
2026-08-01 05:19:59 -03:00
parent 7d01242cd1
commit d4455c508f
2 changed files with 44 additions and 0 deletions
+18
View File
@@ -398,6 +398,18 @@ local function listRomPaths(dir)
return paths return paths
end end
local function listZipPaths(dir)
local paths = {}
for _, name in ipairs(love.filesystem.getDirectoryItems(dir) or {}) do
local path = (dir == "" or dir == "/") and name or (dir .. "/" .. name)
if name:lower():match("%.zip$")
and love.filesystem.getInfo(path, "file") then
paths[#paths + 1] = path
end
end
return paths
end
function RomImporter:scanInbox(ready) function RomImporter:scanInbox(ready)
ready = ready or self.ready ready = ready or self.ready
local paths = {} local paths = {}
@@ -411,6 +423,12 @@ function RomImporter:scanInbox(ready)
return paths return paths
end end
-- NX mods inbox: only *.zip under imports/mods/ (never ROM extensions).
function RomImporter:scanModsInbox()
self:ensureModsInboxDir()
return listZipPaths(MODS_INBOX_DIR)
end
function RomImporter:rescanAction(version) function RomImporter:rescanAction(version)
if self.workState == "working" then return end if self.workState == "working" then return end
version = version or self.tab or "red" version = version or self.tab or "red"
+26
View File
@@ -62,9 +62,12 @@ local function freshImporter()
tab = "mods", tab = "mods",
modNotice = nil, modNotice = nil,
mods = {}, mods = {},
ready = { red = false, blue = false, yellow = false },
ensureImportsDir = RomImporter.ensureImportsDir, ensureImportsDir = RomImporter.ensureImportsDir,
ensureModsInboxDir = RomImporter.ensureModsInboxDir, ensureModsInboxDir = RomImporter.ensureModsInboxDir,
_setNxModsInboxNotice = RomImporter._setNxModsInboxNotice, _setNxModsInboxNotice = RomImporter._setNxModsInboxNotice,
scanModsInbox = RomImporter.scanModsInbox,
scanInbox = RomImporter.scanInbox,
}, RomImporter) }, RomImporter)
end end
@@ -88,8 +91,31 @@ check(ri.modNotice.text:find("DBI MTP", 1, true) ~= nil,
check(ri.modNotice.text:find("switch/gen1recomp/pokemon-love2d/imports/mods/", 1, true), check(ri.modNotice.text:find("switch/gen1recomp/pokemon-love2d/imports/mods/", 1, true),
"hint uses sdmc-stripped relative imports/mods/ path") "hint uses sdmc-stripped relative imports/mods/ path")
-- NXMOD-02: scanModsInbox returns only *.zip under imports/mods/
ri = freshImporter()
love.filesystem.write("imports/mods/valid.zip", "ZIPDATA")
love.filesystem.write("imports/mods/readme.txt", "nope")
love.filesystem.write("imports/mods/cart.gb", string.rep("R", 16))
love.filesystem.write("imports/other.zip", "WRONGDIR")
local zips = ri:scanModsInbox()
eq(#zips, 1, "scanModsInbox returns one zip candidate")
eq(zips[1], "imports/mods/valid.zip", "scanModsInbox path is under imports/mods/")
-- ROM scanInbox must not treat .zip as ROM
ri = freshImporter()
love.filesystem.write("imports/modpack.zip", "ZIPROM")
love.filesystem.write("imports/mods/also.zip", "ZIPMOD")
local roms = ri:scanInbox(ri.ready)
for _, path in ipairs(roms) do
check(not path:lower():match("%.zip$"),
"ROM scanInbox ignores zip: " .. tostring(path))
end
eq(#roms, 0, "ROM scanInbox finds no zip-only inbox entries")
-- Cleanup + restore stubs -- Cleanup + restore stubs
clearModsInbox() clearModsInbox()
love.filesystem.remove("imports/other.zip")
love.filesystem.remove("imports/modpack.zip")
love.system.getOS = saved.getOS love.system.getOS = saved.getOS
love.filesystem.getSaveDirectory = saved.getSaveDirectory love.filesystem.getSaveDirectory = saved.getSaveDirectory
love.filesystem.createDirectory = saved.createDirectory love.filesystem.createDirectory = saved.createDirectory