This commit is contained in:
2026-09-29 09:40:37 +03:00
parent 441021b9a6
commit 6567e731d1
34 changed files with 57 additions and 709 deletions
+2 -14
View File
@@ -24,7 +24,7 @@ constexpr auto kExecutable = "java";
const QString kMetaFile = QStringLiteral("runtime.json");
} // namespace
}
QString javaKindKey(JavaRuntimeKind kind)
{
@@ -65,7 +65,6 @@ QString JavaRuntimeStore::sanitizeId(const QString &id)
const bool safe = ch.isLetterOrNumber() || ch == u'.' || ch == u'-' || ch == u'_';
out += safe ? ch : u'_';
}
// Точки в начале превратили бы папку в скрытую, а «..» — в путь наружу.
while (out.startsWith(u'.'))
out.remove(0, 1);
return out;
@@ -84,8 +83,6 @@ QString JavaRuntimeStore::locateBinary(const QString &rootDir)
if (rootDir.isEmpty() || !QDir(rootDir).exists())
return {};
// Кандидатов бывает несколько: в JDK рядом с bin/java лежит ещё и
// jre/bin/java. Берём самый короткий путь — это корневой интерпретатор.
QString best;
QDirIterator it(rootDir, QStringList{QString::fromLatin1(kExecutable)},
QDir::Files, QDirIterator::Subdirectories);
@@ -119,8 +116,6 @@ std::optional<InstalledJavaRuntime> JavaRuntimeStore::find(const QString &id)
runtime.version = object.value(QStringLiteral("version")).toString();
runtime.size = static_cast<qint64>(object.value(QStringLiteral("size")).toDouble());
// Путь хранится относительным: папку лаунчера могли перенести вместе с
// профилем пользователя, а абсолютный путь этого не переживает.
const QString relative = object.value(QStringLiteral("javaPath")).toString();
runtime.javaPath = relative.isEmpty() ? QString() : QDir(dir).absoluteFilePath(relative);
@@ -185,8 +180,6 @@ bool JavaRuntimeStore::writeMeta(const InstalledJavaRuntime &runtime, QString *e
bool JavaRuntimeStore::remove(const QString &id, QString *error)
{
const QString dir = dirFor(id);
// Удаляем только внутри <root>/java: sanitizeId не пропустит «..», но
// проверка стоит одной строки, а цена ошибки — чужая папка.
if (dir.isEmpty() || !dir.startsWith(LauncherPaths::javaDir() + u'/')) {
if (error)
*error = Loc::text("java.error.invalidRuntimeId");
@@ -208,9 +201,6 @@ int JavaRequirement::minimumFor(const QString &minecraftVersionId)
if (id.isEmpty())
return 0;
// Снапшоты — YYwWWa. Ровных границ по неделям нет, но год отвечает на
// вопрос «какая Java» точнее, чем ничего: 1.17 (Java 16) вышла в 21-м году,
// 1.18 (Java 17) в конце того же года, 1.20.5 (Java 21) — в 24-м.
static const QRegularExpression snapshot(QStringLiteral("^(\\d{2})w\\d{2}[a-z]$"));
const QRegularExpressionMatch snapshotMatch = snapshot.match(id);
if (snapshotMatch.hasMatch()) {
@@ -224,18 +214,16 @@ int JavaRequirement::minimumFor(const QString &minecraftVersionId)
return 8;
}
// Релизы и их пре-релизы: 1.20.5, 1.21, 1.21.4-pre1, 26.2.
static const QRegularExpression release(
QStringLiteral("^(\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?"));
const QRegularExpressionMatch releaseMatch = release.match(id);
if (!releaseMatch.hasMatch())
return 8; // a1.2.6, b1.7.3, rd-132211 и прочая доисторическая ваниль
return 8;
const int epoch = releaseMatch.captured(1).toInt();
const int major = releaseMatch.captured(2).toInt();
const int patch = releaseMatch.captured(3).toInt();
// Нумерация после 1.21.x пошла по годам (26.2) — это заведомо новее 1.20.5.
if (epoch != 1)
return 21;
if (major >= 21)