diff --git a/src/backend/components/migration/index.ts b/src/backend/components/migration/index.ts index 6f9f0cf34f..e896b81693 100644 --- a/src/backend/components/migration/index.ts +++ b/src/backend/components/migration/index.ts @@ -1,6 +1,8 @@ import { TypeCheckedStoreBackend } from '../../electron_store' import { logError, logInfo } from '../../logger/logger' +import { LegendaryGlobalConfigFolderMigration } from './migrations/legendary' + import type { TypeCheckedStore } from 'common/types/electron_store' export interface Migration { @@ -61,8 +63,7 @@ export default class MigrationComponent { } private getAllMigrations(): Migration[] { - // TODO: Actually add migrations - return [] + return [new LegendaryGlobalConfigFolderMigration()] } private readonly migrationsStore: TypeCheckedStore<'migrationsStore'> diff --git a/src/backend/components/migration/migrations/legendary.ts b/src/backend/components/migration/migrations/legendary.ts new file mode 100644 index 0000000000..4d85c418d0 --- /dev/null +++ b/src/backend/components/migration/migrations/legendary.ts @@ -0,0 +1,35 @@ +import { app } from 'electron' +import { type PathLike } from 'fs' +import { access, cp, mkdir } from 'fs/promises' +import { join } from 'path' + +import { isLinux, legendaryConfigPath, userHome } from 'backend/constants' + +import type { Migration } from '..' + +const exists = async (path: PathLike) => + access(path).then( + () => true, + () => false + ) + +export class LegendaryGlobalConfigFolderMigration implements Migration { + identifier = 'legendary-move-global-config-folder' + async run(): Promise { + const hasHeroicSpecificConfig = await exists(legendaryConfigPath) + // Don't overwrite existing configuration + if (hasHeroicSpecificConfig) return true + + const globalLegendaryConfig = isLinux + ? join(app.getPath('appData'), 'legendary') + : join(userHome, '.config', 'legendary') + + const hasGlobalConfig = await exists(globalLegendaryConfig) + // Nothing to migrate + if (!hasGlobalConfig) return true + + await mkdir(legendaryConfigPath, { recursive: true }) + await cp(globalLegendaryConfig, legendaryConfigPath, { recursive: true }) + return true + } +} diff --git a/src/backend/storeManagers/legendary/library.ts b/src/backend/storeManagers/legendary/library.ts index 33247bfdc1..36a72f79c9 100644 --- a/src/backend/storeManagers/legendary/library.ts +++ b/src/backend/storeManagers/legendary/library.ts @@ -30,8 +30,6 @@ import { legendaryConfigPath, legendaryLogFile, legendaryMetadata, - isLinux, - userHome, isWindows } from '../../constants' import { @@ -50,8 +48,6 @@ import { callRunner } from '../../launcher' import { dirname, join } from 'path' import { isOnline } from 'backend/online_monitor' import { update } from './games' -import { app } from 'electron' -import { copySync } from 'fs-extra' import { LegendaryCommand } from './commands' import { LegendaryAppName, LegendaryPlatform } from './commands/base' import { Path } from 'backend/schemas' @@ -65,15 +61,6 @@ let installedGames: Map = new Map() const library: Map = new Map() export async function initLegendaryLibraryManager() { - // Migrate user data from global Legendary config if necessary - const globalLegendaryConfig = isLinux - ? join(app.getPath('appData'), 'legendary') - : join(userHome, '.config', 'legendary') - if (!existsSync(legendaryConfigPath) && existsSync(globalLegendaryConfig)) { - mkdirSync(legendaryConfigPath, { recursive: true }) - copySync(globalLegendaryConfig, legendaryConfigPath) - } - loadGamesInAccount() refreshInstalled() }