Skip to content

Commit 451776f

Browse files
authored
Merge branch 'main' into soms
2 parents 7029921 + afbf567 commit 451776f

76 files changed

Lines changed: 1834 additions & 787 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/gradle.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,9 @@ jobs:
4848
name: HMCL-${{ env.SHORT_SHA }}-sh
4949
path: HMCL/build/libs/HMCL-*.sh
5050
archive: false
51+
- name: Upload DEB
52+
uses: actions/upload-artifact@v7
53+
with:
54+
name: HMCL-${{ env.SHORT_SHA }}-deb
55+
path: HMCL/build/libs/HMCL-*.deb
56+
archive: false

.github/workflows/release.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,20 @@ jobs:
4646
wget "$HMCL_CI_DOWNLOAD_BASE_URI/HMCL-$HMCL_VERSION.jar.sha256"
4747
wget "$HMCL_CI_DOWNLOAD_BASE_URI/HMCL-$HMCL_VERSION.sh"
4848
wget "$HMCL_CI_DOWNLOAD_BASE_URI/HMCL-$HMCL_VERSION.sh.sha256"
49+
wget "$HMCL_CI_DOWNLOAD_BASE_URI/HMCL-$HMCL_VERSION.deb"
50+
wget "$HMCL_CI_DOWNLOAD_BASE_URI/HMCL-$HMCL_VERSION.deb.sha256"
4951
- name: Verify artifacts
5052
if: ${{ env.continue == 'true' }}
5153
run: |
5254
export JAR_SHA256=$(cat HMCL-$HMCL_VERSION.jar.sha256 | tr -d '\n')
5355
export EXE_SHA256=$(cat HMCL-$HMCL_VERSION.exe.sha256 | tr -d '\n')
5456
export SH_SHA256=$(cat HMCL-$HMCL_VERSION.sh.sha256 | tr -d '\n')
57+
export DEB_SHA256=$(cat HMCL-$HMCL_VERSION.deb.sha256 | tr -d '\n')
5558
5659
echo "$JAR_SHA256 HMCL-$HMCL_VERSION.jar" | sha256sum -c
5760
echo "$EXE_SHA256 HMCL-$HMCL_VERSION.exe" | sha256sum -c
5861
echo "$SH_SHA256 HMCL-$HMCL_VERSION.sh" | sha256sum -c
62+
echo "$DEB_SHA256 HMCL-$HMCL_VERSION.deb" | sha256sum -c
5963
- name: Generate release note
6064
if: ${{ env.continue == 'true' }}
6165
run: |
@@ -67,6 +71,7 @@ jobs:
6771
echo "| [HMCL-$HMCL_VERSION.exe]($GH_DOWNLOAD_BASE_URL/v$HMCL_VERSION/HMCL-$HMCL_VERSION.exe) | \`$(cat HMCL-$HMCL_VERSION.exe.sha256)\` |" >> RELEASE_NOTE
6872
echo "| [HMCL-$HMCL_VERSION.jar]($GH_DOWNLOAD_BASE_URL/v$HMCL_VERSION/HMCL-$HMCL_VERSION.jar) | \`$(cat HMCL-$HMCL_VERSION.jar.sha256)\` |" >> RELEASE_NOTE
6973
echo "| [HMCL-$HMCL_VERSION.sh]($GH_DOWNLOAD_BASE_URL/v$HMCL_VERSION/HMCL-$HMCL_VERSION.sh) | \`$(cat HMCL-$HMCL_VERSION.sh.sha256)\` |" >> RELEASE_NOTE
74+
echo "| [HMCL-$HMCL_VERSION.deb]($GH_DOWNLOAD_BASE_URL/v$HMCL_VERSION/HMCL-$HMCL_VERSION.deb) | \`$(cat HMCL-$HMCL_VERSION.deb.sha256)\` |" >> RELEASE_NOTE
7075
7176
# CNB Release Note
7277
echo "[更新日志](https://docs.hmcl.net/changelog/${{ matrix.channel }}.html#HMCL-$HMCL_VERSION)" >> CNB_RELEASE_NOTE
@@ -76,6 +81,8 @@ jobs:
7681
echo "| [HMCL-$HMCL_VERSION.exe]($CNB_DOWNLOAD_BASE_URL/v$HMCL_VERSION/HMCL-$HMCL_VERSION.exe) | \`$(cat HMCL-$HMCL_VERSION.exe.sha256)\` |" >> CNB_RELEASE_NOTE
7782
echo "| [HMCL-$HMCL_VERSION.jar]($CNB_DOWNLOAD_BASE_URL/v$HMCL_VERSION/HMCL-$HMCL_VERSION.jar) | \`$(cat HMCL-$HMCL_VERSION.jar.sha256)\` |" >> CNB_RELEASE_NOTE
7883
echo "| [HMCL-$HMCL_VERSION.sh]($CNB_DOWNLOAD_BASE_URL/v$HMCL_VERSION/HMCL-$HMCL_VERSION.sh) | \`$(cat HMCL-$HMCL_VERSION.sh.sha256)\` |" >> CNB_RELEASE_NOTE
84+
echo "| [HMCL-$HMCL_VERSION.deb]($CNB_DOWNLOAD_BASE_URL/v$HMCL_VERSION/HMCL-$HMCL_VERSION.deb) | \`$(cat HMCL-$HMCL_VERSION.deb.sha256)\` |" >> CNB_RELEASE_NOTE
85+
7986
env:
8087
GH_DOWNLOAD_BASE_URL: https://github.com/${{ github.repository }}/releases/download
8188
CNB_DOWNLOAD_BASE_URL: https://cnb.cool/HMCL-dev/HMCL/-/releases/download
@@ -86,6 +93,7 @@ jobs:
8693
"HMCL-${{ env.HMCL_VERSION }}.exe" \
8794
"HMCL-${{ env.HMCL_VERSION }}.jar" \
8895
"HMCL-${{ env.HMCL_VERSION }}.sh" \
96+
"HMCL-${{ env.HMCL_VERSION }}.deb" \
8997
--target "${{ env.HMCL_COMMIT_SHA }}" \
9098
--title "${{ env.HMCL_TAG_NAME }}" \
9199
--notes-file RELEASE_NOTE \
@@ -120,6 +128,9 @@ jobs:
120128
121129
echo "Uploading HMCL-$HMCL_VERSION.sh"
122130
~/go/bin/git-cnb release asset-upload --repo="$CNB_REPO" --tag-name "$HMCL_TAG_NAME" --file-name "HMCL-$HMCL_VERSION.sh"
131+
132+
echo "Uploading HMCL-$HMCL_VERSION.deb"
133+
~/go/bin/git-cnb release asset-upload --repo="$CNB_REPO" --tag-name "$HMCL_TAG_NAME" --file-name "HMCL-$HMCL_VERSION.deb"
123134
env:
124135
CNB_TOKEN: ${{ secrets.CNB_SYNC_TOKEN }}
125136
CNB_REPO: HMCL-dev/HMCL

HMCL/build.gradle.kts

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import org.jackhuang.hmcl.gradle.l10n.CreateLanguageList
66
import org.jackhuang.hmcl.gradle.l10n.CreateLocaleNamesResourceBundle
77
import org.jackhuang.hmcl.gradle.l10n.UpsideDownTranslate
88
import org.jackhuang.hmcl.gradle.mod.ParseModDataTask
9+
import org.jackhuang.hmcl.gradle.pack.CreateDeb
10+
import org.jackhuang.hmcl.gradle.pack.ReleaseType
911
import org.jackhuang.hmcl.gradle.utils.PropertiesUtils
1012
import java.net.URI
1113
import java.nio.file.FileSystems
@@ -251,20 +253,22 @@ tasks.processResources {
251253
}
252254
}
253255

256+
fun artifactFile(ext: String) = jarPath.resolveSibling(jarPath.nameWithoutExtension + '.' + ext)
257+
254258
val makeExecutables by tasks.registering {
255259
val extensions = listOf("exe", "sh")
256260

257261
dependsOn(tasks.jar)
258262

259263
inputs.file(jarPath)
260-
outputs.files(extensions.map { File(jarPath.parentFile, jarPath.nameWithoutExtension + '.' + it) })
264+
outputs.files(extensions.map { artifactFile(it) })
261265

262266
doLast {
263267
val jarContent = jarPath.readBytes()
264268

265269
ZipFile(jarPath).use { zipFile ->
266270
for (extension in extensions) {
267-
val output = File(jarPath.parentFile, jarPath.nameWithoutExtension + '.' + extension)
271+
val output = artifactFile(extension)
268272
val entry = zipFile.getEntry("assets/HMCLauncher.$extension")
269273
?: throw GradleException("HMCLauncher.$extension not found")
270274

@@ -279,8 +283,31 @@ val makeExecutables by tasks.registering {
279283
}
280284
}
281285

286+
val makeDeb by tasks.registering(CreateDeb::class) {
287+
dependsOn(makeExecutables)
288+
289+
val debFile = layout.file(provider { artifactFile("deb") })
290+
291+
val debChannel = when (versionType) {
292+
"stable" -> ReleaseType.STABLE
293+
"dev" -> ReleaseType.DEVELOPMENT
294+
else -> ReleaseType.NIGHTLY
295+
}
296+
297+
version.set(project.version.toString())
298+
releaseType.set(debChannel)
299+
appShFile.set(layout.file(provider { artifactFile("sh") }))
300+
iconFile.set(layout.projectDirectory.file("image/hmcl.png"))
301+
outputFile.set(debFile)
302+
303+
doLast {
304+
createChecksum(debFile.get().asFile)
305+
}
306+
}
307+
282308
tasks.build {
283309
dependsOn(makeExecutables)
310+
dependsOn(makeDeb)
284311
}
285312

286313
fun parseToolOptions(options: String?): MutableList<String> {
@@ -377,12 +404,14 @@ val upgradeTerracottaConfig = tasks.register<TerracottaConfigUpgradeTask>("upgra
377404
val destination = layout.projectDirectory.file("src/main/resources/assets/terracotta.json")
378405
val source = layout.projectDirectory.file("terracotta-template.json");
379406

380-
classifiers.set(listOf(
381-
"windows-x86_64", "windows-arm64",
382-
"macos-x86_64", "macos-arm64",
383-
"linux-x86_64", "linux-arm64", "linux-loongarch64", "linux-riscv64",
384-
"freebsd-x86_64"
385-
))
407+
classifiers.set(
408+
listOf(
409+
"windows-x86_64", "windows-arm64",
410+
"macos-x86_64", "macos-arm64",
411+
"linux-x86_64", "linux-arm64", "linux-loongarch64", "linux-riscv64",
412+
"freebsd-x86_64"
413+
)
414+
)
386415

387416
version.set(libs.versions.terracotta)
388417
downloadURL.set($$"https://github.com/burningtnt/Terracotta/releases/download/v${version}/terracotta-${version}-${classifier}-pkg.tar.gz")

HMCL/image/8mi-tech.png

10 KB
Loading

HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,7 @@
4242
import org.jackhuang.hmcl.theme.Themes;
4343
import org.jackhuang.hmcl.upgrade.UpdateChecker;
4444
import org.jackhuang.hmcl.upgrade.UpdateHandler;
45-
import org.jackhuang.hmcl.util.CrashReporter;
46-
import org.jackhuang.hmcl.util.FileSaver;
47-
import org.jackhuang.hmcl.util.Lang;
48-
import org.jackhuang.hmcl.util.StringUtils;
45+
import org.jackhuang.hmcl.util.*;
4946
import org.jackhuang.hmcl.util.io.JarUtils;
5047
import org.jackhuang.hmcl.util.platform.*;
5148

@@ -347,6 +344,8 @@ public static void main(String[] args) {
347344
LOG.info("XDG Current Desktop: " + System.getenv("XDG_CURRENT_DESKTOP"));
348345
}
349346

347+
LOG.info("Zlib Compatible: " + ZlibUtils.IS_ZLIB_COMPATIBLE);
348+
350349
Lang.thread(SystemInfo::initialize, "Detection System Information", true);
351350

352351
launch(Launcher.class, args);

HMCL/src/main/java/org/jackhuang/hmcl/Metadata.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ private Metadata() {
4545
public static final int RECOMMENDED_JAVA_VERSION = 21;
4646

4747
public static final String PUBLISH_URL = "https://hmcl.huangyuhui.net";
48-
public static final String ABOUT_URL = PUBLISH_URL + "/about";
4948
public static final String DOWNLOAD_URL = PUBLISH_URL + "/download";
5049
public static final String HMCL_UPDATE_URL = System.getProperty("hmcl.update_source.override", PUBLISH_URL + "/api/update_link");
5150
public static final String MANUAL_UPDATE_URL = "https://github.com/HMCL-dev/HMCL/releases";

HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,9 @@ public static String localizeErrorMessage(Exception exception) {
468468
}
469469
} else if (exception instanceof MicrosoftService.XBox400Exception) {
470470
return i18n("account.methods.microsoft.error.wrong_verify_method");
471-
} else if (exception instanceof MicrosoftService.NoMinecraftJavaEditionProfileException) {
471+
} else if (exception instanceof MicrosoftService.MinecraftJavaEditionLicenseNotFoundException) {
472+
return i18n("account.methods.microsoft.error.no_license");
473+
} else if (exception instanceof MicrosoftService.MinecraftJavaEditionProfileNotFoundException) {
472474
return i18n("account.methods.microsoft.error.no_character");
473475
} else if (exception instanceof MicrosoftService.NoXuiException) {
474476
return i18n("account.methods.microsoft.error.add_family");

HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionIconType.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public enum VersionIconType {
4545
public static VersionIconType getIconType(ModLoaderType modLoaderType) {
4646
return switch (modLoaderType) {
4747
case FORGE -> VersionIconType.FORGE;
48-
case NEO_FORGED -> VersionIconType.NEO_FORGE;
48+
case NEO_FORGE -> VersionIconType.NEO_FORGE;
4949
case FABRIC -> VersionIconType.FABRIC;
5050
case QUILT -> VersionIconType.QUILT;
5151
case LITE_LOADER -> VersionIconType.CHICKEN;

HMCL/src/main/java/org/jackhuang/hmcl/terracotta/TerracottaBundle.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,15 @@ protected Context getContext(HttpResponse<?> response, boolean checkETag, String
7171
return new Context() {
7272
@Override
7373
public void withResult(boolean success) {
74+
super.withResult(success);
7475
delegate.withResult(success);
7576
}
7677

78+
@Override
79+
public void reset() throws IOException {
80+
delegate.reset();
81+
}
82+
7783
@Override
7884
public void write(byte[] buffer, int offset, int len) throws IOException {
7985
context.checkCancellation();
@@ -113,7 +119,7 @@ public Task<?> install(Path pkg) {
113119
throw new ArtifactMalformedException(String.format("Expecting %s file in terracotta bundle.", file));
114120
}
115121

116-
MessageDigest digest = DigestUtils.getDigest(check.getAlgorithm());
122+
MessageDigest digest = DigestUtils.getDigest(check.algorithm());
117123
try (
118124
InputStream is = tree.getInputStream(archive);
119125
OutputStream os = new DigestOutputStream(Files.newOutputStream(path), digest)
@@ -122,8 +128,8 @@ public Task<?> install(Path pkg) {
122128
}
123129

124130
String hash = HexFormat.of().formatHex(digest.digest());
125-
if (!check.getChecksum().equalsIgnoreCase(hash)) {
126-
throw new ChecksumMismatchException(check.getAlgorithm(), check.getChecksum(), hash);
131+
if (!check.checksum().equalsIgnoreCase(hash)) {
132+
throw new ChecksumMismatchException(check.algorithm(), check.checksum(), hash);
127133
}
128134

129135
switch (OperatingSystem.CURRENT_OS) {
@@ -172,7 +178,7 @@ private boolean isLocalBundleValid() throws IOException { // FIXME: Make control
172178
return false;
173179
}
174180

175-
MessageDigest digest = DigestUtils.getDigest(check.getAlgorithm());
181+
MessageDigest digest = DigestUtils.getDigest(check.algorithm());
176182
try (InputStream is = new DigestInputStream(Files.newInputStream(path), digest)) {
177183
int n;
178184
while ((n = is.read(buffer)) >= 0) {
@@ -182,7 +188,7 @@ private boolean isLocalBundleValid() throws IOException { // FIXME: Make control
182188
}
183189
}
184190
}
185-
if (!HexFormat.of().formatHex(digest.digest()).equalsIgnoreCase(check.getChecksum())) {
191+
if (!HexFormat.of().formatHex(digest.digest()).equalsIgnoreCase(check.checksum())) {
186192
return false;
187193
}
188194
}

HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
import org.jackhuang.hmcl.util.io.FileUtils;
7171
import org.jackhuang.hmcl.util.platform.Architecture;
7272
import org.jackhuang.hmcl.util.platform.OperatingSystem;
73+
import org.jetbrains.annotations.NotNull;
7374
import org.jetbrains.annotations.Nullable;
7475

7576
import java.io.IOException;
@@ -594,15 +595,15 @@ public static CompletableFuture<List<PromptDialogPane.Builder.Question<?>>> prom
594595
return pane.getCompletableFuture();
595596
}
596597

597-
public static TaskExecutorDialogPane taskDialog(TaskExecutor executor, String title, TaskCancellationAction onCancel) {
598+
public static TaskExecutorDialogPane taskDialog(TaskExecutor executor, String title, @NotNull TaskCancellationAction onCancel) {
598599
TaskExecutorDialogPane pane = new TaskExecutorDialogPane(onCancel);
599600
pane.setTitle(title);
600601
pane.setExecutor(executor);
601602
dialog(pane);
602603
return pane;
603604
}
604605

605-
public static TaskExecutorDialogPane taskDialog(Task<?> task, String title, TaskCancellationAction onCancel) {
606+
public static TaskExecutorDialogPane taskDialog(Task<?> task, String title, @NotNull TaskCancellationAction onCancel) {
606607
TaskExecutor executor = task.executor();
607608
TaskExecutorDialogPane pane = taskDialog(executor, title, onCancel);
608609
executor.start();

0 commit comments

Comments
 (0)