From 4227e2dc40ebf699767547682f3457bc44b7b45f Mon Sep 17 00:00:00 2001 From: Yaroslav Chernyshev Date: Wed, 14 Oct 2020 18:00:39 +0300 Subject: [PATCH] [Cocoapods] Fix task and directory naming to avoid subspecs collision Logics of generating name for dependencies downloaded from git or url admits producing tasks with forbidden symbols inside name for subspecs. This fix introduces replacing of forbidden symbols for such purposes. #KT-42550 Fixed --- .../kotlin/gradle/native/CocoaPodsIT.kt | 26 +++++++++++++++---- .../native/cocoapods/KotlinCocoapodsPlugin.kt | 10 +++---- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt index db356da05ca..f7aeb9dbaed 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt @@ -28,6 +28,14 @@ import kotlin.test.assertEquals import kotlin.test.assertTrue import kotlin.test.fail +private val String.validFrameworkName: String + get() = replace('-', '_') +private val invalidTaskNameCharacters = "[/\\\\:<>\"?*|]".toRegex() + +private val String.validTaskName + get() = replace(invalidTaskNameCharacters, "_") + + class CocoaPodsIT : BaseGradleIT() { override val defaultGradleVersion: GradleVersionRequired @@ -220,6 +228,15 @@ class CocoaPodsIT : BaseGradleIT() { doTestGit(branch = "2974") } + @Test + fun testPodDownloadGitSubspec() { + doTestGit( + repo = "https://github.com/SDWebImage/SDWebImage.git", + pod = "SDWebImage/MapKit", + tag = "5.9.2" + ) + } + @Test fun testPodDownloadGitBranchAndCommit() { val branch = "2974" @@ -931,10 +948,11 @@ class CocoaPodsIT : BaseGradleIT() { branchName: String? = null, commitName: String? = null, tagName: String? = null, - aPodDownloadName: String = defaultPodName + aPodDownloadName: String = defaultPodName, + podspecName: String = aPodDownloadName.split("/")[0] ) { - val gitDir = git().resolve(aPodDownloadName) - val podspecFile = gitDir.resolve("$aPodDownloadName.podspec") + val gitDir = git().resolve(aPodDownloadName.validTaskName) + val podspecFile = gitDir.resolve("$podspecName.podspec") assertTrue(podspecFile.exists()) if (tagName != null) { checkTag(gitDir, tagName) @@ -1199,8 +1217,6 @@ class CocoaPodsIT : BaseGradleIT() { } } - private val String.validFrameworkName: String - get() = replace('-', '_') private fun kotlinLibraryPodspecContent(frameworkName: String? = null) = """ Pod::Spec.new do |spec| diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt index 31b70f1e6a4..5f16b71783b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt @@ -72,20 +72,20 @@ private val Family.toPodGenTaskName: String private fun String.toSetupBuildTaskName(pod: CocoapodsDependency): String = lowerCamelCaseName( KotlinCocoapodsPlugin.POD_SETUP_BUILD_TASK_NAME, - pod.schemeName, + pod.name.asValidTaskName(), this ) private fun String.toBuildDependenciesTaskName(pod: CocoapodsDependency): String = lowerCamelCaseName( KotlinCocoapodsPlugin.POD_BUILD_TASK_NAME, - pod.schemeName, + pod.name.asValidTaskName(), this ) private val CocoapodsDependency.toPodDownloadTaskName: String get() = lowerCamelCaseName( KotlinCocoapodsPlugin.POD_DOWNLOAD_TASK_NAME, - name + name.asValidTaskName() ) open class KotlinCocoapodsPlugin : Plugin { @@ -375,11 +375,11 @@ open class KotlinCocoapodsPlugin : Plugin { val podSource = pod.source val downloadPodTask = when (podSource) { is Git -> project.tasks.register(pod.toPodDownloadTaskName, PodDownloadGitTask::class.java) { - it.podName = project.provider { pod.name } + it.podName = project.provider { pod.name.asValidTaskName() } it.podSource = project.provider { podSource as Git } } is Url -> project.tasks.register(pod.toPodDownloadTaskName, PodDownloadUrlTask::class.java) { - it.podName = project.provider { pod.name } + it.podName = project.provider { pod.name.asValidTaskName() } it.podSource = project.provider { podSource as Url } } else -> return@all