Files
galeon 0dd6bef715
tests / windows (push) Skipped
tests / macos (push) Skipped
tests / package-smoke-linux (push) Skipped
tests / package-smoke-windows (push) Skipped
tests / package-smoke-macos (push) Skipped
tests / linux (push) Successful in 1m59s
test fixes
Signed-off-by: galeon <dertiellis@gmail.com>
2026-10-13 08:51:07 +03:00

5.2 KiB

launcherpaths.h

launcherpaths.h, launcherpaths.cpp

Все пути к данным лаунчера. Пространство имён LauncherPaths из свободных функций, состояния нет: каждая функция просто собирает строку.

Данные лаунчера лежат в папке BiLauncher рядом со стандартной папкой игры, а не в системном каталоге данных приложения. QStandardPaths не используется, поэтому имя приложения и организации из main.cpp на эти пути не влияют.

Где что лежит

containerDir() — папка, в которой живут и игра, и лаунчер:

ОС containerDir() папка игры по умолчанию rootDir()
Windows %USERPROFILE%/AppData/Roaming .minecraft BiLauncher
macOS ~/Library/Application Support minecraft (без точки, как у официального лаунчера) BiLauncher
Linux ~ .minecraft BiLauncher

На Linux папка лаунчера получается ~/BiLauncher, без точки, то есть видимая.

BILAUNCHER_HOME

homeOverride() читает переменную окружения BILAUNCHER_HOME. Если в ней абсолютный путь, он заменяет домашнюю папку (~ и %USERPROFILE% в таблице выше) для всех путей лаунчера, включая папку игры по умолчанию. Пустое или относительное значение не учитывается. Остальной Qt (QDir::homePath(), QStandardPaths) эту переменную не видит.

Переменная нужна тестам и дымовой проверке на Windows: там QDir::homePath() спрашивает профиль у системы и USERPROFILE игнорирует, так что иначе их нельзя увести из настоящего %APPDATA%\BiLauncher. Новых возможностей она не даёт: кто управляет окружением процесса, на Linux и macOS и так подменит HOME. Чтобы случайно оставленную переменную было видно, main.cpp при старте пишет в лог предупреждение с итоговой папкой лаунчера.

Внутри rootDir():

BiLauncher/
├── settings.json          settingsFile()
├── profiles.json          profilesFile()
├── customBuilds.json      customBuildsFile()
├── versions.json          legacyCustomBuildsFile() — старое имя, читается только при миграции
├── builds/                buildStorageDir()
│   ├── index.json         журнал BuildSwitcher
│   └── <id>/              buildDir(id): архив сборки, скачанный пак
│       └── season.json    seasonalStateFile(id)
├── java/                  javaDir(): скачанные сборки Java, каждая в <id>/
├── runtime/               runtimeDir(): authlib-injector.jar
└── cache/                 cacheDir(): всё, что можно удалить без потерь
    ├── version_manifest.json   versionManifestFile()
    ├── java_runtimes.json      javaCatalogFile()
    ├── seasonal_builds.json    seasonalCatalogFile()
    ├── loader_<ключ>.json      loaderCacheFile(key)
    ├── loaders/                loaderDownloadDir(): installer.jar и журналы установщиков
    └── java/                   javaDownloadDir(): архивы Temurin до распаковки

Папка игры задаётся в настройках (gameDir). defaultMinecraftDir() используется, только если там пусто.

ensureRootExists(&error)

Создаёт rootDir, runtime, cache, cache/loaders, builds, java и cache/java, а затем проверяет, что каждая из них действительно папка и в неё можно писать. mkpath возвращает true и для существующей папки без прав на запись, и тогда, когда на месте папки лежит файл. Без этой проверки сохранения потом молча не работали бы.

Вызывается при старте бэкенда, перед каждой записью JSON-файлов бэкенда, перед записью кэшей каталогов и перед установками. Остальные функции только собирают строки и ошибиться не могут.

launcherpaths.cpp подключает localization.h ради текста ошибки, заголовок зависит только от QString.


При создании этого документа использовался ИИ.