@@ -2,6 +2,7 @@ import com.diffplug.spotless.LineEnding
22import com.vanniktech.maven.publish.MavenPublishPlugin
33import com.vanniktech.maven.publish.MavenPublishPluginExtension
44import io.gitlab.arturbosch.detekt.Detekt
5+ import java.util.zip.ZipFile
56
67plugins {
78 id(Config .gradleMavenPublishPlugin).version(Config .gradleMavenPublishPluginVersion)
@@ -15,7 +16,8 @@ plugins {
1516 id(Config .BuildPlugins .buildConfig).version(Config .BuildPlugins .buildConfigVersion).apply (false )
1617 kotlin(Config .kotlinSerializationPlugin).version(Config .kotlinVersion).apply (false )
1718 id(Config .QualityPlugins .kover).version(Config .QualityPlugins .koverVersion).apply (false )
18- id(Config .QualityPlugins .binaryCompatibility).version(Config .QualityPlugins .binaryCompatibilityVersion).apply (false )
19+ id(Config .QualityPlugins .binaryCompatibility).version(Config .QualityPlugins .binaryCompatibilityVersion)
20+ .apply (false )
1921}
2022
2123allprojects {
@@ -39,8 +41,8 @@ subprojects {
3941 val distributionFilePath =
4042 " ${this .project.buildDir}${sep} distributions${sep}${this .project.name} -${this .project.version} .zip"
4143 val file = File (distributionFilePath)
42- if (! file.exists()) throw IllegalStateException (" Distribution file: $distributionFilePath does not exist" )
43- if (file.length() == 0L ) throw IllegalStateException (" Distribution file: $distributionFilePath is empty" )
44+ if (! file.exists()) throw GradleException (" Distribution file: $distributionFilePath does not exist" )
45+ if (file.length() == 0L ) throw GradleException (" Distribution file: $distributionFilePath is empty" )
4446 }
4547 }
4648
@@ -61,6 +63,98 @@ subprojects {
6163 }
6264}
6365
66+ tasks.register(" validateDistributions" ) {
67+ subprojects {
68+ val subproject = this @subprojects
69+ if (subproject.name == " sentry-kotlin-multiplatform" ) {
70+ subproject.validateKotlinMultiplatformCoreArtifacts()
71+ }
72+ }
73+ }
74+
75+ private fun Project.validateKotlinMultiplatformCoreArtifacts () {
76+ val distributionDir = project.layout.buildDirectory.dir(" distributions" ).get().asFile
77+ val expectedNumOfFiles = 15
78+ val filesList = distributionDir.listFiles()
79+ val actualNumOfFiles = filesList?.size ? : 0
80+
81+ if (actualNumOfFiles == expectedNumOfFiles) {
82+ println (" ✅ Found $actualNumOfFiles distribution files as expected." )
83+ } else {
84+ throw GradleException (" ❌ Expected $expectedNumOfFiles distribution files, but found $actualNumOfFiles " )
85+ }
86+
87+ val baseFileName = " sentry-kotlin-multiplatform"
88+ val platforms = listOf (
89+ " watchosx64" , " watchossimulatorarm64" , " watchosarm64" , " watchosarm32" ,
90+ " tvosx64" , " tvossimulatorarm64" , " tvosarm64" ,
91+ " macosx64" , " macosarm64" ,
92+ " jvm" ,
93+ " iosx64" , " iossimulatorarm64" , " iosarm64" ,
94+ " android"
95+ )
96+
97+ val artifactPaths = buildList {
98+ add(distributionDir.resolve(" $baseFileName -$version .zip" ))
99+ addAll(
100+ platforms.map { platform ->
101+ distributionDir.resolve(" $baseFileName -$platform -$version .zip" )
102+ }
103+ )
104+ }
105+
106+ val commonRequiredEntries = listOf (
107+ " javadoc" ,
108+ " sources" ,
109+ " module" ,
110+ " pom-default.xml"
111+ )
112+
113+ artifactPaths.forEach { artifactFile ->
114+ if (! artifactFile.exists()) {
115+ throw GradleException (" ❌ Artifact file: ${artifactFile.path} does not exist" )
116+ }
117+ if (artifactFile.length() == 0L ) {
118+ throw GradleException (" ❌ Artifact file: ${artifactFile.path} is empty" )
119+ }
120+
121+ ZipFile (artifactFile).use { zip ->
122+ val entries = zip.entries().asSequence().map { it.name }.toList()
123+
124+ commonRequiredEntries.forEach { requiredEntry ->
125+ if (entries.none { it.contains(requiredEntry) }) {
126+ throw GradleException (" ❌ $requiredEntry not found in ${artifactFile.name} " )
127+ } else {
128+ println (" ✅ Found $requiredEntry in ${artifactFile.name} " )
129+ }
130+ }
131+
132+ when {
133+ artifactFile.name.contains(" ios" , ignoreCase = true ) ||
134+ artifactFile.name.contains(" macos" , ignoreCase = true ) ||
135+ artifactFile.name.contains(" watchos" , ignoreCase = true ) ||
136+ artifactFile.name.contains(" tvos" , ignoreCase = true ) -> {
137+ val expectedNumOfKlibFiles = 3
138+ val actualKlibFiles = entries.count { it.contains(" klib" ) }
139+ if (actualKlibFiles != expectedNumOfKlibFiles) {
140+ throw GradleException (" ❌ Expected $expectedNumOfKlibFiles klib files in ${artifactFile.name} , but found $actualKlibFiles " )
141+ } else {
142+ println (" ✅ Found $expectedNumOfKlibFiles klib files in ${artifactFile.name} " )
143+ }
144+ }
145+
146+ artifactFile.name.contains(" android" , ignoreCase = true ) -> {
147+ if (entries.none { it.contains(" aar" ) }) {
148+ throw GradleException (" ❌ aar file not found in ${artifactFile.name} " )
149+ } else {
150+ println (" ✅ Found aar file in ${artifactFile.name} " )
151+ }
152+ }
153+ }
154+ }
155+ }
156+ }
157+
64158subprojects {
65159 if (project.name.contains(" sentry-kotlin-multiplatform" )) {
66160 apply (plugin = Config .dokka)
0 commit comments