From c3011a3d148c7f766cdd2744dc27a169021d7a8f Mon Sep 17 00:00:00 2001 From: ci010 Date: Thu, 25 Jan 2024 14:52:24 +0800 Subject: [PATCH] fix: Handle the migrate no permission case --- xmcl-keystone-ui/locales/de.yaml | 5 +++++ xmcl-keystone-ui/locales/en.yaml | 3 +++ xmcl-keystone-ui/locales/es-ES.yaml | 3 +++ xmcl-keystone-ui/locales/fr.yaml | 1 + xmcl-keystone-ui/locales/ru.yaml | 3 +++ xmcl-keystone-ui/locales/uk.yaml | 3 +++ xmcl-keystone-ui/locales/zh-CN.yaml | 3 +++ xmcl-keystone-ui/src/views/SettingMigrationDialog.vue | 2 ++ xmcl-runtime-api/src/services/BaseService.ts | 7 +++++++ xmcl-runtime/base/BaseService.ts | 10 ++++++++-- 10 files changed, 38 insertions(+), 2 deletions(-) diff --git a/xmcl-keystone-ui/locales/de.yaml b/xmcl-keystone-ui/locales/de.yaml index d350f6bf8..746349e43 100644 --- a/xmcl-keystone-ui/locales/de.yaml +++ b/xmcl-keystone-ui/locales/de.yaml @@ -146,6 +146,11 @@ dataMigration: migrationDestinationIsNotEmptyDirectory: >- Das Übertragungsziel ist kein leeres Verzeichnis! Stellen Sie sicher, dass ein leeres Verzeichnis ausgewählt ist! + migrationNoPermission: >- + Keine Berechtigung zum Umbenennen des alten Verzeichnisses in ein neues + Verzeichnis! + + Bitte stellen Sie sicher, dass der Launcher Zugriff auf beide Orte hat! placeholder: Klicken Sie hier, um einen Katalog auszuwählen setRootCause: |- Sie verlieren Daten (Maps, Texture Packs, Mods), wenn Sie den diff --git a/xmcl-keystone-ui/locales/en.yaml b/xmcl-keystone-ui/locales/en.yaml index de2d4545f..ec1236eee 100644 --- a/xmcl-keystone-ui/locales/en.yaml +++ b/xmcl-keystone-ui/locales/en.yaml @@ -133,6 +133,9 @@ dataMigration: migrationDestinationIsNotEmptyDirectory: >- Migration destination is not an empty directory! Please make sure you select an empty directory! + migrationNoPermission: >- + No permission to rename the old directory to new directory! Please make sure + the launcher has access to both places! placeholder: Please click here to select directory setRootCause: >- You will loose your data (Maps, Resource Packs, Mods) if you close the diff --git a/xmcl-keystone-ui/locales/es-ES.yaml b/xmcl-keystone-ui/locales/es-ES.yaml index f88cf86bf..3e962c18b 100644 --- a/xmcl-keystone-ui/locales/es-ES.yaml +++ b/xmcl-keystone-ui/locales/es-ES.yaml @@ -172,6 +172,9 @@ dataMigration: migrationDestinationIsNotEmptyDirectory: >- ¡El destino de migración no es un directorio vacío! ¡Asegúrese de seleccionar un directorio vacío! + migrationNoPermission: |- + ¡No hay permiso para cambiar el nombre del directorio antiguo al nuevo! + ¡Asegúrese de que el lanzador tenga acceso a ambos lugares! placeholder: Haga clic aquí para seleccionar el directorio setRootCause: >- ¡Perderá sus datos (Mapas, Paquetes de Recursos, Mods) si cierra el Launcher diff --git a/xmcl-keystone-ui/locales/fr.yaml b/xmcl-keystone-ui/locales/fr.yaml index 2ce445fd7..d56725b7f 100644 --- a/xmcl-keystone-ui/locales/fr.yaml +++ b/xmcl-keystone-ui/locales/fr.yaml @@ -165,6 +165,7 @@ dataMigration: migrationDestinationIsNotEmptyDirectory: |- La destination de la migration n'est pas un répertoire vide ! Assurez-vous de sélectionner un répertoire vide ! + migrationNoPermission: "Aucune autorisation pour renommer l'ancien répertoire en nouveau répertoire\_! \nVeuillez vous assurer que le lanceur a accès aux deux endroits\_!" placeholder: Veuillez cliquer ici pour sélectionner le répertoire setRootCause: >- Vous perdrez vos données (cartes, packs de ressources, mods) si vous fermez diff --git a/xmcl-keystone-ui/locales/ru.yaml b/xmcl-keystone-ui/locales/ru.yaml index 9a958e84c..ce4847fbc 100644 --- a/xmcl-keystone-ui/locales/ru.yaml +++ b/xmcl-keystone-ui/locales/ru.yaml @@ -131,6 +131,9 @@ dataMigration: migrationDestinationIsNotEmptyDirectory: >- Место переноса не является пустым каталогом! Убедитесь что выбран пустой каталог! + migrationNoPermission: |- + Нет разрешения на переименование старого каталога в новый! + Пожалуйста, убедитесь, что программа запуска имеет доступ к обоим местам! placeholder: Нажмите здесь, чтобы выбрать каталог setRootCause: >- Вы потеряете свои данные (карты, текстурпаки, моды), если закроете лаунчер diff --git a/xmcl-keystone-ui/locales/uk.yaml b/xmcl-keystone-ui/locales/uk.yaml index 02f5e925f..af2229d4c 100644 --- a/xmcl-keystone-ui/locales/uk.yaml +++ b/xmcl-keystone-ui/locales/uk.yaml @@ -131,6 +131,9 @@ dataMigration: migrationDestinationIsNotEmptyDirectory: >- Місце перенесення не є пустим каталогом! Переконайтеся, що обрано порожній каталог! + migrationNoPermission: |- + Немає дозволу на перейменування старого каталогу на новий! + Переконайтеся, що програма запуску має доступ до обох місць! placeholder: Натисніть тут, щоб вибрати каталог setRootCause: |- Ви втратите дані (карти, текстурпаки, моди), якщо закриєте diff --git a/xmcl-keystone-ui/locales/zh-CN.yaml b/xmcl-keystone-ui/locales/zh-CN.yaml index a10d38139..ebdb8441a 100644 --- a/xmcl-keystone-ui/locales/zh-CN.yaml +++ b/xmcl-keystone-ui/locales/zh-CN.yaml @@ -174,6 +174,9 @@ dataMigration: directoryCriteriaHint: 请确保你选择的新的文件夹是一个文件夹。 migrationDestinationIsFile: 迁移目标地址是个文件而不是文件夹!请重新选择一个空的文件夹! migrationDestinationIsNotEmptyDirectory: 迁移目标不是一个空的文件夹!请确保你选择了一个空的文件夹! + migrationNoPermission: |- + 没有权限将旧目录重命名为新目录! + 请确保启动器可以访问这两个地方! placeholder: 点击来选择新的根目录 setRootCause: 请确保启动器在此过程中不被中断,不然您的数据可能丢失 setRootDescription: 这将改变启动器的存储根目录。 diff --git a/xmcl-keystone-ui/src/views/SettingMigrationDialog.vue b/xmcl-keystone-ui/src/views/SettingMigrationDialog.vue index 95c71ea9d..25b6af505 100644 --- a/xmcl-keystone-ui/src/views/SettingMigrationDialog.vue +++ b/xmcl-keystone-ui/src/views/SettingMigrationDialog.vue @@ -115,6 +115,8 @@ const { refresh: apply, refreshing: migrating } = useRefreshable(async () => { errorText.value = t('dataMigration.migrationDestinationIsFile') } else if (e.exception.type === 'migrationDestinationIsNotEmptyDirectory') { errorText.value = t('dataMigration.migrationDestinationIsNotEmptyDirectory') + } else if (e.exception.type === 'migrationNoPermission') { + errorText.value = t('dataMigration.migrationNoPermission') } else { errorText.value = t('dataMigration.unknownError') } diff --git a/xmcl-runtime-api/src/services/BaseService.ts b/xmcl-runtime-api/src/services/BaseService.ts index eb80c8005..c65ed1abb 100644 --- a/xmcl-runtime-api/src/services/BaseService.ts +++ b/xmcl-runtime-api/src/services/BaseService.ts @@ -106,6 +106,13 @@ export type BaseServiceExceptions = { */ type: 'migrationDestinationIsNotEmptyDirectory' destination: string +} | { + /** + * Throw rename has no permission. + */ + type: 'migrationNoPermission' + source: string + destination: string } export class BaseServiceException extends Exception { } diff --git a/xmcl-runtime/base/BaseService.ts b/xmcl-runtime/base/BaseService.ts index 7fe86001f..3cb878930 100644 --- a/xmcl-runtime/base/BaseService.ts +++ b/xmcl-runtime/base/BaseService.ts @@ -191,16 +191,22 @@ export class BaseService extends AbstractService implements IBaseService { await copyPassively(from, to) return } + if (e.code === 'EPERM') { + throw new BaseServiceException({ + type: 'migrationNoPermission', + source, + destination, + }) + } } throw e } } - await this.app.migrateRoot(destination) } catch (e) { this.error(new AnyError('MigrateRootError', `Fail to migrate with rename ${source} -> ${destination} with unknown error`, { cause: e })) - await this.app.migrateRoot(source).catch(() => { }) throw e } + await this.app.migrateRoot(destination) this.app.relaunch() this.app.quit()