mirror of
https://github.com/packwiz/packwiz-installer.git
synced 2025-10-17 16:34:31 +02:00
Compare commits
6 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
b2421cfea7 | ||
|
6f05ac6bf0 | ||
|
7b6daaf7e5 | ||
|
758385c225 | ||
|
304fb802ed | ||
|
cc063773d8 |
27
.github/workflows/pr.yml
vendored
Normal file
27
.github/workflows/pr.yml
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
name: Java Gradle Build
|
||||
|
||||
on:
|
||||
pull_request
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Set up JDK 8
|
||||
uses: actions/setup-java@v2
|
||||
with:
|
||||
java-version: '8'
|
||||
distribution: 'temurin'
|
||||
cache: gradle
|
||||
- name: Build with Gradle
|
||||
run: ./gradlew build
|
||||
- name: Cleanup Gradle Cache
|
||||
# Remove some files from the Gradle cache, so they aren't cached by GitHub Actions.
|
||||
# Restoring these files from a GitHub Actions cache might cause problems for future builds.
|
||||
run: |
|
||||
rm -f ~/.gradle/caches/modules-2/modules-2.lock
|
||||
rm -f ~/.gradle/caches/modules-2/gc.properties
|
5
.github/workflows/snapshot.yml
vendored
5
.github/workflows/snapshot.yml
vendored
@@ -1,6 +1,9 @@
|
||||
name: Java Gradle Snapshot
|
||||
|
||||
on: ["push", "pull_request"]
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'main'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
@@ -109,9 +109,9 @@ internal class DownloadTask private constructor(val metadata: IndexFile.File, va
|
||||
cachedFile.optionValue = linkedFile.option.defaultValue
|
||||
}
|
||||
}
|
||||
cachedFile.isOptional = isOptional
|
||||
cachedFile.onlyOtherSide = !correctSide()
|
||||
}
|
||||
cachedFile.isOptional = isOptional
|
||||
cachedFile.onlyOtherSide = !correctSide()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -23,7 +23,6 @@ import link.infra.packwiz.installer.ui.IUserInterface.ExceptionListResult
|
||||
import link.infra.packwiz.installer.ui.data.InstallProgress
|
||||
import link.infra.packwiz.installer.util.Log
|
||||
import okio.buffer
|
||||
import java.io.FileWriter
|
||||
import java.io.IOException
|
||||
import java.io.InputStreamReader
|
||||
import java.nio.charset.StandardCharsets
|
||||
@@ -197,7 +196,7 @@ class UpdateManager internal constructor(private val opts: Options, val ui: IUse
|
||||
|
||||
manifest.cachedSide = opts.side
|
||||
try {
|
||||
FileWriter(opts.manifestFile.nioPath.toFile()).use { writer -> gson.toJson(manifest, writer) }
|
||||
Files.newBufferedWriter(opts.manifestFile.nioPath, StandardCharsets.UTF_8).use { writer -> gson.toJson(manifest, writer) }
|
||||
} catch (e: IOException) {
|
||||
ui.showErrorAndExit("Failed to save local manifest file", e)
|
||||
}
|
||||
|
@@ -49,14 +49,15 @@ private val APIKey = "JDJhJDEwJHNBWVhqblU1N0EzSmpzcmJYM3JVdk92UWk2NHBLS3BnQ2VpbG
|
||||
@Throws(JsonSyntaxException::class, JsonIOException::class)
|
||||
fun resolveCfMetadata(mods: List<IndexFile.File>, packFolder: PackwizFilePath, clientHolder: ClientHolder): List<ExceptionDetails> {
|
||||
val failures = mutableListOf<ExceptionDetails>()
|
||||
val fileIdMap = mutableMapOf<Int, IndexFile.File>()
|
||||
val fileIdMap = mutableMapOf<Int, List<IndexFile.File>>()
|
||||
|
||||
for (mod in mods) {
|
||||
if (!mod.linkedFile!!.update.contains("curseforge")) {
|
||||
failures.add(ExceptionDetails(mod.linkedFile!!.name, Exception("Failed to resolve CurseForge metadata: no CurseForge update section")))
|
||||
continue
|
||||
}
|
||||
fileIdMap[(mod.linkedFile!!.update["curseforge"] as CurseForgeUpdateData).fileId] = mod
|
||||
val fileId = (mod.linkedFile!!.update["curseforge"] as CurseForgeUpdateData).fileId
|
||||
fileIdMap[fileId] = (fileIdMap[fileId] ?: listOf()) + mod
|
||||
}
|
||||
|
||||
val reqData = GetFilesRequest(fileIdMap.keys.toList())
|
||||
@@ -77,7 +78,7 @@ fun resolveCfMetadata(mods: List<IndexFile.File>, packFolder: PackwizFilePath, c
|
||||
val resData = Gson().fromJson(res.body!!.charStream(), GetFilesResponse::class.java)
|
||||
res.closeQuietly()
|
||||
|
||||
val manualDownloadMods = mutableMapOf<Int, Pair<IndexFile.File, Int>>()
|
||||
val manualDownloadMods = mutableMapOf<Int, List<Int>>()
|
||||
for (file in resData.data) {
|
||||
if (!fileIdMap.contains(file.id)) {
|
||||
failures.add(ExceptionDetails(file.id.toString(),
|
||||
@@ -85,12 +86,14 @@ fun resolveCfMetadata(mods: List<IndexFile.File>, packFolder: PackwizFilePath, c
|
||||
continue
|
||||
}
|
||||
if (file.downloadUrl == null) {
|
||||
manualDownloadMods[file.modId] = Pair(fileIdMap[file.id]!!, file.id)
|
||||
manualDownloadMods[file.modId] = (manualDownloadMods[file.modId] ?: listOf()) + file.id
|
||||
continue
|
||||
}
|
||||
try {
|
||||
fileIdMap[file.id]!!.linkedFile!!.resolvedUpdateData["curseforge"] =
|
||||
HttpUrlPath(file.downloadUrl!!.toHttpUrl())
|
||||
for (indexFile in fileIdMap[file.id]!!) {
|
||||
indexFile.linkedFile!!.resolvedUpdateData["curseforge"] =
|
||||
HttpUrlPath(file.downloadUrl!!.toHttpUrl())
|
||||
}
|
||||
} catch (e: IllegalArgumentException) {
|
||||
failures.add(ExceptionDetails(file.id.toString(),
|
||||
Exception("Failed to parse URL: ${file.downloadUrl} for ID ${file.id}, Project ID ${file.modId}", e)))
|
||||
@@ -99,10 +102,13 @@ fun resolveCfMetadata(mods: List<IndexFile.File>, packFolder: PackwizFilePath, c
|
||||
|
||||
// Some file types don't show up in the API at all! (e.g. shaderpacks)
|
||||
// Add unresolved files to manualDownloadMods
|
||||
for ((fileId, file) in fileIdMap) {
|
||||
if (file.linkedFile != null) {
|
||||
if (file.linkedFile!!.resolvedUpdateData["curseforge"] == null) {
|
||||
manualDownloadMods[(file.linkedFile!!.update["curseforge"] as CurseForgeUpdateData).projectId] = Pair(file, fileId)
|
||||
for ((fileId, indexFiles) in fileIdMap) {
|
||||
for (file in indexFiles) {
|
||||
if (file.linkedFile != null) {
|
||||
if (file.linkedFile!!.resolvedUpdateData["curseforge"] == null) {
|
||||
val projectId = (file.linkedFile!!.update["curseforge"] as CurseForgeUpdateData).projectId
|
||||
manualDownloadMods[projectId] = (manualDownloadMods[projectId] ?: listOf()) + fileId
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -133,9 +139,19 @@ fun resolveCfMetadata(mods: List<IndexFile.File>, packFolder: PackwizFilePath, c
|
||||
continue
|
||||
}
|
||||
|
||||
val modFile = manualDownloadMods[mod.id]!!
|
||||
failures.add(ExceptionDetails(mod.name, Exception("This mod is excluded from the CurseForge API and must be downloaded manually.\n" +
|
||||
"Please go to ${mod.links?.websiteUrl}/files/${modFile.second} and save this file to ${modFile.first.destURI.rebase(packFolder).nioPath.absolute()}")))
|
||||
for (fileId in manualDownloadMods[mod.id]!!) {
|
||||
if (!fileIdMap.contains(fileId)) {
|
||||
failures.add(ExceptionDetails(mod.name,
|
||||
Exception("Failed to find file from result: file ID $fileId")))
|
||||
continue
|
||||
}
|
||||
|
||||
for (indexFile in fileIdMap[fileId]!!) {
|
||||
var modUrl = "${mod.links?.websiteUrl}/files/${fileId}"
|
||||
failures.add(ExceptionDetails(indexFile.name, Exception("This mod is excluded from the CurseForge API and must be downloaded manually.\n" +
|
||||
"Please go to ${modUrl} and save this file to ${indexFile.destURI.rebase(packFolder).nioPath.absolute()}"), modUrl))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -23,7 +23,10 @@ interface IUserInterface {
|
||||
|
||||
fun showCancellationDialog(): CancellationResult = CancellationResult.QUIT
|
||||
|
||||
fun showUpdateConfirmationDialog(oldVersions: List<Pair<String, String?>>, newVersions: List<Pair<String, String?>>): UpdateConfirmationResult = UpdateConfirmationResult.CANCELLED
|
||||
fun showUpdateConfirmationDialog(oldVersions: List<Pair<String, String?>>, newVersions: List<Pair<String, String?>>): UpdateConfirmationResult {
|
||||
// Always update metadata when using the CLI
|
||||
return UpdateConfirmationResult.UPDATE
|
||||
}
|
||||
|
||||
fun awaitOptionalButton(showCancel: Boolean, timeout: Long)
|
||||
|
||||
|
@@ -2,5 +2,6 @@ package link.infra.packwiz.installer.ui.data
|
||||
|
||||
data class ExceptionDetails(
|
||||
val name: String,
|
||||
val exception: Exception
|
||||
val exception: Exception,
|
||||
val modUrl: String? = null
|
||||
)
|
@@ -1,5 +1,6 @@
|
||||
package link.infra.packwiz.installer.ui.gui
|
||||
|
||||
import link.infra.packwiz.installer.util.Log
|
||||
import link.infra.packwiz.installer.ui.IUserInterface
|
||||
import link.infra.packwiz.installer.ui.data.ExceptionDetails
|
||||
import java.awt.BorderLayout
|
||||
@@ -24,6 +25,24 @@ class ExceptionListWindow(eList: List<ExceptionDetails>, future: CompletableFutu
|
||||
fun getExceptionAt(index: Int) = details[index].exception
|
||||
}
|
||||
|
||||
private fun openUrl(url: String) {
|
||||
try {
|
||||
if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) {
|
||||
Desktop.getDesktop().browse(URI(url))
|
||||
} else {
|
||||
val process = Runtime.getRuntime().exec(arrayOf("xdg-open", url));
|
||||
val exitValue = process.waitFor()
|
||||
if (exitValue > 0) {
|
||||
Log.warn("Failed to open $url: xdg-open exited with code $exitValue")
|
||||
}
|
||||
}
|
||||
} catch (e: IOException) {
|
||||
Log.warn("Failed to open $url", e)
|
||||
} catch (e: URISyntaxException) {
|
||||
Log.warn("Failed to open $url", e)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the dialog.
|
||||
*/
|
||||
@@ -112,6 +131,19 @@ class ExceptionListWindow(eList: List<ExceptionDetails>, future: CompletableFutu
|
||||
this@ExceptionListWindow.dispose()
|
||||
}
|
||||
})
|
||||
|
||||
val missingMods = eList.filter { it.modUrl != null }.map { it.modUrl!! }.toSet()
|
||||
|
||||
if (!missingMods.isEmpty()) {
|
||||
add(JButton("Open missing mods").apply {
|
||||
toolTipText = "Open missing mods in your browser"
|
||||
addActionListener {
|
||||
missingMods.forEach {
|
||||
openUrl(it)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}, BorderLayout.EAST)
|
||||
|
||||
// Errored label
|
||||
@@ -122,16 +154,8 @@ class ExceptionListWindow(eList: List<ExceptionDetails>, future: CompletableFutu
|
||||
// Left buttons
|
||||
add(JPanel().apply {
|
||||
add(JButton("Report issue").apply {
|
||||
if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) {
|
||||
addActionListener {
|
||||
try {
|
||||
Desktop.getDesktop().browse(URI("https://github.com/packwiz/packwiz-installer/issues/new"))
|
||||
} catch (e: IOException) {
|
||||
// lol the button just won't work i guess
|
||||
} catch (e: URISyntaxException) {}
|
||||
}
|
||||
} else {
|
||||
isEnabled = false
|
||||
addActionListener {
|
||||
openUrl("https://github.com/packwiz/packwiz-installer/issues/new")
|
||||
}
|
||||
})
|
||||
}, BorderLayout.WEST)
|
||||
|
Reference in New Issue
Block a user