From da0eeb0c28b77175aa7be013c1a98909f67fdf07 Mon Sep 17 00:00:00 2001 From: Vyacheslav Gerasimov Date: Thu, 5 Mar 2020 21:30:39 +0300 Subject: [PATCH] Build: Exclude plugin.xml from runtime classpath normalization Version is written to the plugin.xml in every build so we exclude it to improve caching. Add test for kotlin plugin version to checkArtifacts.gradle.kts --- build.gradle.kts | 1 + gradle/checkArtifacts.gradle.kts | 43 ++++++++++++++++++++++---------- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 50a70933fa8..80d6d62a640 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -396,6 +396,7 @@ allprojects { runtimeClasspath { ignore("META-INF/MANIFEST.MF") ignore("META-INF/compiler.version") + ignore("META-INF/plugin.xml") } } diff --git a/gradle/checkArtifacts.gradle.kts b/gradle/checkArtifacts.gradle.kts index e14247ef0f9..ee99f22f266 100644 --- a/gradle/checkArtifacts.gradle.kts +++ b/gradle/checkArtifacts.gradle.kts @@ -10,19 +10,20 @@ val kotlinVersion: String by rootProject.extra val checkMavenArtifacts = tasks.register("checkMavenArtifacts") { doLast { - fileTree(repoDir).checkArtifacts { zip, artifactName -> - if (!artifactName.endsWith("-sources.jar")) - zip.checkCompilerVersion(kotlinVersion)?.let { reportProblem(artifactName, it) } + fileTree(repoDir).checkArtifacts { zip -> + if (!zip.name.endsWith("-sources.jar")) + zip.checkCompilerVersion(kotlinVersion) - zip.checkManifest(kotlinVersion)?.let { reportProblem(artifactName, it) } + zip.checkManifest(kotlinVersion) } } } val checkDist = tasks.register("checkDistArtifacts") { doLast { - fileTree(distDir).checkArtifacts { zip, artifactName -> - zip.checkCompilerVersion(kotlinVersion)?.let { reportProblem(artifactName, it) } + fileTree(distDir).checkArtifacts { zip -> + zip.checkCompilerVersion(kotlinVersion) + zip.checkPluginXmlVersion(kotlinVersion) } } } @@ -32,18 +33,17 @@ tasks.register("checkArtifacts") { dependsOn(checkMavenArtifacts) } -fun FileTree.checkArtifacts(action: (zip: ZipFile, artifactName: String) -> Unit) { +fun FileTree.checkArtifacts(action: (zip: ZipFile) -> Unit) { filter { it.extension == "jar" }.forEach { jar -> val zip = ZipFile(jar) - val artifactName = jar.relativeTo(file(rootDir)).invariantSeparatorsPath if (isTeamcityBuild) - testStarted(artifactName) + testStarted(zip.testName()) - action(zip, artifactName) + action(zip) if (isTeamcityBuild) - testFinished(artifactName) + testFinished(zip.testName()) } } @@ -60,8 +60,25 @@ fun ZipFile.checkCompilerVersion(version: String) = checkZipEntry("META-INF/comp .takeIf { artifactVersion != version } } -fun ZipFile.checkZipEntry(entryName: String, action: (entryStream: InputStream) -> String?): String? = - getEntry(entryName)?.let { entry -> getInputStream(entry).use(action) } +fun ZipFile.checkPluginXmlVersion(version: String) = checkZipEntry("META-INF/plugin.xml") { inputStream -> + val pluginVersion = inputStream.bufferedReader() + .lineSequence() + .mapNotNull { Regex("""([^<]+)""").find(it) } + .firstOrNull() + ?.groupValues + ?.get(1) ?: return@checkZipEntry "Plugin version not found in plugin.xml" + + "Invalid plugin version, expected version starting with '$version', actual: '$pluginVersion'" + .takeIf { !pluginVersion.startsWith(version) } +} + +fun ZipFile.checkZipEntry(entryName: String, action: (entryStream: InputStream) -> String?) { + getEntry(entryName) + ?.let { entry -> getInputStream(entry).use(action) } + ?.let { reportProblem(testName(), it) } +} + +fun ZipFile.testName() = file(name).relativeTo(file(rootDir)).invariantSeparatorsPath fun reportProblem(artifact: String, message: String) { if (isTeamcityBuild)