From ceab5f0979ed3e079a6d862ba1a5e14e5a86c396 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Mon, 15 Mar 2021 08:28:49 +0300 Subject: [PATCH] Escape launcher arguments and JVM arguments with extra quotes Resolves #465 --- .../application/tasks/AbstractJPackageTask.kt | 12 ++++--- .../compose/DesktopApplicationTest.kt | 22 ++++++++++++ .../jetbrains/compose/test/TestProjects.kt | 1 + .../optionsWithSpaces/build.gradle | 34 +++++++++++++++++++ .../optionsWithSpaces/settings.gradle | 10 ++++++ .../optionsWithSpaces/src/main/kotlin/main.kt | 7 ++++ 6 files changed, 81 insertions(+), 5 deletions(-) create mode 100644 gradle-plugins/compose/src/test/test-projects/application/optionsWithSpaces/build.gradle create mode 100644 gradle-plugins/compose/src/test/test-projects/application/optionsWithSpaces/settings.gradle create mode 100644 gradle-plugins/compose/src/test/test-projects/application/optionsWithSpaces/src/main/kotlin/main.kt diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/tasks/AbstractJPackageTask.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/tasks/AbstractJPackageTask.kt index 07d9424f56..2851579f5a 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/tasks/AbstractJPackageTask.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/tasks/AbstractJPackageTask.kt @@ -207,10 +207,15 @@ abstract class AbstractJPackageTask @Inject constructor( } cliArg("--icon", iconFile) launcherArgs.orNull?.forEach { - cliArg("--arguments", it) + cliArg("--arguments", "'$it'") } launcherJvmArgs.orNull?.forEach { - cliArg("--java-options", it) + cliArg("--java-options", "'$it'") + } + if (currentOS == OS.MacOS) { + macDockName.orNull?.let { dockName -> + cliArg("--java-options", "'-Xdock:name=$dockName'") + } } } @@ -256,9 +261,6 @@ abstract class AbstractJPackageTask @Inject constructor( OS.MacOS -> { cliArg("--mac-package-name", macPackageName) cliArg("--mac-package-identifier", nonValidatedMacBundleID) - macDockName.orNull?.let { dockName -> - cliArg("--java-options", "-Xdock:name=\"$dockName\"") - } withValidatedMacOSSigning { signing -> cliArg("--mac-sign", true) diff --git a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/DesktopApplicationTest.kt b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/DesktopApplicationTest.kt index 92c99ab1df..72611a6152 100644 --- a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/DesktopApplicationTest.kt +++ b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/DesktopApplicationTest.kt @@ -148,4 +148,26 @@ class DesktopApplicationTest : GradlePluginTestBase() { } } } + + @Test + fun testOptionsWithSpaces() { + with(testProject(TestProjects.optionsWithSpaces)) { + fun testRunTask(runTask: String) { + gradle(runTask).build().checks { check -> + check.taskOutcome(runTask, TaskOutcome.SUCCESS) + check.logContains("Running test options with spaces!") + check.logContains("Arg #1=Value 1!") + check.logContains("Arg #2=Value 2!") + check.logContains("JVM system property arg=Value 3!") + } + } + + testRunTask(":runDistributable") + testRunTask(":run") + + gradle(":package").build().checks { check -> + check.taskOutcome(":package", TaskOutcome.SUCCESS) + } + } + } } diff --git a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/TestProjects.kt b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/TestProjects.kt index 6d714120d7..58cc9adf58 100644 --- a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/TestProjects.kt +++ b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/TestProjects.kt @@ -7,4 +7,5 @@ object TestProjects { const val moduleClashCli = "application/moduleClashCli" const val javaLogger = "application/javaLogger" const val macOptions = "application/macOptions" + const val optionsWithSpaces = "application/optionsWithSpaces" } \ No newline at end of file diff --git a/gradle-plugins/compose/src/test/test-projects/application/optionsWithSpaces/build.gradle b/gradle-plugins/compose/src/test/test-projects/application/optionsWithSpaces/build.gradle new file mode 100644 index 0000000000..c27275e326 --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/application/optionsWithSpaces/build.gradle @@ -0,0 +1,34 @@ +import org.jetbrains.compose.desktop.application.dsl.TargetFormat + +plugins { + id "org.jetbrains.kotlin.jvm" + id "org.jetbrains.compose" +} + +repositories { + google() + mavenCentral() + jcenter() + maven { + url "https://maven.pkg.jetbrains.space/public/p/compose/dev" + } +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib" + implementation compose.desktop.currentOs +} + +compose.desktop { + application { + mainClass = "MainKt" + nativeDistributions { + targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) + packageVersion = "1.0.0" + packageName = "Test Package" + + args("Value 1!", "Value 2!") + jvmArgs("-Dcompose.test.arg.value=Value 3!") + } + } +} diff --git a/gradle-plugins/compose/src/test/test-projects/application/optionsWithSpaces/settings.gradle b/gradle-plugins/compose/src/test/test-projects/application/optionsWithSpaces/settings.gradle new file mode 100644 index 0000000000..0fcbea6df4 --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/application/optionsWithSpaces/settings.gradle @@ -0,0 +1,10 @@ +pluginManagement { + plugins { + id 'org.jetbrains.kotlin.jvm' version 'KOTLIN_VERSION_PLACEHOLDER' + id 'org.jetbrains.compose' version 'COMPOSE_VERSION_PLACEHOLDER' + } + repositories { + mavenLocal() + gradlePluginPortal() + } +} diff --git a/gradle-plugins/compose/src/test/test-projects/application/optionsWithSpaces/src/main/kotlin/main.kt b/gradle-plugins/compose/src/test/test-projects/application/optionsWithSpaces/src/main/kotlin/main.kt new file mode 100644 index 0000000000..0778d177b9 --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/application/optionsWithSpaces/src/main/kotlin/main.kt @@ -0,0 +1,7 @@ +fun main(args: Array) { + println("Running test options with spaces!") + for ((i, arg) in args.withIndex()) { + println("Arg #${i + 1}=$arg") + } + println("JVM system property arg=${java.lang.System.getProperty("compose.test.arg.value")}") +} \ No newline at end of file