added library reordering & prefix rename

This commit is contained in:
olcxja 2026-10-02 14:05:49 +02:00
commit aca9f839e3
13 changed files with 374 additions and 20 deletions

View file

@ -4,6 +4,7 @@ const path = require('path')
const fs = require('fs')
const { DIRS, readJson, writeJson } = require('./paths')
const { rewireSymlinks } = require('./symlinks')
const { normalizePathName } = require('./names')
const REGISTRY = path.join(DIRS.DATA, 'prefixes.json')
const MAIN = 'Main'
@ -26,10 +27,6 @@ function savePrefixes(defs) {
writeJson(REGISTRY, defs)
}
function normalizeName(name) {
return String(name || '').trim().replace(/[^\w .-]/g, '').replace(/\s+/g, ' ')
}
function prefixPath(name) {
return path.join(DIRS.PREFIXES, name)
}
@ -62,7 +59,7 @@ function prefixDriveRoot(name) {
}
function createPrefix(name) {
const clean = normalizeName(name)
const clean = normalizePathName(name)
if (!clean) return { ok: false, error: 'invalidName' }
if (clean.toLowerCase() === MAIN.toLowerCase()) return { ok: false, error: 'alreadyExists' }
if (fs.existsSync(prefixPath(clean))) return { ok: false, error: 'alreadyExists' }
@ -95,6 +92,35 @@ async function healPrefix(name) {
return rewireSymlinks(prefixPath(name), [DIRS.FILES])
}
// Renaming a prefix moves its folder on disk and follows the name into the
// registry (default included) and every app that runs in it. Prefix imports
// keep their stored paths (they are relative to the prefix root), so only the
// reference changes - the files move with the folder.
function renamePrefix(oldName, newName) {
const clean = normalizePathName(newName)
if (!clean) return { ok: false, error: 'invalidName' }
const defs = listPrefixes()
const entry = defs.prefixes.find(p => p.name === oldName)
if (!entry) return { ok: false, error: 'notFound' }
if (entry.locked || String(oldName).toLowerCase() === MAIN.toLowerCase()) return { ok: false, error: 'isMain' }
if (clean === oldName) return { ok: true, name: clean, games: 0 }
if (defs.prefixes.some(p => p.name === clean) || fs.existsSync(prefixPath(clean))) return { ok: false, error: 'alreadyExists' }
// a registered prefix whose folder wine has not created yet can still be
// renamed - only the registry entry exists
if (fs.existsSync(prefixPath(oldName))) {
try {
fs.renameSync(prefixPath(oldName), prefixPath(clean))
} catch (err) {
return { ok: false, error: String((err && err.message) || err) }
}
}
entry.name = clean
if (defs.default === oldName) defs.default = clean
savePrefixes(defs)
const games = require('./library').renamePrefixRefs(oldName, clean)
return { ok: true, name: clean, games }
}
function setDefaultPrefix(name) {
const defs = listPrefixes()
if (name && !defs.prefixes.some(p => p.name === name)) return { ok: false, error: 'notFound' }
@ -103,4 +129,4 @@ function setDefaultPrefix(name) {
return { ok: true }
}
module.exports = { listPrefixes, savePrefixes, createPrefix, deletePrefix, setDefaultPrefix, prefixPath, prefixExists, prefixDriveRoot, healPrefix, normalizeName, MAIN }
module.exports = { listPrefixes, savePrefixes, createPrefix, deletePrefix, renamePrefix, setDefaultPrefix, prefixPath, prefixExists, prefixDriveRoot, healPrefix, MAIN }