a LOT sync fixes...
This commit is contained in:
parent
c0f6e802ed
commit
806e173e43
14 changed files with 1073 additions and 240 deletions
|
|
@ -6,20 +6,38 @@ const { DIRS, resolvePortablePath } = require('./paths')
|
|||
const { newGame, newGameId, addGame } = require('./library')
|
||||
const { extractIconFromExe } = require('./icons')
|
||||
const { listPrefixes, prefixDriveRoot } = require('./prefixes')
|
||||
const { rewireSymlinks } = require('./symlinks')
|
||||
|
||||
// Directories that typically hold installers/redistributables, not the game.
|
||||
const SKIPPED_DIRS = new Set(['redist', 'directx', '_commonredist', 'support', 'dotnet', 'vc'])
|
||||
|
||||
// A game folder has to arrive as it was: symlinks are recreated (copyFile
|
||||
// silently dropped them, so a linked asset or save folder vanished) and the
|
||||
// permission bits are carried over (copyFile writes 0644, killing scripts and
|
||||
// anything the game executes itself).
|
||||
function copyRecursive(src, dst, onProgress) {
|
||||
return fsp.readdir(src, { withFileTypes: true }).then(async entries => {
|
||||
await fsp.mkdir(dst, { recursive: true })
|
||||
for (const e of entries) {
|
||||
const s = path.join(src, e.name)
|
||||
const d = path.join(dst, e.name)
|
||||
if (e.isDirectory()) {
|
||||
if (e.isSymbolicLink()) {
|
||||
let target = null
|
||||
try {
|
||||
target = await fsp.readlink(s)
|
||||
} catch {}
|
||||
if (!target) continue
|
||||
try {
|
||||
await fsp.symlink(target, d)
|
||||
} catch {}
|
||||
if (onProgress) onProgress(s)
|
||||
} else if (e.isDirectory()) {
|
||||
await copyRecursive(s, d, onProgress)
|
||||
} else if (e.isFile()) {
|
||||
await fsp.copyFile(s, d)
|
||||
try {
|
||||
await fsp.chmod(d, (await fsp.stat(s)).mode & 0o777)
|
||||
} catch {}
|
||||
if (onProgress) onProgress(s)
|
||||
}
|
||||
}
|
||||
|
|
@ -47,6 +65,12 @@ async function importGame(srcDir, mode, onProgress) {
|
|||
if (mode === 'copy') await copyRecursive(srcDir, dst, onProgress)
|
||||
else await moveFolder(srcDir, dst, onProgress)
|
||||
workdir = dst
|
||||
// anything the game linked to INSIDE the launcher data (its own folder, an
|
||||
// icon, a shared prefix file) becomes a relative link, so the imported app
|
||||
// survives the launcher being moved - the same healing wine builds get
|
||||
try {
|
||||
await rewireSymlinks(dst, [DIRS.FILES])
|
||||
} catch {}
|
||||
}
|
||||
const exePath = (await findDefaultExe(workdir)) || preExe
|
||||
if (!exePath) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue