[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
This commit is contained in:
Yaroslav Chernyshev
2020-10-14 18:00:39 +03:00
parent b8817d5884
commit 4227e2dc40
2 changed files with 26 additions and 10 deletions
@@ -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|
@@ -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<Project> {
@@ -375,11 +375,11 @@ open class KotlinCocoapodsPlugin : Plugin<Project> {
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