added library reordering & prefix rename
This commit is contained in:
parent
f8ce9a9945
commit
aca9f839e3
13 changed files with 374 additions and 20 deletions
|
|
@ -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 }
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue