Skip to content

Commit 38b5a4f

Browse files
committed
Added a new mod metadata field to specify that a dependency comes from the same repo and branch as the dependent mod, to cut down on unnecessary (and possibly dangerous) branch-hopping.
1 parent e0d2c21 commit 38b5a4f

2 files changed

Lines changed: 32 additions & 23 deletions

File tree

src/main/java/io/github/openstarruler/launchpad/adapter/ModInstaller.kt

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -217,13 +217,13 @@ object ModInstaller {
217217
meta = Gson().fromJson(reader, RepoMetadata::class.java)
218218
if(modName != null && meta?.mods?.containsKey(modName) == true) {
219219
meta?.mods?.get(modName)?.dependencies?.forEach { dependency ->
220-
if (!installDependency(dependency, progressHandler, warningHandler))
220+
if (!installDependency(dependency, progressHandler, warningHandler, repo))
221221
warningHandler.handle("WARNING: Failed to install dependency ${dependency.name}!\n\nThe mod may behave erratically or fail to start. Please try to install the dependency manually, or contact the mod (and/or dependency) developers.")
222222
}
223223
}
224224
else {
225225
meta?.dependencies?.forEach { dependency ->
226-
if (!installDependency(dependency, progressHandler, warningHandler))
226+
if (!installDependency(dependency, progressHandler, warningHandler, repo))
227227
warningHandler.handle("WARNING: Failed to install dependency ${dependency.name}!\n\nThe mod may behave erratically or fail to start. Please try to install the dependency manually, or contact the mod (and/or dependency) developers.")
228228
}
229229
}
@@ -330,31 +330,39 @@ object ModInstaller {
330330
private fun installDependency(
331331
dependency: RepoMetadata.Dependency,
332332
progressHandler: TextHandler,
333-
warningHandler: TextHandler
333+
warningHandler: TextHandler,
334+
parentRepo: Git
334335
): Boolean {
335336
return try {
336-
progressHandler.handle("Parsing URL for dependency \"" + dependency.name + "\"...")
337-
if (dependency.repository == null || dependency.repository == "") {
338-
warningHandler.handle(
339-
String.format(
340-
"Failed to install dependency \"%s\": Dependency metadata doesn't specify a URL. The author may be playing a prank on his users.",
341-
dependency.name
337+
val depRepo: Git
338+
if (dependency.sameSource != true) {
339+
progressHandler.handle("Parsing URL for dependency \"" + dependency.name + "\"...")
340+
if (dependency.repository == null || dependency.repository == "") {
341+
warningHandler.handle(
342+
String.format(
343+
"Failed to install dependency \"%s\": Dependency metadata doesn't specify a URL. The author may be playing a prank on his users.",
344+
dependency.name
345+
)
342346
)
343-
)
344-
return false
347+
return false
348+
}
349+
val url = parseRepoURL(dependency.repository!!)
350+
val localRoot = getLocalRoot(url)
351+
val loadingHandler = GitProgressHandler("Loading dependency \"${dependency.name}\"...", progressHandler)
352+
depRepo = cloneRepository(localRoot, url, loadingHandler)
353+
// TODO: This repo instance is never closed. Need to refactor sometime.
354+
depRepo.checkout()
355+
.setName(dependency.branch)
356+
.setProgressMonitor(loadingHandler)
357+
.setCreateBranch(depRepo.repository.resolve("refs/heads/" + dependency.branch) == null)
358+
.setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.TRACK)
359+
.setStartPoint("refs/remotes/origin/" + dependency.branch)
360+
.call()
361+
depRepo.pull().setProgressMonitor(loadingHandler).call()
362+
}
363+
else {
364+
depRepo = parentRepo
345365
}
346-
val url = parseRepoURL(dependency.repository!!)
347-
val localRoot = getLocalRoot(url)
348-
val loadingHandler = GitProgressHandler("Loading dependency \"${dependency.name}\"...", progressHandler)
349-
val depRepo = cloneRepository(localRoot, url, loadingHandler)
350-
depRepo.checkout()
351-
.setName(dependency.branch)
352-
.setProgressMonitor(loadingHandler)
353-
.setCreateBranch(depRepo.repository.resolve("refs/heads/" + dependency.branch) == null)
354-
.setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.TRACK)
355-
.setStartPoint("refs/remotes/origin/" + dependency.branch)
356-
.call()
357-
depRepo.pull().setProgressMonitor(loadingHandler).call()
358366
val internalWarningHandler = TextHandler { text ->
359367
warningHandler.handle(
360368
String.format(

src/main/java/io/github/openstarruler/launchpad/model/RepoMetadata.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package io.github.openstarruler.launchpad.model
22

33
class RepoMetadata {
44
class Dependency {
5+
val sameSource: Boolean? = null
56
var name: String? = null
67
var repository: String? = null
78
var branch: String? = null

0 commit comments

Comments
 (0)