Skip to content

Commit

Permalink
Merge pull request #549 from alvasw/gradle_electrum_macOS_unpack_app_…
Browse files Browse the repository at this point in the history
…at_build_time

macOS: Unpack Electrum.app at build time
  • Loading branch information
alvasw authored Nov 18, 2022
2 parents 44b0ded + e5a5fde commit a8b8f00
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package bisq.gradle.electrum

import bisq.gradle.electrum.tasks.DownloadElectrumBinariesTask
import bisq.gradle.electrum.tasks.ExtractElectrumAppFromDmgFile
import bisq.gradle.electrum.tasks.VerifyElectrumBinariesTask
import org.gradle.api.Plugin
import org.gradle.api.Project
Expand All @@ -10,6 +11,7 @@ import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.bundling.Zip
import org.gradle.kotlin.dsl.create
import org.gradle.kotlin.dsl.register
import java.util.*


class BisqElectrumPlugin : Plugin<Project> {
Expand Down Expand Up @@ -44,8 +46,23 @@ class BisqElectrumPlugin : Plugin<Project> {
outputDirectory.set(project.layout.buildDirectory.dir(BINARIES_DIR))
}

var extractElectrumAppFromDmgFileTask: TaskProvider<ExtractElectrumAppFromDmgFile>? = null
if (isMacOs()) {
extractElectrumAppFromDmgFileTask =
project.tasks.register<ExtractElectrumAppFromDmgFile>("extractElectrumAppFromDmgFile") {
electrumVersion.set(extension.version)
inputDirectory.set(verifyElectrumBinariesTask.flatMap { it.inputDirectory })
outputDirectory.set(project.layout.buildDirectory.dir(BINARIES_DIR))
}
}

val packageElectrumBinariesTask: TaskProvider<Zip> =
project.tasks.register<Zip>("packageElectrumBinaries") {

if (isMacOs()) {
dependsOn(extractElectrumAppFromDmgFileTask)
}

archiveFileName.set("electrum-binaries.zip")
destinationDirectory.set(project.layout.buildDirectory.dir("generated/src/main/resources"))

Expand All @@ -58,4 +75,9 @@ class BisqElectrumPlugin : Plugin<Project> {
dependsOn(packageElectrumBinariesTask)
}
}

private fun isMacOs(): Boolean {
val osName: String = System.getProperty("os.name").toLowerCase(Locale.US)
return osName.contains("mac") || osName.contains("darwin")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package bisq.gradle.electrum.tasks

import org.gradle.api.DefaultTask
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.provider.Property
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputDirectory
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.TaskAction
import java.io.File
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.Paths
import java.util.concurrent.TimeUnit


abstract class ExtractElectrumAppFromDmgFile : DefaultTask() {

companion object {
private const val MOUNT_DIR = "/Volumes/Electrum"
private const val ELECTRUM_APP = "Electrum.app"
private const val MOUNTED_ELECTRUM_APP_PATH = "$MOUNT_DIR/$ELECTRUM_APP"
}


@get:Input
abstract val electrumVersion: Property<String>

@get:InputDirectory
abstract val inputDirectory: DirectoryProperty

@get:OutputDirectory
abstract val outputDirectory: DirectoryProperty

private val electrumAppDestinationFile: File
get() = outputDirectory.get().asFile.resolve(ELECTRUM_APP)

@TaskAction
fun extract() {
if (electrumAppDestinationFile.exists()) {
return
}

attachDmgFile()
copyElectrumAppToOutputDirectory()
detachDmgFile()
}

private fun attachDmgFile() {
val dmgFile = inputDirectory.get().asFile.resolve("electrum-${electrumVersion.get()}.dmg")
val attachDmgFile: Process = ProcessBuilder("hdiutil", "attach", dmgFile.absolutePath).start()
val isSuccess: Boolean = attachDmgFile.waitFor(25, TimeUnit.SECONDS)
if (!isSuccess) {
throw IllegalStateException("Could not attach DMG file.")
}
}

private fun copyElectrumAppToOutputDirectory() {
val electrumAppFile = Paths.get(MOUNTED_ELECTRUM_APP_PATH)
val destinationDir = electrumAppDestinationFile.absolutePath

Files.walk(electrumAppFile)
.forEach { source ->
val destination: Path = Paths.get(
destinationDir, source.toString().substring(MOUNTED_ELECTRUM_APP_PATH.length)
)
Files.copy(source, destination)
}
}

private fun detachDmgFile() {
val attachDmgFile: Process = ProcessBuilder("hdiutil", "detach", MOUNT_DIR).start()
val isSuccess: Boolean = attachDmgFile.waitFor(25, TimeUnit.SECONDS)
if (!isSuccess) {
throw IllegalStateException("Could not detach DMG file.")
}
}
}

0 comments on commit a8b8f00

Please sign in to comment.