From 75655ee080a8d2871b98130dae09bf7eb1e5f418 Mon Sep 17 00:00:00 2001 From: Kevin Schildhorn Date: Wed, 30 Apr 2025 14:18:08 -0400 Subject: [PATCH 1/2] Adding KtLint --- .editorconfig | 23 ++ build.gradle.kts | 13 + kmmbridge-github/build.gradle.kts | 28 +- .../src/main/kotlin/Extensions.kt | 18 +- .../github/GithubReleaseArtifactManager.kt | 83 +++--- .../kmmbridge/github/KMMBridgeGitHubPlugin.kt | 109 +++---- .../kmmbridge/github/internal/GithubApi.kt | 14 +- .../kmmbridge/github/internal/GithubCalls.kt | 99 ++++--- .../github/internal/ProcessHelper.kt | 19 +- kmmbridge-gitlab/build.gradle.kts | 28 +- .../src/main/kotlin/Extensions.kt | 1 - .../kmmbridge/gitlab/KMMBridgeGitLabPlugin.kt | 3 +- .../kmmbridge/gitlab/internal/GitLabApi.kt | 4 +- kmmbridge-test/build.gradle.kts | 29 +- kmmbridge-test/src/main/kotlin/Extensions.kt | 2 +- .../kmmbridge/test/KMMBridgeTestPlugin.kt | 3 +- .../kmmbridge/test/TestArtifactManager.kt | 11 +- .../test/TestUploadArtifactManager.kt | 28 +- kmmbridge/build.gradle.kts | 28 +- .../kotlin/co/touchlab/kmmbridge/Constants.kt | 2 +- .../kotlin/co/touchlab/kmmbridge/KMMBridge.kt | 123 ++++---- .../touchlab/kmmbridge/KmmBridgeExtension.kt | 43 ++- .../touchlab/kmmbridge/ProjectExtensions.kt | 4 +- .../artifactmanager/ArtifactManager.kt | 12 +- .../AwsS3PublicArtifactManager.kt | 71 ++--- .../MavenPublishArtifactManager.kt | 59 ++-- .../CocoapodsDependencyManager.kt | 263 +++++++++-------- .../dependencymanager/DependencyManager.kt | 4 +- .../dependencymanager/SpmDependencyManager.kt | 271 +++++++++--------- .../kmmbridge/dsl/TargetPlatformDsl.kt | 11 +- .../internal/ProjectExtensionsInternal.kt | 11 +- .../kmmbridge/internal/StringExtensions.kt | 10 +- .../internal/domain/PlatformVersion.kt | 7 +- .../internal/domain/SwiftToolVersion.kt | 8 +- .../kmmbridge/internal/domain/TargetName.kt | 6 +- .../internal/domain/TargetPlatform.kt | 5 +- .../kmmbridge/internal/domain/extensions.kt | 48 ++-- .../touchlab/kmmbridge/ArtifactManagerTest.kt | 23 +- .../co/touchlab/kmmbridge/BasePluginTest.kt | 16 +- .../kmmbridge/KmmBridgeExtensionTest.kt | 16 +- .../kmmbridge/NonKmmBridgeTasksTest.kt | 14 +- .../co/touchlab/kmmbridge/ProcessHelper.kt | 43 +-- .../co/touchlab/kmmbridge/SpmLocalDevTest.kt | 24 +- .../PackageFileUpdateTest.kt | 81 +++--- 44 files changed, 903 insertions(+), 815 deletions(-) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..b927a291 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,23 @@ +# .editorconfig +root = true + +[*.{kt,kts}] +end_of_line = lf +ij_kotlin_packages_to_use_import_on_demand = true +ij_kotlin_allow_trailing_comma = true +ij_kotlin_allow_trailing_comma_on_call_site = true +ij_kotlin_imports_layout = * +ij_kotlin_indent_before_arrow_on_new_line = false +ij_kotlin_line_break_after_multiline_when_entry = true +indent_size = 4 +indent_style = space +insert_final_newline = true +ktlint_argument_list_wrapping_ignore_when_parameter_count_greater_or_equal_than = 8 +ktlint_chain_method_rule_force_multiline_when_chain_operator_count_greater_or_equal_than = 4 +ktlint_code_style = android_studio +ktlint_enum_entry_name_casing = upper_or_camel_cases +ktlint_function_naming_ignore_when_annotated_with = Composable +ktlint_function_signature_body_expression_wrapping = default +ktlint_ignore_back_ticked_identifier = false +max_line_length = 140 +parameter-list-wrapping = true \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 9b7cc8e2..db9a626d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,9 +14,11 @@ plugins { alias(libs.plugins.kotlin) apply false id("org.jetbrains.kotlin.plugin.allopen") version "1.9.0" apply false alias(libs.plugins.maven.publish) apply false + id("org.jlleitschuh.gradle.ktlint") version "12.2.0" apply false } subprojects { + apply(plugin = "org.jlleitschuh.gradle.ktlint") repositories { gradlePluginPortal() mavenCentral() @@ -25,6 +27,14 @@ subprojects { extensions.findByType()?.apply { jvmToolchain(17) } + configure { + version.set("1.4.0") + enableExperimentalRules.set(true) + verbose.set(true) + filter { + exclude { it.file.path.contains("build/") } + } + } val GROUP: String by project val VERSION_NAME: String by project @@ -36,5 +46,8 @@ subprojects { tasks.getByName("test") { useJUnitPlatform() } + tasks.named("check") { + dependsOn(tasks.getByName("ktlintCheck")) + } } } \ No newline at end of file diff --git a/kmmbridge-github/build.gradle.kts b/kmmbridge-github/build.gradle.kts index 2c5f7470..42e845cb 100644 --- a/kmmbridge-github/build.gradle.kts +++ b/kmmbridge-github/build.gradle.kts @@ -20,6 +20,7 @@ plugins { id("java-gradle-plugin") alias(libs.plugins.maven.publish) id("com.gradle.plugin-publish") version "1.0.0" + id("org.jlleitschuh.gradle.ktlint") } @Suppress("UnstableApiUsage") @@ -33,18 +34,19 @@ gradlePlugin { id = "co.touchlab.kmmbridge.github" implementationClass = "co.touchlab.kmmbridge.github.KMMBridgeGitHubPlugin" displayName = "KMMBridge/GitHub" - tags = listOf( - "kmm", - "kotlin", - "multiplatform", - "mobile", - "ios", - "xcode", - "framework", - "binary", - "publish", - "consume" - ) + tags = + listOf( + "kmm", + "kotlin", + "multiplatform", + "mobile", + "ios", + "xcode", + "framework", + "binary", + "publish", + "consume", + ) } } } @@ -67,4 +69,4 @@ mavenPublishing { pomFromGradleProperties() @Suppress("UnstableApiUsage") configureBasedOnAppliedPlugins() -} \ No newline at end of file +} diff --git a/kmmbridge-github/src/main/kotlin/Extensions.kt b/kmmbridge-github/src/main/kotlin/Extensions.kt index 7dc629ee..0780f0dc 100644 --- a/kmmbridge-github/src/main/kotlin/Extensions.kt +++ b/kmmbridge-github/src/main/kotlin/Extensions.kt @@ -5,27 +5,21 @@ import co.touchlab.kmmbridge.github.internal.githubPublishUser import co.touchlab.kmmbridge.github.internal.githubRepoOrNull import co.touchlab.kmmbridge.github.kmmBridgeExtension import co.touchlab.kmmbridge.publishingExtension -import org.gradle.api.Project import java.net.URI +import org.gradle.api.Project @Suppress("unused") -fun Project.gitHubReleaseArtifacts( - repository: String? = null, - releasString: String? = null, - useExistingRelease: Boolean = false -) { +fun Project.gitHubReleaseArtifacts(repository: String? = null, releasString: String? = null, useExistingRelease: Boolean = false) { kmmBridgeExtension.setupGitHubReleaseArtifacts( GithubReleaseArtifactManager( repository, releasString, - useExistingRelease - ) + useExistingRelease, + ), ) } -private fun KmmBridgeExtension.setupGitHubReleaseArtifacts( - githubReleaseArtifactManager: GithubReleaseArtifactManager -) { +private fun KmmBridgeExtension.setupGitHubReleaseArtifacts(githubReleaseArtifactManager: GithubReleaseArtifactManager) { artifactManager.setAndFinalize(githubReleaseArtifactManager) } @@ -53,4 +47,4 @@ fun Project.addGithubPackagesRepository() { } } } -} \ No newline at end of file +} diff --git a/kmmbridge-github/src/main/kotlin/co/touchlab/kmmbridge/github/GithubReleaseArtifactManager.kt b/kmmbridge-github/src/main/kotlin/co/touchlab/kmmbridge/github/GithubReleaseArtifactManager.kt index 2486deef..e28783ee 100644 --- a/kmmbridge-github/src/main/kotlin/co/touchlab/kmmbridge/github/GithubReleaseArtifactManager.kt +++ b/kmmbridge-github/src/main/kotlin/co/touchlab/kmmbridge/github/GithubReleaseArtifactManager.kt @@ -7,23 +7,24 @@ import co.touchlab.kmmbridge.github.internal.githubArtifactIdentifierName import co.touchlab.kmmbridge.github.internal.githubArtifactReleaseId import co.touchlab.kmmbridge.github.internal.githubPublishToken import co.touchlab.kmmbridge.github.internal.githubRepo +import java.io.File +import kotlin.properties.Delegates import org.gradle.api.GradleException import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.tasks.Input import org.gradle.api.tasks.TaskProvider import org.gradle.kotlin.dsl.getByType -import java.io.File -import kotlin.properties.Delegates open class GithubReleaseArtifactManager( private val repository: String?, private val releaseString: String?, - @Deprecated("Releases should be created externally. This parameter controls the flow for releases created " + - "by this class, which will eventually be unsupported.") - private val useExistingRelease: Boolean + @Deprecated( + "Releases should be created externally. This parameter controls the flow for releases created " + + "by this class, which will eventually be unsupported.", + ) + private val useExistingRelease: Boolean, ) : ArtifactManager { - @get:Input lateinit var releaseVersion: String @@ -43,9 +44,7 @@ open class GithubReleaseArtifactManager( // https://docs.gradle.org/current/userguide/configuration_cache.html#config_cache:secrets lateinit var githubPublishToken: String - override fun configure( - project: Project, version: String, uploadTask: TaskProvider, kmmPublishTask: TaskProvider - ) { + override fun configure(project: Project, version: String, uploadTask: TaskProvider, kmmPublishTask: TaskProvider) { this.releaseVersion = releaseString ?: project.version.toString() this.repoName = this.repository ?: project.githubRepo this.githubPublishToken = project.githubPublishToken @@ -55,47 +54,55 @@ open class GithubReleaseArtifactManager( } override fun deployArtifact(task: Task, zipFilePath: File, version: String): String { - val uploadReleaseId = if (artifactReleaseId == 0) { - val existingReleaseId = GithubCalls.findReleaseId( - githubPublishToken, repoName, releaseVersion - ) - - task.logger.info("existingReleaseId: $existingReleaseId") - - if (existingReleaseId != null && !useExistingRelease) { - throw GradleException("Release for '$releaseVersion' exists. Set 'useExistingRelease = true' to update existing releases.") + val uploadReleaseId = + if (artifactReleaseId == 0) { + val existingReleaseId = + GithubCalls.findReleaseId( + githubPublishToken, + repoName, + releaseVersion, + ) + + task.logger.info("existingReleaseId: $existingReleaseId") + + if (existingReleaseId != null && !useExistingRelease) { + throw GradleException( + "Release for '$releaseVersion' exists. Set 'useExistingRelease = true' to update existing releases.", + ) + } + + val idReply: Int = + existingReleaseId ?: GithubCalls.createRelease( + githubPublishToken, + repoName, + releaseVersion, + null, + ) + + task.logger.info("GitHub Release created with id: $idReply") + + idReply + } else { + artifactReleaseId } - val idReply: Int = existingReleaseId ?: GithubCalls.createRelease( - githubPublishToken, repoName, releaseVersion, null - ) - - task.logger.info("GitHub Release created with id: $idReply") - - idReply - } else { - artifactReleaseId - } - val fileName = artifactName(version, useExistingRelease) val uploadUrl = GithubCalls.uploadZipFile(githubPublishToken, zipFilePath, repoName, uploadReleaseId, fileName) - return "${uploadUrl}.zip" + return "$uploadUrl.zip" } - private fun artifactName(versionString: String, useExistingRelease: Boolean): String { - return if (useExistingRelease) { - "$frameworkName-${versionString}-${(System.currentTimeMillis() / 1000)}.xcframework.zip" - } else { - uploadZipFileName(versionString) - } + private fun artifactName(versionString: String, useExistingRelease: Boolean): String = if (useExistingRelease) { + "$frameworkName-$versionString-${(System.currentTimeMillis() / 1000)}.xcframework.zip" + } else { + uploadZipFileName(versionString) } open fun uploadZipFileName(versionString: String) = if (artifactIdentifierName.isNotEmpty()) { - "$frameworkName-${artifactIdentifierName}.xcframework.zip" + "$frameworkName-$artifactIdentifierName.xcframework.zip" } else { "$frameworkName.xcframework.zip" } } -internal val Project.kmmBridgeExtension get() = extensions.getByType() \ No newline at end of file +internal val Project.kmmBridgeExtension get() = extensions.getByType() diff --git a/kmmbridge-github/src/main/kotlin/co/touchlab/kmmbridge/github/KMMBridgeGitHubPlugin.kt b/kmmbridge-github/src/main/kotlin/co/touchlab/kmmbridge/github/KMMBridgeGitHubPlugin.kt index a0270e43..b1ed913e 100644 --- a/kmmbridge-github/src/main/kotlin/co/touchlab/kmmbridge/github/KMMBridgeGitHubPlugin.kt +++ b/kmmbridge-github/src/main/kotlin/co/touchlab/kmmbridge/github/KMMBridgeGitHubPlugin.kt @@ -4,11 +4,11 @@ import co.touchlab.kmmbridge.BaseKMMBridgePlugin import co.touchlab.kmmbridge.TASK_GROUP_NAME import co.touchlab.kmmbridge.findStringProperty import co.touchlab.kmmbridge.github.internal.procRunFailLog +import java.io.File +import java.nio.file.Files import org.gradle.api.Action import org.gradle.api.Project import org.gradle.api.Task -import java.io.File -import java.nio.file.Files @Suppress("unused") class KMMBridgeGitHubPlugin : BaseKMMBridgePlugin() { @@ -19,66 +19,69 @@ class KMMBridgeGitHubPlugin : BaseKMMBridgePlugin() { if (githubDeploySourceRepo != null && githubDeployTargetRepo != null) { project.tasks.register("setupDeployKeys") { group = TASK_GROUP_NAME - description = "Helper task to setup GitHub deploy keys. Creates an ssh public/private key pair and adds them to the target and source repos." + description = + "Helper task to setup GitHub deploy keys. Creates an ssh public/private key pair and adds them to the target and source repos." outputs.upToDateWhen { false } // This should always run @Suppress("ObjectLiteralToLambda") - doLast(object : Action { - override fun execute(t: Task) { - val githubDeployKeyPrefix = project.findStringProperty("githubDeployKeyPrefix") ?: "KMMBridge" + doLast( + object : Action { + override fun execute(t: Task) { + val githubDeployKeyPrefix = project.findStringProperty("githubDeployKeyPrefix") ?: "KMMBridge" - val keyname = "$githubDeployKeyPrefix Key" + val keyname = "$githubDeployKeyPrefix Key" - val tempDir = Files.createTempDirectory("kmmbridge") - println("Generated temp dir: $tempDir") - val deployKeyName = "deploykey" - val deployKeyPrivateFilePath = File(tempDir.toFile(), deployKeyName) - val deployKeyPublicFilePath = File(tempDir.toFile(), "${deployKeyName}.pub") + val tempDir = Files.createTempDirectory("kmmbridge") + println("Generated temp dir: $tempDir") + val deployKeyName = "deploykey" + val deployKeyPrivateFilePath = File(tempDir.toFile(), deployKeyName) + val deployKeyPublicFilePath = File(tempDir.toFile(), "$deployKeyName.pub") - try { - project.procRunFailLog( - "ssh-keygen", - "-t", - "ed25519", - "-f", - deployKeyPrivateFilePath.toString(), - "-C", - "git@github.com:$githubDeployTargetRepo", - "-P", - "" - ) + try { + project.procRunFailLog( + "ssh-keygen", + "-t", + "ed25519", + "-f", + deployKeyPrivateFilePath.toString(), + "-C", + "git@github.com:$githubDeployTargetRepo", + "-P", + "", + ) - project.procRunFailLog( - "gh", - "repo", - "deploy-key", - "add", - deployKeyPublicFilePath.toString(), - "-w", - "-R", - githubDeployTargetRepo, - "-t", - keyname - ) + project.procRunFailLog( + "gh", + "repo", + "deploy-key", + "add", + deployKeyPublicFilePath.toString(), + "-w", + "-R", + githubDeployTargetRepo, + "-t", + keyname, + ) - project.procRunFailLog( - "gh", - "secret", - "set", - "${githubDeployKeyPrefix}_SSH_KEY", - "--body", - deployKeyPrivateFilePath.readText(), - "-R", - githubDeploySourceRepo - ) - } finally { - deployKeyPrivateFilePath.delete() - deployKeyPublicFilePath.delete() - Files.deleteIfExists(tempDir) + project.procRunFailLog( + "gh", + "secret", + "set", + "${githubDeployKeyPrefix}_SSH_KEY", + "--body", + deployKeyPrivateFilePath.readText(), + "-R", + githubDeploySourceRepo, + ) + } finally { + deployKeyPrivateFilePath.delete() + deployKeyPublicFilePath.delete() + Files.deleteIfExists(tempDir) + } } - } - }) + }, + ) } } } -} \ No newline at end of file +} diff --git a/kmmbridge-github/src/main/kotlin/co/touchlab/kmmbridge/github/internal/GithubApi.kt b/kmmbridge-github/src/main/kotlin/co/touchlab/kmmbridge/github/internal/GithubApi.kt index 69582e5a..e14b9d60 100644 --- a/kmmbridge-github/src/main/kotlin/co/touchlab/kmmbridge/github/internal/GithubApi.kt +++ b/kmmbridge-github/src/main/kotlin/co/touchlab/kmmbridge/github/internal/GithubApi.kt @@ -36,15 +36,19 @@ internal val Project.githubRepoOrNull: String? } internal val Project.githubPublishToken - get() = (project.property("GITHUB_PUBLISH_TOKEN") - ?: throw IllegalArgumentException("KMMBridge Github operations need property GITHUB_PUBLISH_TOKEN")) as String + get() = + ( + project.property("GITHUB_PUBLISH_TOKEN") + ?: throw IllegalArgumentException("KMMBridge Github operations need property GITHUB_PUBLISH_TOKEN") + ) as String internal val Project.githubArtifactReleaseId - get() = project.findStringProperty("GITHUB_ARTIFACT_RELEASE_ID") + get() = project.findStringProperty("GITHUB_ARTIFACT_RELEASE_ID") internal val Project.githubArtifactIdentifierName get() = project.findStringProperty("GITHUB_ARTIFACT_IDENTIFIER_NAME") internal val Project.githubRepo: String - get() = githubRepoOrNull - ?: throw IllegalArgumentException("KMMBridge Github operations need a repo param or property GITHUB_REPO") + get() = + githubRepoOrNull + ?: throw IllegalArgumentException("KMMBridge Github operations need a repo param or property GITHUB_REPO") diff --git a/kmmbridge-github/src/main/kotlin/co/touchlab/kmmbridge/github/internal/GithubCalls.kt b/kmmbridge-github/src/main/kotlin/co/touchlab/kmmbridge/github/internal/GithubCalls.kt index 2ddb109c..c4fd1b06 100644 --- a/kmmbridge-github/src/main/kotlin/co/touchlab/kmmbridge/github/internal/GithubCalls.kt +++ b/kmmbridge-github/src/main/kotlin/co/touchlab/kmmbridge/github/internal/GithubCalls.kt @@ -14,6 +14,9 @@ package co.touchlab.kmmbridge.github.internal import com.google.gson.Gson +import java.io.File +import java.net.URLEncoder +import java.time.Duration import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.OkHttpClient import okhttp3.Request @@ -21,26 +24,33 @@ import okhttp3.RequestBody import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody import org.gradle.api.GradleException -import java.io.File -import java.net.URLEncoder -import java.time.Duration object GithubCalls { private val okHttpClient = - OkHttpClient.Builder().callTimeout(Duration.ofMinutes(5)).connectTimeout(Duration.ofMinutes(2)) - .writeTimeout(Duration.ofMinutes(5)).readTimeout(Duration.ofMinutes(2)).build() + OkHttpClient + .Builder() + .callTimeout(Duration.ofMinutes(5)) + .connectTimeout(Duration.ofMinutes(2)) + .writeTimeout(Duration.ofMinutes(5)) + .readTimeout(Duration.ofMinutes(2)) + .build() fun createRelease(githubPublishToken: String, repo: String, tag: String, commitId: String?): Int { val gson = Gson() - val createReleaseBody = if (commitId == null) { - CreateReleaseBody(tag) - } else { - CreateReleaseWithCommitBody(tag, commitId) - } - val createRequest = Request.Builder().url("https://api.github.com/repos/${repo}/releases") - .post(gson.toJson(createReleaseBody).toRequestBody("application/json".toMediaTypeOrNull())) - .addHeader("Accept", "application/vnd.github+json").addHeader("Authorization", "Bearer $githubPublishToken") - .build() + val createReleaseBody = + if (commitId == null) { + CreateReleaseBody(tag) + } else { + CreateReleaseWithCommitBody(tag, commitId) + } + val createRequest = + Request + .Builder() + .url("https://api.github.com/repos/$repo/releases") + .post(gson.toJson(createReleaseBody).toRequestBody("application/json".toMediaTypeOrNull())) + .addHeader("Accept", "application/vnd.github+json") + .addHeader("Authorization", "Bearer $githubPublishToken") + .build() val response = okHttpClient.newCall(createRequest).execute() if (!response.isSuccessful) { @@ -54,27 +64,27 @@ object GithubCalls { return gson.fromJson(response.body!!.string(), IdReply::class.java).id } - fun uploadZipFile( - githubPublishToken: String, - zipFilePath: File, - repo: String, - releaseId: Int, - fileName: String - ): String { + fun uploadZipFile(githubPublishToken: String, zipFilePath: File, repo: String, releaseId: Int, fileName: String): String { val gson = Gson() val body: RequestBody = zipFilePath.asRequestBody("application/zip".toMediaTypeOrNull()) - val uploadRequest = Request.Builder().url( - "https://uploads.github.com/repos/${repo}/releases/${releaseId}/assets?name=${ - URLEncoder.encode( - fileName, "UTF-8" - ) - }" - ).post(body).addHeader("Accept", "application/vnd.github+json").addHeader( - "Authorization", - "Bearer $githubPublishToken" - ) - .addHeader("Content-Type", "application/zip").build() + val uploadRequest = + Request + .Builder() + .url( + "https://uploads.github.com/repos/$repo/releases/$releaseId/assets?name=${ + URLEncoder.encode( + fileName, + "UTF-8", + ) + }", + ).post(body) + .addHeader("Accept", "application/vnd.github+json") + .addHeader( + "Authorization", + "Bearer $githubPublishToken", + ).addHeader("Content-Type", "application/zip") + .build() val response = okHttpClient.newCall(uploadRequest).execute() if (response.code != 201) { @@ -84,19 +94,24 @@ object GithubCalls { return gson.fromJson(uploadResponseString, UploadReply::class.java).url } - fun findReleaseId( - githubPublishToken: String, - repoName: String, - artifactReleaseTag: String - ): Int? { + fun findReleaseId(githubPublishToken: String, repoName: String, artifactReleaseTag: String): Int? { val request: Request = - Request.Builder().url("https://api.github.com/repos/${repoName}/releases/tags/${artifactReleaseTag}").get() - .addHeader("Accept", "application/vnd.github+json").addHeader( + Request + .Builder() + .url("https://api.github.com/repos/$repoName/releases/tags/$artifactReleaseTag") + .get() + .addHeader("Accept", "application/vnd.github+json") + .addHeader( "Authorization", - "Bearer $githubPublishToken" + "Bearer $githubPublishToken", ).build() - val responseString = okHttpClient.newCall(request).execute().body!!.string() + val responseString = + okHttpClient + .newCall(request) + .execute() + .body!! + .string() return if (!responseString.contains("Not Found")) { val id = Gson().fromJson(responseString, IdReply::class.java).id id.takeIf { it != 0 } @@ -114,4 +129,4 @@ data class IdReply(var id: Int) data class UploadReply(var url: String) -class GithubReleaseException(message: String, cause: Throwable? = null) : Exception(message, cause) \ No newline at end of file +class GithubReleaseException(message: String, cause: Throwable? = null) : Exception(message, cause) diff --git a/kmmbridge-github/src/main/kotlin/co/touchlab/kmmbridge/github/internal/ProcessHelper.kt b/kmmbridge-github/src/main/kotlin/co/touchlab/kmmbridge/github/internal/ProcessHelper.kt index 2434a771..e47893e0 100644 --- a/kmmbridge-github/src/main/kotlin/co/touchlab/kmmbridge/github/internal/ProcessHelper.kt +++ b/kmmbridge-github/src/main/kotlin/co/touchlab/kmmbridge/github/internal/ProcessHelper.kt @@ -1,21 +1,23 @@ package co.touchlab.kmmbridge.github.internal -import org.gradle.api.GradleException -import org.gradle.api.Project import java.io.BufferedReader import java.io.File import java.io.InputStreamReader +import org.gradle.api.GradleException +import org.gradle.api.Project internal fun procRun(vararg params: String, dir: File?, processLines: (String, Int) -> Unit) { - val processBuilder = ProcessBuilder(*params) - .redirectErrorStream(true) + val processBuilder = + ProcessBuilder(*params) + .redirectErrorStream(true) if (dir != null) { println("*** Running proc in ${dir.path}") processBuilder.directory(dir) } - val process = processBuilder - .start() + val process = + processBuilder + .start() val streamReader = InputStreamReader(process.inputStream) val bufferedReader = BufferedReader(streamReader) @@ -28,8 +30,9 @@ internal fun procRun(vararg params: String, dir: File?, processLines: (String, I bufferedReader.close() val returnValue = process.waitFor() - if (returnValue != 0) + if (returnValue != 0) { throw GradleException("Process failed: ${params.joinToString(" ")}") + } } internal fun Project.procRunFailLog(vararg params: String, dir: File? = null): List { @@ -42,4 +45,4 @@ internal fun Project.procRunFailLog(vararg params: String, dir: File? = null): L throw e } return output -} \ No newline at end of file +} diff --git a/kmmbridge-gitlab/build.gradle.kts b/kmmbridge-gitlab/build.gradle.kts index 104e0207..f2a0178a 100644 --- a/kmmbridge-gitlab/build.gradle.kts +++ b/kmmbridge-gitlab/build.gradle.kts @@ -20,6 +20,7 @@ plugins { id("java-gradle-plugin") alias(libs.plugins.maven.publish) id("com.gradle.plugin-publish") version "1.0.0" + id("org.jlleitschuh.gradle.ktlint") } @Suppress("UnstableApiUsage") @@ -33,18 +34,19 @@ gradlePlugin { id = "co.touchlab.kmmbridge.gitlab" implementationClass = "co.touchlab.kmmbridge.gitlab.KMMBridgeGitLabPlugin" displayName = "KMMBridge/GitLab" - tags = listOf( - "kmm", - "kotlin", - "multiplatform", - "mobile", - "ios", - "xcode", - "framework", - "binary", - "publish", - "consume" - ) + tags = + listOf( + "kmm", + "kotlin", + "multiplatform", + "mobile", + "ios", + "xcode", + "framework", + "binary", + "publish", + "consume", + ) } } } @@ -67,4 +69,4 @@ mavenPublishing { pomFromGradleProperties() @Suppress("UnstableApiUsage") configureBasedOnAppliedPlugins() -} \ No newline at end of file +} diff --git a/kmmbridge-gitlab/src/main/kotlin/Extensions.kt b/kmmbridge-gitlab/src/main/kotlin/Extensions.kt index e8157908..a864aad0 100644 --- a/kmmbridge-gitlab/src/main/kotlin/Extensions.kt +++ b/kmmbridge-gitlab/src/main/kotlin/Extensions.kt @@ -7,7 +7,6 @@ import org.gradle.api.Project import org.gradle.api.credentials.HttpHeaderCredentials import org.gradle.authentication.http.HttpHeaderAuthentication - /** * Helper function to support GitLab Packages publishing. * Pass in a valid GitLab token type with GITLAB_PUBLISH_USER. Options include; "Private-Token", "Deploy-Token" & "Job-Token" (default). diff --git a/kmmbridge-gitlab/src/main/kotlin/co/touchlab/kmmbridge/gitlab/KMMBridgeGitLabPlugin.kt b/kmmbridge-gitlab/src/main/kotlin/co/touchlab/kmmbridge/gitlab/KMMBridgeGitLabPlugin.kt index cefb0b2d..8ca314f6 100644 --- a/kmmbridge-gitlab/src/main/kotlin/co/touchlab/kmmbridge/gitlab/KMMBridgeGitLabPlugin.kt +++ b/kmmbridge-gitlab/src/main/kotlin/co/touchlab/kmmbridge/gitlab/KMMBridgeGitLabPlugin.kt @@ -3,5 +3,4 @@ package co.touchlab.kmmbridge.gitlab import co.touchlab.kmmbridge.BaseKMMBridgePlugin @Suppress("unused") -class KMMBridgeGitLabPlugin : BaseKMMBridgePlugin() { -} \ No newline at end of file +class KMMBridgeGitLabPlugin : BaseKMMBridgePlugin() diff --git a/kmmbridge-gitlab/src/main/kotlin/co/touchlab/kmmbridge/gitlab/internal/GitLabApi.kt b/kmmbridge-gitlab/src/main/kotlin/co/touchlab/kmmbridge/gitlab/internal/GitLabApi.kt index 6556a721..75215f87 100644 --- a/kmmbridge-gitlab/src/main/kotlin/co/touchlab/kmmbridge/gitlab/internal/GitLabApi.kt +++ b/kmmbridge-gitlab/src/main/kotlin/co/touchlab/kmmbridge/gitlab/internal/GitLabApi.kt @@ -14,8 +14,8 @@ package co.touchlab.kmmbridge.gitlab.internal import co.touchlab.kmmbridge.findStringProperty -import org.gradle.api.Project import java.net.URLEncoder +import org.gradle.api.Project internal val Project.gitLabPublishTokenOrNull: String? get() = project.property("GITLAB_PUBLISH_TOKEN") as String? @@ -33,4 +33,4 @@ internal val Project.gitLabRepoOrNull: String? } internal val Project.gitLabDomain: String? - get() = project.findStringProperty("GITLAB_DOMAIN") \ No newline at end of file + get() = project.findStringProperty("GITLAB_DOMAIN") diff --git a/kmmbridge-test/build.gradle.kts b/kmmbridge-test/build.gradle.kts index 4c6cbc8a..b6a0b428 100644 --- a/kmmbridge-test/build.gradle.kts +++ b/kmmbridge-test/build.gradle.kts @@ -12,6 +12,7 @@ * or implied. See the License for the specific language governing permissions and limitations under * the License. */ + plugins { `kotlin-dsl` alias(libs.plugins.kotlin) @@ -19,6 +20,7 @@ plugins { id("java-gradle-plugin") alias(libs.plugins.maven.publish) id("com.gradle.plugin-publish") version "1.0.0" + id("org.jlleitschuh.gradle.ktlint") } @Suppress("UnstableApiUsage") @@ -32,18 +34,19 @@ gradlePlugin { id = "co.touchlab.kmmbridge.test" implementationClass = "co.touchlab.kmmbridge.test.KMMBridgeTestPlugin" displayName = "KMMBridge/Test" - tags = listOf( - "kmm", - "kotlin", - "multiplatform", - "mobile", - "ios", - "xcode", - "framework", - "binary", - "publish", - "consume" - ) + tags = + listOf( + "kmm", + "kotlin", + "multiplatform", + "mobile", + "ios", + "xcode", + "framework", + "binary", + "publish", + "consume", + ) } } } @@ -66,4 +69,4 @@ mavenPublishing { pomFromGradleProperties() @Suppress("UnstableApiUsage") configureBasedOnAppliedPlugins() -} \ No newline at end of file +} diff --git a/kmmbridge-test/src/main/kotlin/Extensions.kt b/kmmbridge-test/src/main/kotlin/Extensions.kt index 3a0c89bc..0287ecc5 100644 --- a/kmmbridge-test/src/main/kotlin/Extensions.kt +++ b/kmmbridge-test/src/main/kotlin/Extensions.kt @@ -29,4 +29,4 @@ fun Project.testUploadArtifacts() { val artifactManager = kmmBridgeExtension.artifactManager artifactManager.set(am) artifactManager.finalizeValue() -} \ No newline at end of file +} diff --git a/kmmbridge-test/src/main/kotlin/co/touchlab/kmmbridge/test/KMMBridgeTestPlugin.kt b/kmmbridge-test/src/main/kotlin/co/touchlab/kmmbridge/test/KMMBridgeTestPlugin.kt index 0283acad..75a2250b 100644 --- a/kmmbridge-test/src/main/kotlin/co/touchlab/kmmbridge/test/KMMBridgeTestPlugin.kt +++ b/kmmbridge-test/src/main/kotlin/co/touchlab/kmmbridge/test/KMMBridgeTestPlugin.kt @@ -3,5 +3,4 @@ package co.touchlab.kmmbridge.test import co.touchlab.kmmbridge.BaseKMMBridgePlugin @Suppress("unused") -class KMMBridgeTestPlugin : BaseKMMBridgePlugin() { -} \ No newline at end of file +class KMMBridgeTestPlugin : BaseKMMBridgePlugin() diff --git a/kmmbridge-test/src/main/kotlin/co/touchlab/kmmbridge/test/TestArtifactManager.kt b/kmmbridge-test/src/main/kotlin/co/touchlab/kmmbridge/test/TestArtifactManager.kt index a1d782d6..e4c5b5ac 100644 --- a/kmmbridge-test/src/main/kotlin/co/touchlab/kmmbridge/test/TestArtifactManager.kt +++ b/kmmbridge-test/src/main/kotlin/co/touchlab/kmmbridge/test/TestArtifactManager.kt @@ -2,25 +2,20 @@ package co.touchlab.kmmbridge.test import co.touchlab.kmmbridge.KmmBridgeExtension import co.touchlab.kmmbridge.artifactmanager.ArtifactManager +import java.io.File import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.tasks.TaskProvider import org.gradle.kotlin.dsl.getByType -import java.io.File class TestArtifactManager : ArtifactManager { private lateinit var url: String - override fun configure( - project: Project, - version: String, - uploadTask: TaskProvider, - kmmPublishTask: TaskProvider - ) { + override fun configure(project: Project, version: String, uploadTask: TaskProvider, kmmPublishTask: TaskProvider) { url = "test://$version" } override fun deployArtifact(task: Task, zipFilePath: File, version: String): String = url } -internal val Project.kmmBridgeExtension get() = extensions.getByType() \ No newline at end of file +internal val Project.kmmBridgeExtension get() = extensions.getByType() diff --git a/kmmbridge-test/src/main/kotlin/co/touchlab/kmmbridge/test/TestUploadArtifactManager.kt b/kmmbridge-test/src/main/kotlin/co/touchlab/kmmbridge/test/TestUploadArtifactManager.kt index b24c329a..a908631c 100644 --- a/kmmbridge-test/src/main/kotlin/co/touchlab/kmmbridge/test/TestUploadArtifactManager.kt +++ b/kmmbridge-test/src/main/kotlin/co/touchlab/kmmbridge/test/TestUploadArtifactManager.kt @@ -2,6 +2,8 @@ package co.touchlab.kmmbridge.test import co.touchlab.kmmbridge.artifactmanager.ArtifactManager import com.google.gson.Gson +import java.io.File +import java.time.Duration import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.OkHttpClient import okhttp3.Request @@ -9,8 +11,6 @@ import okhttp3.RequestBody import okhttp3.RequestBody.Companion.asRequestBody import org.gradle.api.GradleException import org.gradle.api.Task -import java.io.File -import java.time.Duration /** * Simple artifact manager that posts files to our server (Touchlab). This isn't designed for general usage. Just for @@ -19,14 +19,24 @@ import java.time.Duration internal class TestUploadArtifactManager(private val server: String, private val code: String) : ArtifactManager { override fun deployArtifact(task: Task, zipFilePath: File, version: String): String { val body: RequestBody = zipFilePath.asRequestBody("application/octet-stream".toMediaTypeOrNull()) - val uploadRequest = Request.Builder().url( - "https://$server/infoadmin/storeTestZip" - ).post(body).addHeader("code", code) - .addHeader("Content-Type", "application/octet-stream").build() + val uploadRequest = + Request + .Builder() + .url( + "https://$server/infoadmin/storeTestZip", + ).post(body) + .addHeader("code", code) + .addHeader("Content-Type", "application/octet-stream") + .build() val okHttpClient = - OkHttpClient.Builder().callTimeout(Duration.ofMinutes(5)).connectTimeout(Duration.ofMinutes(2)) - .writeTimeout(Duration.ofMinutes(5)).readTimeout(Duration.ofMinutes(2)).build() + OkHttpClient + .Builder() + .callTimeout(Duration.ofMinutes(5)) + .connectTimeout(Duration.ofMinutes(2)) + .writeTimeout(Duration.ofMinutes(5)) + .readTimeout(Duration.ofMinutes(2)) + .build() val response = okHttpClient.newCall(uploadRequest).execute() if (response.code >= 400) { @@ -40,4 +50,4 @@ internal class TestUploadArtifactManager(private val server: String, private val } data class UploadReply(var url: String) -} \ No newline at end of file +} diff --git a/kmmbridge/build.gradle.kts b/kmmbridge/build.gradle.kts index 6a5a304b..8ef7b6ca 100644 --- a/kmmbridge/build.gradle.kts +++ b/kmmbridge/build.gradle.kts @@ -20,6 +20,7 @@ plugins { id("java-gradle-plugin") alias(libs.plugins.maven.publish) id("com.gradle.plugin-publish") version "1.0.0" + id("org.jlleitschuh.gradle.ktlint") } @Suppress("UnstableApiUsage") @@ -33,18 +34,19 @@ gradlePlugin { id = "co.touchlab.kmmbridge" implementationClass = "co.touchlab.kmmbridge.KMMBridgePlugin" displayName = "KMMBridge for Teams" - tags = listOf( - "kmm", - "kotlin", - "multiplatform", - "mobile", - "ios", - "xcode", - "framework", - "binary", - "publish", - "consume" - ) + tags = + listOf( + "kmm", + "kotlin", + "multiplatform", + "mobile", + "ios", + "xcode", + "framework", + "binary", + "publish", + "consume", + ) } } } @@ -71,4 +73,4 @@ mavenPublishing { pomFromGradleProperties() @Suppress("UnstableApiUsage") configureBasedOnAppliedPlugins() -} \ No newline at end of file +} diff --git a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/Constants.kt b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/Constants.kt index 27d54694..cae074c0 100644 --- a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/Constants.kt +++ b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/Constants.kt @@ -1,4 +1,4 @@ package co.touchlab.kmmbridge public const val TASK_GROUP_NAME = "kmmbridge" -public const val EXTENSION_NAME = "kmmbridge" \ No newline at end of file +public const val EXTENSION_NAME = "kmmbridge" diff --git a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/KMMBridge.kt b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/KMMBridge.kt index 5b2e6e90..2ef886f8 100644 --- a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/KMMBridge.kt +++ b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/KMMBridge.kt @@ -22,6 +22,10 @@ import co.touchlab.kmmbridge.internal.layoutBuildDir import co.touchlab.kmmbridge.internal.spmBuildTargets import co.touchlab.kmmbridge.internal.urlFile import co.touchlab.kmmbridge.internal.zipFilePath +import java.io.File +import kotlin.collections.filter +import kotlin.collections.flatMap +import kotlin.collections.forEach import org.gradle.api.Action import org.gradle.api.Plugin import org.gradle.api.Project @@ -37,27 +41,22 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType import org.jetbrains.kotlin.gradle.plugin.mpp.apple.XCFramework import org.jetbrains.kotlin.gradle.plugin.mpp.apple.XCFrameworkConfig -import java.io.File -import kotlin.collections.filter -import kotlin.collections.flatMap -import kotlin.collections.forEach @Suppress("unused") -open class KMMBridgePlugin : BaseKMMBridgePlugin() { -} +open class KMMBridgePlugin : BaseKMMBridgePlugin() abstract class BaseKMMBridgePlugin : Plugin { - override fun apply(project: Project): Unit = with(project) { val extension = extensions.create(EXTENSION_NAME) extension.dependencyManagers.convention(emptyList()) - val defaultNativeBuildType = if (project.findStringProperty("NATIVE_BUILD_TYPE") == "DEBUG") { - NativeBuildType.DEBUG - } else { - NativeBuildType.RELEASE - } + val defaultNativeBuildType = + if (project.findStringProperty("NATIVE_BUILD_TYPE") == "DEBUG") { + NativeBuildType.DEBUG + } else { + NativeBuildType.RELEASE + } extension.buildType.convention(defaultNativeBuildType) @@ -77,7 +76,11 @@ abstract class BaseKMMBridgePlugin : Plugin { var xcFrameworkConfig: XCFrameworkConfig? = null val spmBuildTargets: Set = - project.spmBuildTargets?.split(",")?.map { it.trim() }?.filter { it.isNotEmpty() }?.toSet() ?: emptySet() + project.spmBuildTargets + ?.split(",") + ?.map { it.trim() } + ?.filter { it.isNotEmpty() } + ?.toSet() ?: emptySet() kotlin.targets .withType() @@ -105,18 +108,24 @@ abstract class BaseKMMBridgePlugin : Plugin { } private fun Project.configureLocalDev(kmmBridgeExtension: KmmBridgeExtension) { - (kmmBridgeExtension.dependencyManagers.get() - .find { it is SpmDependencyManager } as? SpmDependencyManager)?.configureLocalDev( - this + ( + kmmBridgeExtension.dependencyManagers + .get() + .find { it is SpmDependencyManager } as? SpmDependencyManager + )?.configureLocalDev( + this, ) } private fun Project.configureArtifactManagerAndDeploy(kmmBridgeExtension: KmmBridgeExtension) { // Early-out with a warning if user hasn't added required config yet, to ensure project still syncs - val artifactManager = kmmBridgeExtension.artifactManager.orNull ?: run { - project.logger.warn("You must apply an artifact manager! Call `artifactManager.set(...)` or a configuration function like `mavenPublishArtifacts()` in your `kmmbridge` block.") - return - } + val artifactManager = + kmmBridgeExtension.artifactManager.orNull ?: run { + project.logger.warn( + "You must apply an artifact manager! Call `artifactManager.set(...)` or a configuration function like `mavenPublishArtifacts()` in your `kmmbridge` block.", + ) + return + } val (zipTask, zipFile) = configureZipTask(kmmBridgeExtension, project.layoutBuildDir) @@ -131,11 +140,12 @@ abstract class BaseKMMBridgePlugin : Plugin { val dependencyManagers = kmmBridgeExtension.dependencyManagers.get() // Publish task depends on the upload task - val publishRemoteTask = tasks.register("kmmBridgePublish") { - description = "Publishes your framework. Uses your KMMBridge block configured in the build gradle to determine details." - group = TASK_GROUP_NAME - dependsOn(uploadTask) - } + val publishRemoteTask = + tasks.register("kmmBridgePublish") { + description = "Publishes your framework. Uses your KMMBridge block configured in the build gradle to determine details." + group = TASK_GROUP_NAME + dependsOn(uploadTask) + } // MavenPublishArtifactManager is somewhat complex because we have to hook into maven publishing // If you are exploring the task dependencies, be aware of that code @@ -146,42 +156,39 @@ abstract class BaseKMMBridgePlugin : Plugin { } } - private fun Project.configureUploadTask( - zipTask: TaskProvider, - zipFile: File, - artifactManager: ArtifactManager - ) = tasks.register("uploadXCFramework") { - group = TASK_GROUP_NAME - - dependsOn(zipTask) - inputs.file(zipFile) - outputs.files(urlFile) - outputs.upToDateWhen { false } // We want to always upload when this task is called - val versionLocal = version - val urlFileLocal = urlFile - - @Suppress("ObjectLiteralToLambda") - doLast(object : Action { - override fun execute(t: Task) { - logger.info("Uploading XCFramework version $versionLocal") - val deployUrl = artifactManager.deployArtifact(this@register, zipFile, versionLocal.toString()) - urlFileLocal.writeText(deployUrl) - } - }) - } - - private fun Project.configureZipTask( - kmmBridgeExtension: KmmBridgeExtension, - buildDir: File - ): Pair, File> { - val zipFile = zipFilePath() - val zipTask = tasks.register("zipXCFramework") { + private fun Project.configureUploadTask(zipTask: TaskProvider, zipFile: File, artifactManager: ArtifactManager) = + tasks.register("uploadXCFramework") { group = TASK_GROUP_NAME - from("$buildDir/XCFrameworks/${kmmBridgeExtension.buildType.get().getName()}") - destinationDirectory.set(zipFile.parentFile) - archiveFileName.set(zipFile.name) + + dependsOn(zipTask) + inputs.file(zipFile) + outputs.files(urlFile) + outputs.upToDateWhen { false } // We want to always upload when this task is called + val versionLocal = version + val urlFileLocal = urlFile + + @Suppress("ObjectLiteralToLambda") + doLast( + object : Action { + override fun execute(t: Task) { + logger.info("Uploading XCFramework version $versionLocal") + val deployUrl = artifactManager.deployArtifact(this@register, zipFile, versionLocal.toString()) + urlFileLocal.writeText(deployUrl) + } + }, + ) } + private fun Project.configureZipTask(kmmBridgeExtension: KmmBridgeExtension, buildDir: File): Pair, File> { + val zipFile = zipFilePath() + val zipTask = + tasks.register("zipXCFramework") { + group = TASK_GROUP_NAME + from("$buildDir/XCFrameworks/${kmmBridgeExtension.buildType.get().getName()}") + destinationDirectory.set(zipFile.parentFile) + archiveFileName.set(zipFile.name) + } + return Pair(zipTask, zipFile) } } diff --git a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/KmmBridgeExtension.kt b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/KmmBridgeExtension.kt index 80dbdd0e..f1b3c4b1 100644 --- a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/KmmBridgeExtension.kt +++ b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/KmmBridgeExtension.kt @@ -58,8 +58,8 @@ interface KmmBridgeExtension { accessKeyId, secretAccessKey, makeArtifactsPublic, - altBaseUrl - ) + altBaseUrl, + ), ) } @@ -72,15 +72,15 @@ interface KmmBridgeExtension { repository: String? = null, publication: String? = null, artifactSuffix: String? = null, - isMavenCentral: Boolean = false + isMavenCentral: Boolean = false, ) { artifactManager.setAndFinalize( MavenPublishArtifactManager( publication, artifactSuffix, repository, - isMavenCentral - ) + isMavenCentral, + ), ) } @@ -100,13 +100,14 @@ interface KmmBridgeExtension { swiftToolVersion: String = SwiftToolVersion.Default, targetPlatforms: TargetPlatformDsl.() -> Unit = { iOS { v("13") } }, ) { - val dependencyManager = SpmDependencyManager( - spmDirectory, - useCustomPackageFile, - perModuleVariablesBlock, - swiftToolVersion, - targetPlatforms - ) + val dependencyManager = + SpmDependencyManager( + spmDirectory, + useCustomPackageFile, + perModuleVariablesBlock, + swiftToolVersion, + targetPlatforms, + ) dependencyManagers.set(dependencyManagers.getOrElse(emptyList()) + dependencyManager) } @@ -118,16 +119,13 @@ interface KmmBridgeExtension { * @param verboseErrors Output extra error info. Generally used if publishing fails. Defaults to false. */ @Suppress("unused") - fun Project.cocoapods( - specRepoUrl: String, - allowWarnings: Boolean = true, - verboseErrors: Boolean = false, - ) { + fun Project.cocoapods(specRepoUrl: String, allowWarnings: Boolean = true, verboseErrors: Boolean = false) { kotlin.cocoapods // This will throw error if we didn't apply cocoapods plugin - val dependencyManager = CocoapodsDependencyManager({ - SpecRepo.Private(specRepoUrl) - }, allowWarnings, verboseErrors) + val dependencyManager = + CocoapodsDependencyManager({ + SpecRepo.Private(specRepoUrl) + }, allowWarnings, verboseErrors) dependencyManagers.set(dependencyManagers.getOrElse(emptyList()) + dependencyManager) } @@ -139,10 +137,7 @@ interface KmmBridgeExtension { * @param verboseErrors Output extra error info. Generally used if publishing fails. Defaults to false. */ @Suppress("unused") - fun Project.cocoapodsTrunk( - allowWarnings: Boolean = true, - verboseErrors: Boolean = false, - ) { + fun Project.cocoapodsTrunk(allowWarnings: Boolean = true, verboseErrors: Boolean = false) { kotlin.cocoapods // This will throw error if we didn't apply cocoapods plugin val dependencyManager = CocoapodsDependencyManager({ SpecRepo.Trunk }, allowWarnings, verboseErrors) diff --git a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/ProjectExtensions.kt b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/ProjectExtensions.kt index 35039102..abd9c23c 100644 --- a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/ProjectExtensions.kt +++ b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/ProjectExtensions.kt @@ -18,13 +18,13 @@ import org.gradle.api.plugins.ExtraPropertiesExtension import org.gradle.api.publish.PublishingExtension import org.gradle.kotlin.dsl.getByType - val Project.publishingExtension get() = extensions.getByType() fun Project.findStringProperty(name: String): String? { rootProject.extensions.getByType(ExtraPropertiesExtension::class.java).run { - if (has(name)) + if (has(name)) { return get(name).toString() + } } return null } diff --git a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/artifactmanager/ArtifactManager.kt b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/artifactmanager/ArtifactManager.kt index 3796db1a..5640874d 100644 --- a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/artifactmanager/ArtifactManager.kt +++ b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/artifactmanager/ArtifactManager.kt @@ -13,29 +13,23 @@ package co.touchlab.kmmbridge.artifactmanager +import java.io.File import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.tasks.TaskProvider -import java.io.File /** * Publishes XCFramework zip files to where they are hosted in the cloud. */ interface ArtifactManager { - /** * Run during Gradle project config. */ - fun configure( - project: Project, - version: String, - uploadTask: TaskProvider, - kmmPublishTask: TaskProvider - ) { + fun configure(project: Project, version: String, uploadTask: TaskProvider, kmmPublishTask: TaskProvider) { } /** * Run during task execution. With custom implementations, be careful not to break Gradle config cache rules. */ fun deployArtifact(task: Task, zipFilePath: File, version: String): String -} \ No newline at end of file +} diff --git a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/artifactmanager/AwsS3PublicArtifactManager.kt b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/artifactmanager/AwsS3PublicArtifactManager.kt index 80af4627..0ed418c0 100644 --- a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/artifactmanager/AwsS3PublicArtifactManager.kt +++ b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/artifactmanager/AwsS3PublicArtifactManager.kt @@ -14,6 +14,8 @@ package co.touchlab.kmmbridge.artifactmanager import co.touchlab.kmmbridge.internal.kmmBridgeExtension +import java.io.File +import java.util.UUID import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.tasks.TaskProvider @@ -24,8 +26,6 @@ import software.amazon.awssdk.services.s3.S3Client import software.amazon.awssdk.services.s3.S3Configuration import software.amazon.awssdk.services.s3.model.HeadObjectRequest import software.amazon.awssdk.services.s3.model.PutObjectRequest -import java.io.File -import java.util.* internal class AwsS3PublicArtifactManager( private val s3Region: String, @@ -35,15 +35,9 @@ internal class AwsS3PublicArtifactManager( private val makeArtifactsPublic: Boolean, private val altBaseUrl: String?, ) : ArtifactManager { - lateinit var frameworkName: String - override fun configure( - project: Project, - version: String, - uploadTask: TaskProvider, - kmmPublishTask: TaskProvider - ) { + override fun configure(project: Project, version: String, uploadTask: TaskProvider, kmmPublishTask: TaskProvider) { frameworkName = project.kmmBridgeExtension.frameworkName.get() } @@ -59,8 +53,8 @@ internal class AwsS3PublicArtifactManager( * @see uploadArtifact */ private fun deployUrl(zipFileName: String): String { - val baseUrl = altBaseUrl ?: "https://${s3Bucket}.s3.${s3Region}.amazonaws.com" - return "${baseUrl}/$zipFileName" + val baseUrl = altBaseUrl ?: "https://$s3Bucket.s3.$s3Region.amazonaws.com" + return "$baseUrl/$zipFileName" } /** @@ -70,37 +64,44 @@ internal class AwsS3PublicArtifactManager( */ @Suppress("NAME_SHADOWING") private fun uploadArtifact(zipFilePath: File, fileName: String) { - val s3Client = S3Client.builder() - .serviceConfiguration(S3Configuration.builder().pathStyleAccessEnabled(true).build()) - .region(Region.of(s3Region)) - .credentialsProvider { - AwsBasicCredentials.create( - s3AccessKeyId, - s3SecretAccessKey - ) - } - .build() + val s3Client = + S3Client + .builder() + .serviceConfiguration(S3Configuration.builder().pathStyleAccessEnabled(true).build()) + .region(Region.of(s3Region)) + .credentialsProvider { + AwsBasicCredentials.create( + s3AccessKeyId, + s3SecretAccessKey, + ) + }.build() s3Client.use { s3Client -> - val headObjectRequest = HeadObjectRequest.builder() - .bucket(s3Bucket) - .key(fileName) - .build() + val headObjectRequest = + HeadObjectRequest + .builder() + .bucket(s3Bucket) + .key(fileName) + .build() - val exists = try { - s3Client.headObject(headObjectRequest).sdkHttpResponse().isSuccessful - } catch (e: Exception) { - false - } + val exists = + try { + s3Client.headObject(headObjectRequest).sdkHttpResponse().isSuccessful + } catch (e: Exception) { + false + } if (!exists) { - val builder = PutObjectRequest.builder() - .bucket(s3Bucket) - .key(fileName) + val builder = + PutObjectRequest + .builder() + .bucket(s3Bucket) + .key(fileName) - if (makeArtifactsPublic) + if (makeArtifactsPublic) { builder.acl("public-read") + } val putObjectRequest = builder.build() @@ -116,5 +117,5 @@ internal class AwsS3PublicArtifactManager( */ private fun obscureFileName(frameworkName: String, versionString: String): String { val randomId = UUID.randomUUID().toString() - return "${frameworkName}-${versionString}-${randomId}.xcframework.zip" + return "$frameworkName-$versionString-$randomId.xcframework.zip" } diff --git a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/artifactmanager/MavenPublishArtifactManager.kt b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/artifactmanager/MavenPublishArtifactManager.kt index ebd6be01..6d806740 100644 --- a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/artifactmanager/MavenPublishArtifactManager.kt +++ b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/artifactmanager/MavenPublishArtifactManager.kt @@ -2,6 +2,7 @@ package co.touchlab.kmmbridge.artifactmanager import co.touchlab.kmmbridge.internal.capitalized import co.touchlab.kmmbridge.publishingExtension +import java.io.File import org.gradle.api.GradleException import org.gradle.api.Project import org.gradle.api.Task @@ -12,7 +13,6 @@ import org.gradle.api.publish.maven.MavenPublication import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.bundling.Zip import org.gradle.kotlin.dsl.getByType -import java.io.File private const val FRAMEWORK_PUBLICATION_NAME = "KMMBridgeFramework" private const val KMMBRIDGE_ARTIFACT_SUFFIX = "kmmbridge" @@ -27,24 +27,20 @@ internal class MavenPublishArtifactManager( lateinit var kmmbridgeArtifactId: String lateinit var mavenArtifactRepositoryUrl: String - override fun configure( - project: Project, - version: String, - uploadTask: TaskProvider, - kmmPublishTask: TaskProvider - ) { + override fun configure(project: Project, version: String, uploadTask: TaskProvider, kmmPublishTask: TaskProvider) { this.group = project.group.toString().replace(".", "/") this.kmmbridgeArtifactId = "${project.name}-${artifactSuffix ?: KMMBRIDGE_ARTIFACT_SUFFIX}" this.mavenArtifactRepositoryUrl = project.evaluateRepoUrl() project.publishingExtension.publications.create( publicationName ?: FRAMEWORK_PUBLICATION_NAME, - MavenPublication::class.java + MavenPublication::class.java, ) { this.version = version - val archiveProvider = project.tasks.named("zipXCFramework", Zip::class.java).flatMap { - it.archiveFile - } + val archiveProvider = + project.tasks.named("zipXCFramework", Zip::class.java).flatMap { + it.archiveFile + } artifact(archiveProvider) { extension = "zip" } @@ -74,9 +70,7 @@ internal class MavenPublishArtifactManager( * doesn't tell you anything about the remote URLs that it's creating, it's inferred based on * maven's well known conventions. */ - override fun deployArtifact(task: Task, zipFilePath: File, version: String): String { - return artifactPath(mavenArtifactRepositoryUrl, version) - } + override fun deployArtifact(task: Task, zipFilePath: File, version: String): String = artifactPath(mavenArtifactRepositoryUrl, version) private fun Project.evaluateRepoUrl(): String { val publishingExtension = project.extensions.getByType() @@ -96,7 +90,10 @@ internal class MavenPublishArtifactManager( // Either the user has supplied a correct name, or we use the default. If neither is found, fail. val publicationNameCap = - publishingExtension.publications.getByName(publicationName ?: FRAMEWORK_PUBLICATION_NAME).name.capitalized() + publishingExtension.publications + .getByName(publicationName ?: FRAMEWORK_PUBLICATION_NAME) + .name + .capitalized() return publishingExtension.repositories.filterIsInstance().map { repo -> val repositoryName = repo.name.capitalized() @@ -106,25 +103,23 @@ internal class MavenPublishArtifactManager( } } - private fun findArtifactRepository(publishingExtension: PublishingExtension): MavenArtifactRepository = - repositoryName?.let { - publishingExtension.repositories.findByName(it) as MavenArtifactRepository - } ?: publishingExtension.repositories.filterIsInstance().firstOrNull() + private fun findArtifactRepository(publishingExtension: PublishingExtension): MavenArtifactRepository = repositoryName?.let { + publishingExtension.repositories.findByName(it) as MavenArtifactRepository + } ?: publishingExtension.repositories.filterIsInstance().firstOrNull() ?: throw GradleException( "Artifact repository not found, please, specify maven repository\n" + - "publishing {\n" + - " repositories {\n" + - " maven {\n" + - " url = uri(\"https://someservice/path/to/repo\")\n" + - " credentials {\n" + - " username = publishUsername\n" + - " password = publishPassword\n" + - " }\n" + - " }\n" + - " }\n" + - "}" + "publishing {\n" + + " repositories {\n" + + " maven {\n" + + " url = uri(\"https://someservice/path/to/repo\")\n" + + " credentials {\n" + + " username = publishUsername\n" + + " password = publishPassword\n" + + " }\n" + + " }\n" + + " }\n" + + "}", ) - private fun artifactPath(url: String, version: String) = - "$url/$group/$kmmbridgeArtifactId/$version/$kmmbridgeArtifactId-$version.zip" + private fun artifactPath(url: String, version: String) = "$url/$group/$kmmbridgeArtifactId/$version/$kmmbridgeArtifactId-$version.zip" } diff --git a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/dependencymanager/CocoapodsDependencyManager.kt b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/dependencymanager/CocoapodsDependencyManager.kt index 3adad55e..ad613027 100644 --- a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/dependencymanager/CocoapodsDependencyManager.kt +++ b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/dependencymanager/CocoapodsDependencyManager.kt @@ -19,6 +19,10 @@ import co.touchlab.kmmbridge.internal.kmmBridgeExtension import co.touchlab.kmmbridge.internal.kotlin import co.touchlab.kmmbridge.internal.layoutBuildDir import co.touchlab.kmmbridge.internal.urlFile +import java.io.ByteArrayOutputStream +import java.io.File +import java.nio.charset.Charset +import javax.inject.Inject import org.gradle.api.Action import org.gradle.api.Project import org.gradle.api.Task @@ -35,13 +39,10 @@ import org.jetbrains.kotlin.gradle.plugin.cocoapods.CocoapodsExtension.PodspecPl import org.jetbrains.kotlin.gradle.plugin.cocoapods.KotlinCocoapodsPlugin import org.jetbrains.kotlin.gradle.plugin.mpp.Framework import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget -import java.io.ByteArrayOutputStream -import java.io.File -import java.nio.charset.Charset -import javax.inject.Inject internal sealed class SpecRepo { object Trunk : SpecRepo() + class Private(val url: String) : SpecRepo() } @@ -60,11 +61,10 @@ internal data class SafeCocoapodsData( val license: String?, val authors: String?, val summary: String?, - val podsDependencies: String + val podsDependencies: String, ) -private abstract class PodPushValueSource : ValueSource { - +private abstract class PodPushValueSource : ValueSource { @get:Inject abstract val execOperations: ExecOperations @@ -73,12 +73,13 @@ private abstract class PodPushValueSource : ValueSource override fun obtain(): String { val output = ByteArrayOutputStream() - val result = execOperations.exec { - command() - standardOutput = output - // Exit Value handled below - isIgnoreExitValue = true - } + val result = + execOperations.exec { + command() + standardOutput = output + // Exit Value handled below + isIgnoreExitValue = true + } val outputString = String(output.toByteArray(), Charset.defaultCharset()) if (result.exitValue != 0) { // Handling the exception ourselves @@ -89,7 +90,6 @@ private abstract class PodPushValueSource : ValueSource } private abstract class PodPrivatePushValueSource : PodPushValueSource() { - interface Params : ValueSourceParameters { var specUrl: String var podSpecFile: File @@ -103,13 +103,12 @@ private abstract class PodPrivatePushValueSource : PodPushValueSource() { - interface Params : ValueSourceParameters { var podSpecFile: File var extras: Array @@ -117,115 +116,131 @@ private abstract class PodTrunkPushValueSource : PodPushValueSource SpecRepo, private val allowWarnings: Boolean, - private val verboseErrors: Boolean + private val verboseErrors: Boolean, ) : DependencyManager { - override fun configure( providers: ProviderFactory, project: Project, version: String, uploadTask: TaskProvider, - publishRemoteTask: TaskProvider + publishRemoteTask: TaskProvider, ) { - val podSpecFile = - project.file("${project.layoutBuildDir}/kmmbridge/podspec/${project.kmmBridgeExtension.buildType.get().name.lowercase()}/${project.kotlin.cocoapods.name}.podspec") - - val generatePodspecTask = project.tasks.register("generateReleasePodspec") { - inputs.files(project.urlFile) - outputs.file(podSpecFile) - dependsOn(uploadTask) - - val cocoapodsExtension = project.kotlin.cocoapods - - val safeCocoapodsData = SafeCocoapodsData( - cocoapodsExtension.ios, - cocoapodsExtension.osx, - cocoapodsExtension.tvos, - cocoapodsExtension.watchos, - cocoapodsExtension.extraSpecAttributes, - cocoapodsExtension.version, - cocoapodsExtension.name, - cocoapodsExtension.homepage, - cocoapodsExtension.license, - cocoapodsExtension.authors, - cocoapodsExtension.summary, - cocoapodsExtension.pods.joinToString(separator = "\n") { pod -> - val versionSuffix = if (pod.version != null) ", '${pod.version}'" else "" - "| spec.dependency '${pod.name}'$versionSuffix" - } + project.file( + "${project.layoutBuildDir}/kmmbridge/podspec/${project.kmmBridgeExtension.buildType.get().name.lowercase()}/${project.kotlin.cocoapods.name}.podspec", ) - val urlFileLocal = project.urlFile - val frameworkName = findFrameworkName(project) - - @Suppress("ObjectLiteralToLambda") - doLast(object : Action { - override fun execute(t: Task) { - generatePodspec( - safeCocoapodsData, urlFileLocal, version, podSpecFile, frameworkName + val generatePodspecTask = + project.tasks.register("generateReleasePodspec") { + inputs.files(project.urlFile) + outputs.file(podSpecFile) + dependsOn(uploadTask) + + val cocoapodsExtension = project.kotlin.cocoapods + + val safeCocoapodsData = + SafeCocoapodsData( + cocoapodsExtension.ios, + cocoapodsExtension.osx, + cocoapodsExtension.tvos, + cocoapodsExtension.watchos, + cocoapodsExtension.extraSpecAttributes, + cocoapodsExtension.version, + cocoapodsExtension.name, + cocoapodsExtension.homepage, + cocoapodsExtension.license, + cocoapodsExtension.authors, + cocoapodsExtension.summary, + cocoapodsExtension.pods.joinToString(separator = "\n") { pod -> + val versionSuffix = if (pod.version != null) ", '${pod.version}'" else "" + "| spec.dependency '${pod.name}'$versionSuffix" + }, ) - } - }) - } - val pushRemotePodspecTask = project.tasks.register("pushRemotePodspec") { - group = TASK_GROUP_NAME - inputs.files(podSpecFile) - dependsOn(generatePodspecTask) - outputs.upToDateWhen { false } // We want to always upload when this task is called - - val allowWarningsLocal = allowWarnings - val verboseErrorsLocal = verboseErrors - val specRepo = specRepoDeferred() - - @Suppress("ObjectLiteralToLambda") - doLast(object : Action { - override fun execute(t: Task) { - val extras = mutableListOf() - - if (allowWarningsLocal) { - extras.add("--allow-warnings") - } - - if (verboseErrorsLocal) { - extras.add("--verbose") - } - - when (specRepo) { - is SpecRepo.Trunk -> { - val podPushProvider = providers.of(PodTrunkPushValueSource::class) { - parameters { - this.podSpecFile = podSpecFile - this.extras = extras.toTypedArray() - } - } - t.logger.info(podPushProvider.get()) + val urlFileLocal = project.urlFile + val frameworkName = findFrameworkName(project) + + @Suppress("ObjectLiteralToLambda") + doLast( + object : Action { + override fun execute(t: Task) { + generatePodspec( + safeCocoapodsData, + urlFileLocal, + version, + podSpecFile, + frameworkName, + ) } + }, + ) + } + + val pushRemotePodspecTask = + project.tasks.register("pushRemotePodspec") { + group = TASK_GROUP_NAME + inputs.files(podSpecFile) + dependsOn(generatePodspecTask) + outputs.upToDateWhen { false } // We want to always upload when this task is called + + val allowWarningsLocal = allowWarnings + val verboseErrorsLocal = verboseErrors + val specRepo = specRepoDeferred() + + @Suppress("ObjectLiteralToLambda") + doLast( + object : Action { + override fun execute(t: Task) { + val extras = mutableListOf() + + if (allowWarningsLocal) { + extras.add("--allow-warnings") + } + + if (verboseErrorsLocal) { + extras.add("--verbose") + } - is SpecRepo.Private -> { - val podPushProvider = providers.of(PodPrivatePushValueSource::class) { - parameters { - this.specUrl = specRepo.url - this.podSpecFile = podSpecFile - this.extras = extras.toTypedArray() + when (specRepo) { + is SpecRepo.Trunk -> { + val podPushProvider = + providers.of(PodTrunkPushValueSource::class) { + parameters { + this.podSpecFile = podSpecFile + this.extras = extras.toTypedArray() + } + } + t.logger.info(podPushProvider.get()) + } + + is SpecRepo.Private -> { + val podPushProvider = + providers.of(PodPrivatePushValueSource::class) { + parameters { + this.specUrl = specRepo.url + this.podSpecFile = podSpecFile + this.extras = extras.toTypedArray() + } + } + t.logger.info(podPushProvider.get()) } } - t.logger.info(podPushProvider.get()) } - } - } - }) - } + }, + ) + } publishRemoteTask.configure { dependsOn(pushRemotePodspecTask) @@ -236,16 +251,20 @@ internal class CocoapodsDependencyManager( } private fun findFrameworkName(project: Project): Provider { - val anyPodFramework = project.provider { - val anyTarget = project.kotlin.targets - .withType(KotlinNativeTarget::class.java) - .matching { it.konanTarget.family.isAppleFamily }.first() - val anyFramework = anyTarget.binaries - .matching { it.name.startsWith(KotlinCocoapodsPlugin.POD_FRAMEWORK_PREFIX) } - .withType(Framework::class.java) - .first() - anyFramework - } + val anyPodFramework = + project.provider { + val anyTarget = + project.kotlin.targets + .withType(KotlinNativeTarget::class.java) + .matching { it.konanTarget.family.isAppleFamily } + .first() + val anyFramework = + anyTarget.binaries + .matching { it.name.startsWith(KotlinCocoapodsPlugin.POD_FRAMEWORK_PREFIX) } + .withType(Framework::class.java) + .first() + anyFramework + } return anyPodFramework.map { it.baseName } } @@ -259,13 +278,21 @@ private fun generatePodspec( urlFile: File, projectVersion: String, outputFile: File, - frameworkName: Provider + frameworkName: Provider, ) = with(safeCocoapodsData) { - val deploymentTargets = run { - listOf(ios, osx, tvos, watchos).filter { it.deploymentTarget != null }.joinToString("\n") { - if (extraSpecAttributes.containsKey("${it.name}.deployment_target")) "" else "| spec.${it.name}.deployment_target = '${it.deploymentTarget}'" + val deploymentTargets = + run { + listOf(ios, osx, tvos, watchos).filter { it.deploymentTarget != null }.joinToString("\n") { + if (extraSpecAttributes.containsKey( + "${it.name}.deployment_target", + ) + ) { + "" + } else { + "| spec.${it.name}.deployment_target = '${it.deploymentTarget}'" + } + } } - } val dependencies = podsDependencies @@ -292,7 +319,7 @@ private fun generatePodspec( homepage.orEmpty().surroundWithSingleQuotesIfNeeded() } | spec.source = { - | :http => '${url}', + | :http => '$url', | :type => 'zip', | :headers => ["Accept: application/octet-stream"] | } @@ -309,7 +336,7 @@ private fun generatePodspec( $dependencies $customSpec |end - """.trimMargin() + """.trimMargin(), ) } diff --git a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/dependencymanager/DependencyManager.kt b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/dependencymanager/DependencyManager.kt index 0fb026ca..a0863cc1 100644 --- a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/dependencymanager/DependencyManager.kt +++ b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/dependencymanager/DependencyManager.kt @@ -28,7 +28,7 @@ interface DependencyManager { project: Project, version: String, uploadTask: TaskProvider, - publishRemoteTask: TaskProvider + publishRemoteTask: TaskProvider, ) { } @@ -36,4 +36,4 @@ interface DependencyManager { * True if this type of dependency needs git tags to function properly (currently SPM true, Cocoapods false) */ val needsGitTags: Boolean -} \ No newline at end of file +} diff --git a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/dependencymanager/SpmDependencyManager.kt b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/dependencymanager/SpmDependencyManager.kt index 719a0d98..2fb6ce56 100644 --- a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/dependencymanager/SpmDependencyManager.kt +++ b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/dependencymanager/SpmDependencyManager.kt @@ -25,6 +25,11 @@ import co.touchlab.kmmbridge.internal.kotlin import co.touchlab.kmmbridge.internal.layoutBuildDir import co.touchlab.kmmbridge.internal.urlFile import co.touchlab.kmmbridge.internal.zipFilePath +import java.io.ByteArrayOutputStream +import java.io.File +import java.nio.charset.Charset +import java.util.Locale +import javax.inject.Inject import org.gradle.api.Action import org.gradle.api.Project import org.gradle.api.Task @@ -37,11 +42,6 @@ import org.gradle.process.ExecOperations import org.gradle.process.internal.ExecException import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType -import java.io.ByteArrayOutputStream -import java.io.File -import java.nio.charset.Charset -import java.util.* -import javax.inject.Inject internal class SpmDependencyManager( /** @@ -59,11 +59,12 @@ internal class SpmDependencyManager( */ private fun Project.findRepoRoot(projectDir: File): String { val result = providers.of(GitRevParseValue::class.java) {}.get() - val repoRootFile = if (result == "") { - projectDir - } else { - File(result) - } + val repoRootFile = + if (result == "") { + projectDir + } else { + File(result) + } return repoRootFile.toString() } @@ -77,12 +78,13 @@ internal class SpmDependencyManager( project: Project, version: String, uploadTask: TaskProvider, - publishRemoteTask: TaskProvider + publishRemoteTask: TaskProvider, ) { val extension = project.kmmBridgeExtension val projectDir = project.projectDir - val swiftToolVersion = SwiftToolVersion.of(_swiftToolVersion) - ?: throw IllegalArgumentException("Parameter swiftToolVersion should be not blank!") + val swiftToolVersion = + SwiftToolVersion.of(_swiftToolVersion) + ?: throw IllegalArgumentException("Parameter swiftToolVersion should be not blank!") val platforms = swiftTargetPlatforms(project) val swiftPackageFile = project.swiftPackageFile(project.rootDir) @@ -91,42 +93,46 @@ internal class SpmDependencyManager( project.logger.error(buildPackageFileErrorMessage(packageName, perModuleVariablesBlock)) } - val updatePackageSwiftTask = project.tasks.register("updatePackageSwift") { - group = TASK_GROUP_NAME - val zipFile = project.zipFilePath() - inputs.files(zipFile, project.urlFile) - outputs.files(swiftPackageFile) - - val urlFile = project.urlFile - - @Suppress("ObjectLiteralToLambda") - doLast(object : Action { - override fun execute(t: Task) { - val checksum = providers.findSpmChecksum(zipFile, projectDir) - val url = urlFile.readText() - if (useCustomPackageFile && hasKmmbridgeVariablesSection( - swiftPackageFile, - packageName - ) - ) { - modifyPackageFileVariables(swiftPackageFile, packageName, url, checksum) - } else if (useCustomPackageFile) { - // We warned you earlier, but you didn't fix it, so now we interrupt the publish process because it's - // probably not going to do what you want - error(buildPackageFileErrorMessage(packageName, perModuleVariablesBlock)) - } else { - writePackageFile( - swiftPackageFile, - extension.frameworkName.get(), - url, - checksum, - swiftToolVersion, - platforms - ) - } - } - }) - } + val updatePackageSwiftTask = + project.tasks.register("updatePackageSwift") { + group = TASK_GROUP_NAME + val zipFile = project.zipFilePath() + inputs.files(zipFile, project.urlFile) + outputs.files(swiftPackageFile) + + val urlFile = project.urlFile + + @Suppress("ObjectLiteralToLambda") + doLast( + object : Action { + override fun execute(t: Task) { + val checksum = providers.findSpmChecksum(zipFile, projectDir) + val url = urlFile.readText() + if (useCustomPackageFile && + hasKmmbridgeVariablesSection( + swiftPackageFile, + packageName, + ) + ) { + modifyPackageFileVariables(swiftPackageFile, packageName, url, checksum) + } else if (useCustomPackageFile) { + // We warned you earlier, but you didn't fix it, so now we interrupt the publish process because it's + // probably not going to do what you want + error(buildPackageFileErrorMessage(packageName, perModuleVariablesBlock)) + } else { + writePackageFile( + swiftPackageFile, + extension.frameworkName.get(), + url, + checksum, + swiftToolVersion, + platforms, + ) + } + } + }, + ) + } updatePackageSwiftTask.configure { dependsOn(uploadTask) } publishRemoteTask.configure { dependsOn(updatePackageSwiftTask) } @@ -137,20 +143,15 @@ internal class SpmDependencyManager( return swiftPackageFile.readText().contains(startTag) } - private fun modifyPackageFileVariables( - swiftPackageFile: File, - packageName: String, - url: String, - checksum: String, - ) { + private fun modifyPackageFileVariables(swiftPackageFile: File, packageName: String, url: String, checksum: String) { swiftPackageFile.writeText( getModifiedPackageFileText( swiftPackageFile.readText(), packageName, perModuleVariablesBlock, url, - checksum - ) + checksum, + ), ) } @@ -160,9 +161,8 @@ internal class SpmDependencyManager( url: String, checksum: String, swiftToolVersion: SwiftToolVersion, - platforms: String + platforms: String, ) { - val packageText = makePackageFileText( packageName, @@ -170,7 +170,7 @@ internal class SpmDependencyManager( checksum, perModuleVariablesBlock, swiftToolVersion, - platforms + platforms, ) swiftPackageFile.parentFile.mkdirs() swiftPackageFile.writeText(packageText) @@ -184,14 +184,15 @@ internal class SpmDependencyManager( swiftPackageFile.writeText("") } - val checksumOut = exec { - commandLine( - "swift", - "package", - "compute-checksum", - zipFilePath.path - ) - }.standardOutput.asText.get() + val checksumOut = + exec { + commandLine( + "swift", + "package", + "compute-checksum", + zipFilePath.path, + ) + }.standardOutput.asText.get() if (!hadPackageSwift) { swiftPackageFile.delete() @@ -201,12 +202,14 @@ internal class SpmDependencyManager( } override val needsGitTags: Boolean = true + fun configureLocalDev(project: Project) { if (useCustomPackageFile) return // No local dev when using a custom package file val extension = project.kmmBridgeExtension - val swiftToolVersion = SwiftToolVersion.of(_swiftToolVersion) - ?: throw IllegalArgumentException("Parameter swiftToolVersion should be not blank!") + val swiftToolVersion = + SwiftToolVersion.of(_swiftToolVersion) + ?: throw IllegalArgumentException("Parameter swiftToolVersion should be not blank!") val platforms = swiftTargetPlatforms(project) project.tasks.register("spmDevBuild") { @@ -219,35 +222,39 @@ internal class SpmDependencyManager( val layoutBuildDir = project.layoutBuildDir @Suppress("ObjectLiteralToLambda") - doLast(object : Action { - override fun execute(t: Task) { - swiftPackageFile.writeText( - makeLocalDevPackageFileText( - swiftPackageFile, - layoutBuildDir, - extension.frameworkName.get(), - swiftToolVersion, - platforms + doLast( + object : Action { + override fun execute(t: Task) { + swiftPackageFile.writeText( + makeLocalDevPackageFileText( + swiftPackageFile, + layoutBuildDir, + extension.frameworkName.get(), + swiftToolVersion, + platforms, + ), ) - ) - } - }) + } + }, + ) } } private fun swiftTargetPlatforms(project: Project): String { - val targetPlatforms = TargetPlatformDsl().apply(_targetPlatforms) - .targetPlatforms - .ifEmpty { - throw IllegalArgumentException("At least one target platform should be specified!") - } + val targetPlatforms = + TargetPlatformDsl() + .apply(_targetPlatforms) + .targetPlatforms + .ifEmpty { + throw IllegalArgumentException("At least one target platform should be specified!") + } val platforms = platforms(project, targetPlatforms) return platforms } - private fun platforms(project: Project, targetPlatforms: List): String = - targetPlatforms.flatMap { platform -> + private fun platforms(project: Project, targetPlatforms: List): String = targetPlatforms + .flatMap { platform -> project.kotlin.targets .withType() .asSequence() @@ -286,12 +293,10 @@ abstract class GitRevParseValue : ValueSource { +private fun kmmBridgeVariablesForPackage(packageName: String, perModuleVariablesBlock: Boolean): Pair { if (!perModuleVariablesBlock) { return "// BEGIN KMMBRIDGE VARIABLES BLOCK (do not edit)" to "// END KMMBRIDGE BLOCK" } @@ -388,8 +391,9 @@ private fun makePackageFileText( checksum: String, perModuleVariablesBlock: Boolean, swiftToolVersion: SwiftToolVersion, - platforms: String -): String = """ + platforms: String, +): String = + """ // swift-tools-version:${swiftToolVersion.name} import PackageDescription @@ -415,14 +419,9 @@ let package = Package( , ] ) -""".trimIndent() + """.trimIndent() -private fun makePackageDetailsText( - packageName: String, - url: String, - checksum: String, - perModuleVariablesBlock: Boolean, -): String { +private fun makePackageDetailsText(packageName: String, url: String, checksum: String, perModuleVariablesBlock: Boolean): String { val (startTag, endTag) = kmmBridgeVariablesForPackage(packageName, perModuleVariablesBlock) val remoteUrlVarName = urlVariableName(packageName, perModuleVariablesBlock) @@ -438,36 +437,30 @@ private fun makePackageDetailsText( """.trimIndent() } -private fun urlVariableName(packageName: String, perModuleVariablesBlock: Boolean): String = - if (perModuleVariablesBlock) { - "remote${packageName}Url" - } else { - "remoteKotlinUrl" - } +private fun urlVariableName(packageName: String, perModuleVariablesBlock: Boolean): String = if (perModuleVariablesBlock) { + "remote${packageName}Url" +} else { + "remoteKotlinUrl" +} -private fun checksumVariableName(packageName: String, perModuleVariablesBlock: Boolean): String = - if (perModuleVariablesBlock) { - "remote${packageName}Checksum" - } else { - "remoteKotlinChecksum" - } +private fun checksumVariableName(packageName: String, perModuleVariablesBlock: Boolean): String = if (perModuleVariablesBlock) { + "remote${packageName}Checksum" +} else { + "remoteKotlinChecksum" +} -private fun packageNameVariableName(packageName: String, perModuleVariablesBlock: Boolean): String = - if (perModuleVariablesBlock) { - "${packageName.replaceFirstChar { it.lowercase(Locale.US) }}PackageName" - } else { - "packageName" - } +private fun packageNameVariableName(packageName: String, perModuleVariablesBlock: Boolean): String = if (perModuleVariablesBlock) { + "${packageName.replaceFirstChar { it.lowercase(Locale.US) }}PackageName" +} else { + "packageName" +} -private fun buildPackageFileErrorMessage( - packageName: String, - perModuleVariablesBlock: Boolean, -): String { +private fun buildPackageFileErrorMessage(packageName: String, perModuleVariablesBlock: Boolean): String { val (beginTag, endTag) = kmmBridgeVariablesForPackage(packageName, perModuleVariablesBlock) return """ - KMMBridge: SPM configured with useCustomPackageFile=true, but no custom variable block detected! Add the following lines to your package file to generate variables for binaryTarget() declaration: - $beginTag - $endTag + KMMBridge: SPM configured with useCustomPackageFile=true, but no custom variable block detected! Add the following lines to your package file to generate variables for binaryTarget() declaration: + $beginTag + $endTag """.trimIndent() -} \ No newline at end of file +} diff --git a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/dsl/TargetPlatformDsl.kt b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/dsl/TargetPlatformDsl.kt index f885ae52..00b7aee0 100644 --- a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/dsl/TargetPlatformDsl.kt +++ b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/dsl/TargetPlatformDsl.kt @@ -24,7 +24,7 @@ public class TargetPlatformDsl { TargetName.IOSx64, TargetName.IOSSimulatorArm64, ), - version + version, ) } @@ -43,7 +43,7 @@ public class TargetPlatformDsl { TargetName.macosArm64, TargetName.macosX64, ), - version + version, ) } @@ -63,7 +63,7 @@ public class TargetPlatformDsl { TargetName.tvosArm64, TargetName.tvosSimulatorArm64, ), - version + version, ) } @@ -85,7 +85,7 @@ public class TargetPlatformDsl { TargetName.watchosDeviceArm64, TargetName.watchosSimulatorArm64, ), - version + version, ) } @@ -106,5 +106,4 @@ public class TargetPlatformDsl { PlatformVersion.of(versionName)?.let { this.version = it } } } - -} \ No newline at end of file +} diff --git a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/ProjectExtensionsInternal.kt b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/ProjectExtensionsInternal.kt index 7b158395..1ab9e1ae 100644 --- a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/ProjectExtensionsInternal.kt +++ b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/ProjectExtensionsInternal.kt @@ -2,6 +2,7 @@ package co.touchlab.kmmbridge.internal import co.touchlab.kmmbridge.KmmBridgeExtension import co.touchlab.kmmbridge.findStringProperty +import java.io.File import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.UnknownTaskException @@ -12,7 +13,6 @@ import org.gradle.kotlin.dsl.getByType import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.plugin.cocoapods.CocoapodsExtension import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType -import java.io.File internal val Project.layoutBuildDir get() = layout.buildDirectory.get().asFile @@ -24,8 +24,9 @@ internal val Project.urlFile get() = file("$layoutBuildDir/kmmbridge/url") // Cocoapods is an extension of KMP extension, so you can't just do project.extensions.getByType() internal val KotlinMultiplatformExtension.cocoapodsOrNull get() = (this as ExtensionAware).extensions.findByType() internal val KotlinMultiplatformExtension.cocoapods - get() = cocoapodsOrNull - ?: error("You must apply the org.jetbrains.kotlin.native.cocoapods plugin to use cocoapods() configuration") + get() = + cocoapodsOrNull + ?: error("You must apply the org.jetbrains.kotlin.native.cocoapods plugin to use cocoapods() configuration") // This previously defaulted to 'false', but now you can disable it if needed, but otherwise ignore internal val Project.enablePublishing: Boolean @@ -53,7 +54,7 @@ internal fun Project.findXCFrameworkAssembleTask(buildType: NativeBuildType? = n tasks.named(taskWithoutName) }.getOrElse { throw UnknownTaskException( - "Cannot find XCFramework assemble task. Tried $taskWithName and ${taskWithoutName}." + "Cannot find XCFramework assemble task. Tried $taskWithName and $taskWithoutName.", ) } -} \ No newline at end of file +} diff --git a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/StringExtensions.kt b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/StringExtensions.kt index 4c5c8830..acfa25ed 100644 --- a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/StringExtensions.kt +++ b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/StringExtensions.kt @@ -1,9 +1,7 @@ package co.touchlab.kmmbridge.internal -import java.util.* +import java.util.Locale -internal fun String.capitalized(): String { - return this.replaceFirstChar { - if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() - } -} \ No newline at end of file +internal fun String.capitalized(): String = this.replaceFirstChar { + if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() +} diff --git a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/domain/PlatformVersion.kt b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/domain/PlatformVersion.kt index 53de4ca3..0b327788 100644 --- a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/domain/PlatformVersion.kt +++ b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/domain/PlatformVersion.kt @@ -1,12 +1,10 @@ package co.touchlab.kmmbridge.internal.domain internal class PlatformVersion private constructor(private val value: String) { - val name get() = value internal companion object { - internal fun of(version: String): PlatformVersion? = - version.takeIf(String::isNotBlank)?.let(::PlatformVersion) + internal fun of(version: String): PlatformVersion? = version.takeIf(String::isNotBlank)?.let(::PlatformVersion) } override fun equals(other: Any?): Boolean = value == (other as? PlatformVersion)?.value @@ -14,5 +12,4 @@ internal class PlatformVersion private constructor(private val value: String) { override fun hashCode(): Int = value.hashCode() override fun toString() = "PlatformVersion(name='$name')" - -} \ No newline at end of file +} diff --git a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/domain/SwiftToolVersion.kt b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/domain/SwiftToolVersion.kt index fcf452dc..c4ada0bc 100644 --- a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/domain/SwiftToolVersion.kt +++ b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/domain/SwiftToolVersion.kt @@ -1,18 +1,16 @@ package co.touchlab.kmmbridge.internal.domain internal class SwiftToolVersion private constructor(private val value: String) { - val name get() = value internal companion object { + @Suppress("ktlint:standard:property-naming") internal const val Default = "5.3" - internal fun of(version: String): SwiftToolVersion? = - version.takeIf(String::isNotBlank)?.let(::SwiftToolVersion) + internal fun of(version: String): SwiftToolVersion? = version.takeIf(String::isNotBlank)?.let(::SwiftToolVersion) } override fun equals(other: Any?): Boolean = value == (other as? SwiftToolVersion)?.value override fun hashCode(): Int = value.hashCode() - -} \ No newline at end of file +} diff --git a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/domain/TargetName.kt b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/domain/TargetName.kt index ab2073f6..b4416967 100644 --- a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/domain/TargetName.kt +++ b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/domain/TargetName.kt @@ -1,5 +1,6 @@ package co.touchlab.kmmbridge.internal.domain +@Suppress("ktlint:standard:enum-entry-name-case") internal enum class TargetName(val identifier: String) { IOSarm64("iosArm64"), IOSx64("iosX64"), @@ -13,6 +14,5 @@ internal enum class TargetName(val identifier: String) { watchosArm32("watchosArm32"), watchosArm64("watchosArm64"), watchosDeviceArm64("watchosDeviceArm64"), - watchosSimulatorArm64("watchosSimulatorArm64") - ; -} \ No newline at end of file + watchosSimulatorArm64("watchosSimulatorArm64"), +} diff --git a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/domain/TargetPlatform.kt b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/domain/TargetPlatform.kt index 4fca9714..561dc8b3 100644 --- a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/domain/TargetPlatform.kt +++ b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/domain/TargetPlatform.kt @@ -1,6 +1,3 @@ package co.touchlab.kmmbridge.internal.domain -internal data class TargetPlatform( - val version: PlatformVersion, - val targets: List -) \ No newline at end of file +internal data class TargetPlatform(val version: PlatformVersion, val targets: List) diff --git a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/domain/extensions.kt b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/domain/extensions.kt index 0e07dfce..610e5320 100644 --- a/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/domain/extensions.kt +++ b/kmmbridge/src/main/kotlin/co/touchlab/kmmbridge/internal/domain/extensions.kt @@ -1,30 +1,34 @@ +@file:Suppress("ktlint:standard:filename") + package co.touchlab.kmmbridge.internal.domain import org.jetbrains.kotlin.konan.target.Family import org.jetbrains.kotlin.konan.target.KonanTarget internal val Family.swiftPackagePlatformName - get() = when (this) { - Family.OSX -> "macOS" - Family.IOS -> "iOS" - Family.TVOS -> "tvOS" - Family.WATCHOS -> "watchOS" - else -> null - } + get() = + when (this) { + Family.OSX -> "macOS" + Family.IOS -> "iOS" + Family.TVOS -> "tvOS" + Family.WATCHOS -> "watchOS" + else -> null + } internal val TargetName.konanTarget: KonanTarget - get() = when (this) { - TargetName.IOSarm64 -> KonanTarget.IOS_ARM64 - TargetName.IOSx64 -> KonanTarget.IOS_X64 - TargetName.IOSSimulatorArm64 -> KonanTarget.IOS_SIMULATOR_ARM64 - TargetName.watchosArm32 -> KonanTarget.WATCHOS_ARM32 - TargetName.watchosArm64 -> KonanTarget.WATCHOS_ARM64 - TargetName.watchosX64 -> KonanTarget.WATCHOS_X64 - TargetName.watchosSimulatorArm64 -> KonanTarget.WATCHOS_SIMULATOR_ARM64 - TargetName.tvosArm64 -> KonanTarget.TVOS_ARM64 - TargetName.tvosX64 -> KonanTarget.TVOS_X64 - TargetName.tvosSimulatorArm64 -> KonanTarget.TVOS_SIMULATOR_ARM64 - TargetName.macosX64 -> KonanTarget.MACOS_X64 - TargetName.macosArm64 -> KonanTarget.MACOS_ARM64 - TargetName.watchosDeviceArm64 -> KonanTarget.WATCHOS_DEVICE_ARM64 - } \ No newline at end of file + get() = + when (this) { + TargetName.IOSarm64 -> KonanTarget.IOS_ARM64 + TargetName.IOSx64 -> KonanTarget.IOS_X64 + TargetName.IOSSimulatorArm64 -> KonanTarget.IOS_SIMULATOR_ARM64 + TargetName.watchosArm32 -> KonanTarget.WATCHOS_ARM32 + TargetName.watchosArm64 -> KonanTarget.WATCHOS_ARM64 + TargetName.watchosX64 -> KonanTarget.WATCHOS_X64 + TargetName.watchosSimulatorArm64 -> KonanTarget.WATCHOS_SIMULATOR_ARM64 + TargetName.tvosArm64 -> KonanTarget.TVOS_ARM64 + TargetName.tvosX64 -> KonanTarget.TVOS_X64 + TargetName.tvosSimulatorArm64 -> KonanTarget.TVOS_SIMULATOR_ARM64 + TargetName.macosX64 -> KonanTarget.MACOS_X64 + TargetName.macosArm64 -> KonanTarget.MACOS_ARM64 + TargetName.watchosDeviceArm64 -> KonanTarget.WATCHOS_DEVICE_ARM64 + } diff --git a/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/ArtifactManagerTest.kt b/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/ArtifactManagerTest.kt index a6bf4c5f..f4c653e6 100644 --- a/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/ArtifactManagerTest.kt +++ b/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/ArtifactManagerTest.kt @@ -1,22 +1,24 @@ package co.touchlab.kmmbridge -import org.junit.jupiter.api.Test import java.io.File import kotlin.test.assertEquals import kotlin.test.assertFalse import kotlin.test.assertTrue +import org.junit.jupiter.api.Test class ArtifactManagerTest : BasePluginTest() { override fun testProjectPath(): String = "test-projects/basic" @Test fun runKmmBridgePublishNoPublishingEnabled() { - val result = ProcessHelper.runSh( - "./gradlew kmmBridgePublish " + + val result = + ProcessHelper.runSh( + "./gradlew kmmBridgePublish " + "-PTOUCHLAB_TEST_ARTIFACT_SERVER=api.touchlab.dev " + "-PTOUCHLAB_TEST_ARTIFACT_CODE=${TOUCHLAB_TEST_ARTIFACT_CODE} " + - "--stacktrace", workingDir = testProjectDir - ) + "--stacktrace", + workingDir = testProjectDir, + ) logExecResult(result) assertEquals(1, result.status) } @@ -25,14 +27,15 @@ class ArtifactManagerTest : BasePluginTest() { fun runKmmBridgePublish() { val urlFile = File(testProjectDir, "allshared/build/kmmbridge/url") assertFalse(urlFile.exists()) - val result = ProcessHelper.runSh( - "./gradlew clean kmmBridgePublish " + + val result = + ProcessHelper.runSh( + "./gradlew clean kmmBridgePublish " + "-PENABLE_PUBLISHING=true " + "-PTOUCHLAB_TEST_ARTIFACT_SERVER=api.touchlab.dev " + "-PTOUCHLAB_TEST_ARTIFACT_CODE=${TOUCHLAB_TEST_ARTIFACT_CODE} " + "--stacktrace", - workingDir = testProjectDir - ) + workingDir = testProjectDir, + ) logExecResult(result) assertTrue(urlFile.exists()) @@ -40,4 +43,4 @@ class ArtifactManagerTest : BasePluginTest() { assertTrue(urlValue.startsWith("https://api.touchlab.dev/infoadmin/streamTestZip")) assertEquals(0, result.status) } -} \ No newline at end of file +} diff --git a/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/BasePluginTest.kt b/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/BasePluginTest.kt index fa529eef..c244e02f 100644 --- a/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/BasePluginTest.kt +++ b/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/BasePluginTest.kt @@ -1,11 +1,11 @@ package co.touchlab.kmmbridge +import java.io.File +import java.io.FileInputStream +import java.util.Properties import org.apache.commons.io.FileUtils import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.io.TempDir -import java.io.File -import java.io.FileInputStream -import java.util.* abstract class BasePluginTest { @TempDir @@ -15,6 +15,8 @@ abstract class BasePluginTest { internal lateinit var settingsFile: File internal lateinit var buildFile: File + + @Suppress("ktlint:standard:property-naming") internal lateinit var TOUCHLAB_TEST_ARTIFACT_CODE: String abstract fun testProjectPath(): String @@ -41,10 +43,12 @@ abstract class BasePluginTest { println("Params: ${result.params.joinToString(" ")}") println("Working dir: ${result.workingDir.absolutePath}") - if (result.output.isNotEmpty()) + if (result.output.isNotEmpty()) { println(result.output) - if (result.error.isNotEmpty()) + } + if (result.error.isNotEmpty()) { System.err.println(result.error) + } println("***********END***********") } -} \ No newline at end of file +} diff --git a/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/KmmBridgeExtensionTest.kt b/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/KmmBridgeExtensionTest.kt index 803e7780..e2a54072 100644 --- a/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/KmmBridgeExtensionTest.kt +++ b/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/KmmBridgeExtensionTest.kt @@ -6,15 +6,15 @@ import co.touchlab.kmmbridge.artifactmanager.MavenPublishArtifactManager import co.touchlab.kmmbridge.dependencymanager.CocoapodsDependencyManager import co.touchlab.kmmbridge.dependencymanager.DependencyManager import co.touchlab.kmmbridge.dependencymanager.SpmDependencyManager -import org.gradle.api.Project -import org.gradle.api.provider.Property -import org.gradle.testfixtures.ProjectBuilder -import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType import kotlin.test.BeforeTest import kotlin.test.Ignore import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertTrue +import org.gradle.api.Project +import org.gradle.api.provider.Property +import org.gradle.testfixtures.ProjectBuilder +import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType class KmmBridgeExtensionTest { private lateinit var project: Project @@ -33,7 +33,7 @@ class KmmBridgeExtensionTest { region = "us-east-1", bucket = "test-bucket", accessKeyId = "test-key", - secretAccessKey = "test-secret" + secretAccessKey = "test-secret", ) } @@ -47,7 +47,7 @@ class KmmBridgeExtensionTest { project.mavenPublishArtifacts( repository = "test-repo", publication = "test-pub", - isMavenCentral = true + isMavenCentral = true, ) } @@ -60,7 +60,7 @@ class KmmBridgeExtensionTest { extension.apply { project.spm( spmDirectory = "test-dir", - useCustomPackageFile = true + useCustomPackageFile = true, ) } @@ -74,7 +74,7 @@ class KmmBridgeExtensionTest { extension.apply { project.cocoapodsTrunk( allowWarnings = true, - verboseErrors = true + verboseErrors = true, ) } diff --git a/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/NonKmmBridgeTasksTest.kt b/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/NonKmmBridgeTasksTest.kt index 2a4710c1..71c8d459 100644 --- a/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/NonKmmBridgeTasksTest.kt +++ b/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/NonKmmBridgeTasksTest.kt @@ -1,7 +1,7 @@ package co.touchlab.kmmbridge -import org.junit.jupiter.api.Test import kotlin.test.assertEquals +import org.junit.jupiter.api.Test /** * Tests to ensure KMMBridge doesn't impact non-KMMBridge Gradle operation in any significant way. @@ -11,12 +11,14 @@ class NonKmmBridgeTasksTest : BasePluginTest() { @Test fun runBasicBuild() { - val result = ProcessHelper.runSh( - "./gradlew linkDebugFrameworkIosSimulatorArm64 " + + val result = + ProcessHelper.runSh( + "./gradlew linkDebugFrameworkIosSimulatorArm64 " + "-PTOUCHLAB_TEST_ARTIFACT_SERVER=api.touchlab.dev " + - "-PTOUCHLAB_TEST_ARTIFACT_CODE=${TOUCHLAB_TEST_ARTIFACT_CODE}", workingDir = testProjectDir - ) + "-PTOUCHLAB_TEST_ARTIFACT_CODE=${TOUCHLAB_TEST_ARTIFACT_CODE}", + workingDir = testProjectDir, + ) logExecResult(result) assertEquals(0, result.status) } -} \ No newline at end of file +} diff --git a/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/ProcessHelper.kt b/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/ProcessHelper.kt index e05b8d9a..af2d3222 100644 --- a/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/ProcessHelper.kt +++ b/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/ProcessHelper.kt @@ -7,24 +7,16 @@ import java.io.InputStreamReader import java.util.concurrent.atomic.AtomicReference object ProcessHelper { - fun runSh( - command: String, - envVars: Map = emptyMap(), - workingDir: File = File(".") - ): ExecutionResult { - return runParams("/bin/sh", "-c", command, envVars = envVars, workingDir = workingDir) - } + fun runSh(command: String, envVars: Map = emptyMap(), workingDir: File = File(".")): ExecutionResult = + runParams("/bin/sh", "-c", command, envVars = envVars, workingDir = workingDir) - fun runParams( - vararg params: String, - envVars: Map = emptyMap(), - workingDir: File = File(".") - ): ExecutionResult { + fun runParams(vararg params: String, envVars: Map = emptyMap(), workingDir: File = File(".")): ExecutionResult { val processBuilder = ProcessBuilder(*params) processBuilder.environment().putAll(envVars) processBuilder.directory(workingDir) - val process = processBuilder - .start() + val process = + processBuilder + .start() val stdOut = readProcStream(process.inputStream) val errOut = readProcStream(process.errorStream) @@ -40,19 +32,20 @@ object ProcessHelper { workingDir = workingDir, status = returnValue, output = stdOut.result, - error = errOut.result + error = errOut.result, ) } private fun readProcStream(iStream: InputStream): StreamCatcher { val atom = AtomicReference("") - val t = Thread { - val bufferedReader = BufferedReader(InputStreamReader(iStream)) - val allOut = bufferedReader.readText() + val t = + Thread { + val bufferedReader = BufferedReader(InputStreamReader(iStream)) + val allOut = bufferedReader.readText() - bufferedReader.close() - atom.set(allOut) - } + bufferedReader.close() + atom.set(allOut) + } t.start() @@ -67,10 +60,4 @@ object ProcessHelper { } } -data class ExecutionResult( - val params: List, - val workingDir: File, - val status: Int, - val output: String, - val error: String -) \ No newline at end of file +data class ExecutionResult(val params: List, val workingDir: File, val status: Int, val output: String, val error: String) diff --git a/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/SpmLocalDevTest.kt b/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/SpmLocalDevTest.kt index 59a6d584..6b34f66f 100644 --- a/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/SpmLocalDevTest.kt +++ b/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/SpmLocalDevTest.kt @@ -1,18 +1,20 @@ package co.touchlab.kmmbridge -import org.junit.jupiter.api.Test import kotlin.test.assertEquals +import org.junit.jupiter.api.Test class SpmLocalDevTest : BasePluginTest() { override fun testProjectPath(): String = "test-projects/basic" @Test fun runSpmDevBuild() { - val result = ProcessHelper.runSh( - "./gradlew spmDevBuild --stacktrace " + + val result = + ProcessHelper.runSh( + "./gradlew spmDevBuild --stacktrace " + "-PTOUCHLAB_TEST_ARTIFACT_SERVER=api.touchlab.dev " + - "-PTOUCHLAB_TEST_ARTIFACT_CODE=${TOUCHLAB_TEST_ARTIFACT_CODE}", workingDir = testProjectDir - ) + "-PTOUCHLAB_TEST_ARTIFACT_CODE=${TOUCHLAB_TEST_ARTIFACT_CODE}", + workingDir = testProjectDir, + ) logExecResult(result) assertEquals(0, result.status) } @@ -23,12 +25,14 @@ class SpmLocalDevTest : BasePluginTest() { @Test fun runSpmDevBuildNoGit() { ProcessHelper.runSh("rm -rdf .git", workingDir = testProjectDir) - val result = ProcessHelper.runSh( - "./gradlew spmDevBuild --stacktrace " + + val result = + ProcessHelper.runSh( + "./gradlew spmDevBuild --stacktrace " + "-PTOUCHLAB_TEST_ARTIFACT_SERVER=api.touchlab.dev " + - "-PTOUCHLAB_TEST_ARTIFACT_CODE=${TOUCHLAB_TEST_ARTIFACT_CODE}", workingDir = testProjectDir - ) + "-PTOUCHLAB_TEST_ARTIFACT_CODE=${TOUCHLAB_TEST_ARTIFACT_CODE}", + workingDir = testProjectDir, + ) logExecResult(result) assertEquals(0, result.status) } -} \ No newline at end of file +} diff --git a/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/dependencyManager/PackageFileUpdateTest.kt b/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/dependencyManager/PackageFileUpdateTest.kt index f30132cf..c3ca8efc 100644 --- a/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/dependencyManager/PackageFileUpdateTest.kt +++ b/kmmbridge/src/test/kotlin/co/touchlab/kmmbridge/dependencyManager/PackageFileUpdateTest.kt @@ -7,7 +7,8 @@ import kotlin.test.assertEquals class PackageFileUpdateTest { @Test fun realisticUrlUpdate() { - val oldFile = """ + val oldFile = + """ // swift-tools-version:5.3 import PackageDescription @@ -37,9 +38,10 @@ class PackageFileUpdateTest { , ] ) - """.trimIndent() + """.trimIndent() - val expectedNewFile = """ + val expectedNewFile = + """ // swift-tools-version:5.3 import PackageDescription @@ -69,21 +71,23 @@ class PackageFileUpdateTest { , ] ) - """.trimIndent() - - val newFile = getModifiedPackageFileText( - oldFile, - "TestPackage", - false, - "https://www.example.com/", - "fedcba9876543210" - ) + """.trimIndent() + + val newFile = + getModifiedPackageFileText( + oldFile, + "TestPackage", + false, + "https://www.example.com/", + "fedcba9876543210", + ) assertEquals(expectedNewFile, newFile) } @Test fun indentedVariables() { - val oldFile = """ + val oldFile = + """ // For some reason my variables are indented in a strange way // BEGIN KMMBRIDGE VARIABLES BLOCK (do not edit) let remoteKotlinUrl = "https://www.example.com/" @@ -91,9 +95,10 @@ class PackageFileUpdateTest { let packageName = "TestPackage" // END KMMBRIDGE BLOCK // Fin - """.trimIndent() + """.trimIndent() - val expectedNewFile = """ + val expectedNewFile = + """ // For some reason my variables are indented in a strange way // BEGIN KMMBRIDGE VARIABLES BLOCK (do not edit) let remoteKotlinUrl = "https://www.example.com/" @@ -101,21 +106,23 @@ class PackageFileUpdateTest { let packageName = "TestPackage" // END KMMBRIDGE BLOCK // Fin - """.trimIndent() - - val newFile = getModifiedPackageFileText( - oldFile, - "TestPackage", - false, - "https://www.example.com/", - "fedcba9876543210" - ) + """.trimIndent() + + val newFile = + getModifiedPackageFileText( + oldFile, + "TestPackage", + false, + "https://www.example.com/", + "fedcba9876543210", + ) assertEquals(expectedNewFile, newFile) } @Test fun withMultipleModules() { - val oldFile = """ + val oldFile = + """ // swift-tools-version:5.3 import PackageDescription @@ -159,9 +166,10 @@ class PackageFileUpdateTest { ) ] ) - """.trimIndent() + """.trimIndent() - val expectedNewFile = """ + val expectedNewFile = + """ // swift-tools-version:5.3 import PackageDescription @@ -205,15 +213,16 @@ class PackageFileUpdateTest { ) ] ) - """.trimIndent() - - val newFile = getModifiedPackageFileText( - oldFile, - "TestPackage", - true, - "https://www.example.com/", - "fedcba9876543210" - ) + """.trimIndent() + + val newFile = + getModifiedPackageFileText( + oldFile, + "TestPackage", + true, + "https://www.example.com/", + "fedcba9876543210", + ) assertEquals(expectedNewFile, newFile) } } From fb11d807dfd50e2a1c21eb18f12051d369d37255 Mon Sep 17 00:00:00 2001 From: Kevin Schildhorn Date: Wed, 30 Apr 2025 15:15:27 -0400 Subject: [PATCH 2/2] removing unused imports --- kmmbridge-github/build.gradle.kts | 1 - kmmbridge-gitlab/build.gradle.kts | 1 - kmmbridge-test/build.gradle.kts | 1 - kmmbridge/build.gradle.kts | 1 - 4 files changed, 4 deletions(-) diff --git a/kmmbridge-github/build.gradle.kts b/kmmbridge-github/build.gradle.kts index 42e845cb..2dd4129b 100644 --- a/kmmbridge-github/build.gradle.kts +++ b/kmmbridge-github/build.gradle.kts @@ -20,7 +20,6 @@ plugins { id("java-gradle-plugin") alias(libs.plugins.maven.publish) id("com.gradle.plugin-publish") version "1.0.0" - id("org.jlleitschuh.gradle.ktlint") } @Suppress("UnstableApiUsage") diff --git a/kmmbridge-gitlab/build.gradle.kts b/kmmbridge-gitlab/build.gradle.kts index f2a0178a..0f945f44 100644 --- a/kmmbridge-gitlab/build.gradle.kts +++ b/kmmbridge-gitlab/build.gradle.kts @@ -20,7 +20,6 @@ plugins { id("java-gradle-plugin") alias(libs.plugins.maven.publish) id("com.gradle.plugin-publish") version "1.0.0" - id("org.jlleitschuh.gradle.ktlint") } @Suppress("UnstableApiUsage") diff --git a/kmmbridge-test/build.gradle.kts b/kmmbridge-test/build.gradle.kts index b6a0b428..75a7e606 100644 --- a/kmmbridge-test/build.gradle.kts +++ b/kmmbridge-test/build.gradle.kts @@ -20,7 +20,6 @@ plugins { id("java-gradle-plugin") alias(libs.plugins.maven.publish) id("com.gradle.plugin-publish") version "1.0.0" - id("org.jlleitschuh.gradle.ktlint") } @Suppress("UnstableApiUsage") diff --git a/kmmbridge/build.gradle.kts b/kmmbridge/build.gradle.kts index 8ef7b6ca..e2647502 100644 --- a/kmmbridge/build.gradle.kts +++ b/kmmbridge/build.gradle.kts @@ -20,7 +20,6 @@ plugins { id("java-gradle-plugin") alias(libs.plugins.maven.publish) id("com.gradle.plugin-publish") version "1.0.0" - id("org.jlleitschuh.gradle.ktlint") } @Suppress("UnstableApiUsage")