From 0c53a2d1d75d3d934d134594751fe6cd0b000d1a Mon Sep 17 00:00:00 2001 From: laur89 Date: Mon, 21 Apr 2025 01:18:41 +0200 Subject: [PATCH] fix: Group `mount` and `install` options into an argument group (#364) Co-authored-by: oSumAtrIX --- .../app/revanced/cli/command/PatchCommand.kt | 44 +++++++++++-------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/src/main/kotlin/app/revanced/cli/command/PatchCommand.kt b/src/main/kotlin/app/revanced/cli/command/PatchCommand.kt index efbc755..ba6b044 100644 --- a/src/main/kotlin/app/revanced/cli/command/PatchCommand.kt +++ b/src/main/kotlin/app/revanced/cli/command/PatchCommand.kt @@ -115,21 +115,27 @@ internal object PatchCommand : Runnable { this.outputFilePath = outputFilePath?.absoluteFile } - @CommandLine.Option( - names = ["-i", "--install"], - description = ["Serial of the ADB device to install to. If not specified, the first connected device will be used."], - // Empty string to indicate that the first connected device should be used. - fallbackValue = "", - arity = "0..1", - ) - private var deviceSerial: String? = null + @ArgGroup(exclusive = false, multiplicity = "0..1") + internal var installation: Installation? = null - @CommandLine.Option( - names = ["--mount"], - description = ["Install the patched APK file by mounting."], - showDefaultValue = ALWAYS, - ) - private var mount: Boolean = false + internal class Installation { + @CommandLine.Option( + names = ["-i", "--install"], + required = true, + description = ["Serial of the ADB device to install to. If not specified, the first connected device will be used."], + fallbackValue = "", // Empty string is used to select the first of connected devices. + arity = "0..1", + ) + internal var deviceSerial: String? = null + + @CommandLine.Option( + names = ["--mount"], + required = false, + description = ["Install the patched APK file by mounting."], + showDefaultValue = ALWAYS, + ) + internal var mount: Boolean = false + } @CommandLine.Option( names = ["--keystore"], @@ -245,11 +251,11 @@ internal object PatchCommand : Runnable { keyStoreFilePath ?: outputFilePath.parentFile .resolve("${outputFilePath.nameWithoutExtension}.keystore") - val installer = if (deviceSerial != null) { - val deviceSerial = deviceSerial!!.ifEmpty { null } + val installer = if (installation?.deviceSerial != null) { + val deviceSerial = installation?.deviceSerial!!.ifEmpty { null } try { - if (mount) { + if (installation?.mount == true) { AdbRootInstaller(deviceSerial) } else { AdbInstaller(deviceSerial) @@ -332,7 +338,7 @@ internal object PatchCommand : Runnable { apk.copyTo(temporaryFilesPath.resolve(apk.name), overwrite = true).apply { patcherResult.applyTo(this) }.let { patchedApkFile -> - if (!mount) { + if (installation?.mount != true) { ApkUtils.signApk( patchedApkFile, outputFilePath, @@ -355,7 +361,7 @@ internal object PatchCommand : Runnable { // region Install. - deviceSerial?.let { + installation?.deviceSerial?.let { runBlocking { when (val result = installer!!.install(Installer.Apk(outputFilePath, packageName))) { RootInstallerResult.FAILURE -> logger.severe("Failed to mount the patched APK file")