IJI-1023 plugins validation with org.jetbrains.intellij.plugins:structure-intellij library

GitOrigin-RevId: f81477dcc2f57a032181fd7eb9ea3085e1f6b579
This commit is contained in:
Dmitriy.Panov
2023-02-07 11:00:50 +00:00
committed by intellij-monorepo-bot
parent 4088c847f2
commit be237eccff
10 changed files with 150 additions and 35 deletions
@@ -8,7 +8,6 @@ import java.nio.file.Files
import java.nio.file.Path
import java.util.function.Supplier
@Suppress("unused")
@ApiStatus.Internal
object TeamCityHelper {
val isUnderTeamCity = System.getenv("TEAMCITY_VERSION") != null
@@ -166,5 +166,48 @@
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library name="jetbrains.intellij.plugins.structure" type="repository">
<properties maven-id="org.jetbrains.intellij.plugins:structure-intellij:3.247">
<exclude>
<dependency maven-id="org.jetbrains.kotlin:kotlin-reflect" />
<dependency maven-id="org.jetbrains.kotlin:kotlin-stdlib-common" />
<dependency maven-id="org.jetbrains.kotlin:kotlin-stdlib-jdk7" />
<dependency maven-id="org.jetbrains.kotlin:kotlin-stdlib-jdk8" />
<dependency maven-id="org.jetbrains.kotlin:kotlin-stdlib" />
<dependency maven-id="org.jetbrains:annotations" />
<dependency maven-id="org.apache.commons:commons-compress" />
<dependency maven-id="org.slf4j:slf4j-api" />
<dependency maven-id="com.fasterxml.jackson.core:jackson-annotations" />
<dependency maven-id="com.fasterxml.jackson.core:jackson-core" />
<dependency maven-id="com.fasterxml.jackson.core:jackson-databind" />
<dependency maven-id="org.jsoup:jsoup" />
<dependency maven-id="org.tukaani:xz" />
<dependency maven-id="commons-io:commons-io" />
<dependency maven-id="org.jvnet.staxex:stax-ex" />
<dependency maven-id="org.glassfish.jaxb:txw2" />
<dependency maven-id="org.glassfish.jaxb:jaxb-runtime" />
<dependency maven-id="com.sun.xml.fastinfoset:FastInfoset" />
<dependency maven-id="com.sun.istack:istack-commons-runtime" />
<dependency maven-id="javax.xml.bind:jaxb-api" />
</exclude>
</properties>
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/intellij/plugins/structure-intellij/3.247/structure-intellij-3.247.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/intellij/plugins/structure-base/3.247/structure-base-3.247.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/atteo/evo-inflector/1.3/evo-inflector-1.3.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/org/jdom/jdom2/2.0.6.1/jdom2-2.0.6.1.jar!/" />
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/module/jackson-module-kotlin/2.14.1/jackson-module-kotlin-2.14.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="library" name="jaxb-api" level="project" />
<orderEntry type="library" name="jaxb-runtime" level="project" />
<orderEntry type="library" name="tcServiceMessages" level="project" />
<orderEntry type="library" scope="RUNTIME" name="kotlin-reflect" level="project" />
<orderEntry type="library" scope="RUNTIME" name="javax.activation" level="project" />
<orderEntry type="library" scope="RUNTIME" name="jsoup" level="project" />
</component>
</module>
@@ -4,6 +4,7 @@ package org.jetbrains.intellij.build
import com.intellij.util.xml.dom.readXmlAsModel
import org.jetbrains.annotations.VisibleForTesting
import org.jetbrains.intellij.build.impl.BuildUtils
import org.jetbrains.intellij.build.impl.logging.reportBuildProblem
import org.jetbrains.intellij.build.impl.readSnapshotBuildNumber
import org.jetbrains.jps.model.JpsProject
import java.nio.file.Files
@@ -94,15 +95,11 @@ class ApplicationInfoPropertiesImpl: ApplicationInfoProperties {
val expirationDate = buildDate.plus(30, ChronoUnit.DAYS)
val now = Instant.ofEpochMilli(System.currentTimeMillis())
if (expirationDate < now) {
val msg = "Supplied build date is $buildDate, " +
"so expiration date is in the past, " +
"distribution won't be able to start"
if (buildOptions.isInDevelopmentMode) {
error(msg)
}
else {
println("##teamcity[buildProblem description='$msg']")
}
reportBuildProblem(
"Supplied build date is $buildDate, " +
"so expiration date is in the past, " +
"distribution won't be able to start"
)
}
}
majorReleaseDate == null || majorReleaseDate.startsWith("__") -> {
@@ -12,6 +12,10 @@ import com.intellij.util.containers.MultiMap
import com.intellij.util.io.Compressor
import com.jetbrains.plugin.blockmap.core.BlockMap
import com.jetbrains.plugin.blockmap.core.FileHash
import com.jetbrains.plugin.structure.base.plugin.PluginCreationFail
import com.jetbrains.plugin.structure.base.plugin.PluginCreationSuccess
import com.jetbrains.plugin.structure.base.plugin.PluginProblem
import com.jetbrains.plugin.structure.intellij.plugin.IdePluginManager
import io.opentelemetry.api.common.AttributeKey
import io.opentelemetry.api.common.Attributes
import io.opentelemetry.api.trace.Span
@@ -25,6 +29,7 @@ import org.jetbrains.intellij.build.*
import org.jetbrains.intellij.build.TraceManager.spanBuilder
import org.jetbrains.intellij.build.dependencies.BuildDependenciesCommunityRoot
import org.jetbrains.intellij.build.fus.createStatisticsRecorderBundledMetadataProviderTask
import org.jetbrains.intellij.build.impl.logging.reportBuildProblem
import org.jetbrains.intellij.build.impl.projectStructureMapping.*
import org.jetbrains.intellij.build.io.*
import org.jetbrains.intellij.build.tasks.ZipSource
@@ -50,6 +55,8 @@ import java.util.*
import java.util.concurrent.ConcurrentLinkedQueue
import java.util.function.Predicate
import java.util.stream.Collectors
import kotlin.io.path.exists
import kotlin.io.path.name
/**
* Assembles output of modules to platform JARs (in [BuildPaths.distAllDir]/lib directory),
@@ -161,6 +168,50 @@ class DistributionJARsBuilder {
}
}
private fun validatePlugin(path: Path, context: BuildContext) {
spanBuilder("plugin validation").setAttribute("path", "$path").useWithScope {
if (!path.exists()) {
it.addEvent("path doesn't exist, skipped")
return@useWithScope
}
var id: String? = null
val problems = when (val result = IdePluginManager.createManager().createPlugin(path)) {
is PluginCreationSuccess -> {
id = result.plugin.pluginId
result.unacceptableWarnings
}
is PluginCreationFail -> {
result.errorsAndWarnings
}
}
if (problems.isNotEmpty()) {
val msg = problems.joinToString(
prefix = "${id ?: path}: ",
separator = ". ",
transform = PluginProblem::message
)
when (id) {
// https://youtrack.jetbrains.com/issue/IDEA-308174
"androidx.compose.plugins.idea",
// https://youtrack.jetbrains.com/issue/IDEA-312410
"com.intellij.tasks",
// https://youtrack.jetbrains.com/issue/IDEA-312409
"org.jetbrains.plugins.sass",
// https://youtrack.jetbrains.com/issue/IDEA-312408
"org.toml.lang",
// https://youtrack.jetbrains.com/issue/IDEA-312407
"com.intellij.plugins.webcomponents",
// https://youtrack.jetbrains.com/issue/IDEA-312406
"cucumber-javascript",
// https://youtrack.jetbrains.com/issue/IDEA-312405
"com.jetbrains.plugins.yeoman"
-> context.messages.warning(msg)
else -> reportBuildProblem(msg, identity = "${id ?: path}")
}
}
}
}
// filter out jars with relative paths in name
val productModules: List<String>
get() {
@@ -361,7 +412,7 @@ class DistributionJARsBuilder {
}
// buildPlugins pluginBuilt listener is called concurrently
val pluginsToIncludeInCustomRepository = ConcurrentLinkedQueue<PluginRepositorySpec>()
val pluginSpecs = ConcurrentLinkedQueue<PluginRepositorySpec>()
val autoPublishPluginChecker = loadPluginAutoPublishList(context)
val prepareCustomPluginRepository = context.productProperties.productLayout.prepareCustomPluginRepositoryForPublishedPlugins &&
!context.isStepSkipped(BuildOptions.ARCHIVE_PLUGINS)
@@ -383,10 +434,8 @@ class DistributionJARsBuilder {
defaultPluginVersion
}
val destFile = targetDirectory.resolve("${plugin.directoryName}-$pluginVersion.zip")
if (prepareCustomPluginRepository) {
val pluginXml = moduleOutputPatcher.getPatchedPluginXml(plugin.mainModule)
pluginsToIncludeInCustomRepository.add(PluginRepositorySpec(destFile, pluginXml))
}
val pluginXml = moduleOutputPatcher.getPatchedPluginXml(plugin.mainModule)
pluginSpecs.add(PluginRepositorySpec(destFile, pluginXml))
dirToJar.add(NonBundledPlugin(pluginDirOrFile, destFile, !plugin.enableSymlinksAndExecutableResources))
}
@@ -399,21 +448,24 @@ class DistributionJARsBuilder {
targetDir = autoUploadingDir,
moduleOutputPatcher = moduleOutputPatcher,
context = context)
if (prepareCustomPluginRepository) {
pluginsToIncludeInCustomRepository.add(spec)
}
pluginSpecs.add(spec)
}
for (item in buildKeymapPluginsTask.await()) {
pluginSpecs.add(PluginRepositorySpec(pluginZip = item.first, pluginXml = item.second))
}
if (prepareCustomPluginRepository) {
for (item in buildKeymapPluginsTask.await()) {
pluginsToIncludeInCustomRepository.add(PluginRepositorySpec(pluginZip = item.first, pluginXml = item.second))
}
val list = pluginsToIncludeInCustomRepository.sortedBy { it.pluginZip }
val list = pluginSpecs.sortedBy { it.pluginZip }
generatePluginRepositoryMetaFile(list, nonBundledPluginsArtifacts, context)
generatePluginRepositoryMetaFile(list.filter { it.pluginZip.startsWith(autoUploadingDir) }, autoUploadingDir, context)
}
pluginSpecs.forEach {
if (it.pluginZip.startsWith(autoUploadingDir)) {
launch {
validatePlugin(it.pluginZip, context)
}
}
}
mappings
}
}
@@ -13,6 +13,8 @@ import org.jetbrains.intellij.build.BuildContext
import org.jetbrains.intellij.build.JvmArchitecture
import org.jetbrains.intellij.build.OsFamily
import org.jetbrains.intellij.build.TraceManager
import org.jetbrains.intellij.build.dependencies.TeamCityHelper
import org.jetbrains.intellij.build.impl.logging.reportBuildProblem
import java.io.BufferedInputStream
import java.nio.file.FileSystems
import java.nio.file.Files
@@ -66,10 +68,13 @@ interface OsSpecificDistributionBuilder {
.toSet()
if (unmatchedPatterns.isNotEmpty()) {
context.messages.warning(matchedFiles.joinToString(prefix = "Matched files ${distribution.name}:\n", separator = "\n"))
val msg = unmatchedPatterns.joinToString(prefix = "Unmatched executable permissions patterns in ${distribution.name}: ") {
patterns.getValue(it)
if (TeamCityHelper.isUnderTeamCity) {
reportBuildProblem(
unmatchedPatterns.joinToString(prefix = "Unmatched executable permissions patterns in ${distribution.name}: ") {
patterns.getValue(it)
}
)
}
println("##teamcity[buildProblem description='$msg']")
}
}
}
@@ -21,6 +21,7 @@ import org.jetbrains.intellij.build.*
import org.jetbrains.intellij.build.CompilationTasks.Companion.create
import org.jetbrains.intellij.build.TraceManager.spanBuilder
import org.jetbrains.intellij.build.causal.CausalProfilingOptions
import org.jetbrains.intellij.build.impl.logging.reportBuildProblem
import org.jetbrains.intellij.build.io.runProcess
import org.jetbrains.jps.builders.java.JavaModuleBuildTargetType
import org.jetbrains.jps.incremental.ModuleBuildTarget
@@ -59,8 +60,8 @@ internal class TestingTasksImpl(private val context: CompilationContext, private
}
}
catch (e: Exception) {
val description = e.message?.lineSequence()?.first()?.replace("'", "\"")
println("##teamcity[buildProblem identity='${name.replace(" ", "_")}' description='$description']")
val description = e.message?.lineSequence()?.firstOrNull() ?: ""
reportBuildProblem(description, identity = name)
emptyList()
}
}
@@ -4,8 +4,11 @@ package org.jetbrains.intellij.build.impl.logging
import com.intellij.diagnostic.telemetry.useWithScope
import com.intellij.openapi.util.ThrowableComputable
import com.intellij.util.containers.Stack
import jetbrains.buildServer.messages.serviceMessages.ServiceMessage
import org.jetbrains.annotations.ApiStatus.Internal
import org.jetbrains.intellij.build.*
import org.jetbrains.intellij.build.TraceManager.spanBuilder
import org.jetbrains.intellij.build.dependencies.TeamCityHelper.isUnderTeamCity
import java.io.BufferedWriter
import java.io.PrintWriter
import java.io.StringWriter
@@ -15,6 +18,7 @@ import java.nio.file.StandardCopyOption
import java.nio.file.StandardOpenOption
import java.util.*
import java.util.function.Consumer
import jetbrains.buildServer.messages.serviceMessages.ServiceMessageTypes.BUILD_PORBLEM as BUILD_PROBLEM
class BuildMessagesImpl private constructor(private val logger: BuildMessageLogger,
private val debugLogger: DebugLogger) : BuildMessages {
@@ -22,8 +26,7 @@ class BuildMessagesImpl private constructor(private val logger: BuildMessageLogg
companion object {
fun create(): BuildMessagesImpl {
val underTeamCity = System.getenv("TEAMCITY_VERSION") != null
val mainLoggerFactory = if (underTeamCity) TeamCityBuildMessageLogger.FACTORY else ConsoleBuildMessageLogger.FACTORY
val mainLoggerFactory = if (isUnderTeamCity) TeamCityBuildMessageLogger.FACTORY else ConsoleBuildMessageLogger.FACTORY
val debugLogger = DebugLogger()
return BuildMessagesImpl(logger = CompositeBuildMessageLogger(listOf(mainLoggerFactory(), debugLogger.createLogger())),
debugLogger = debugLogger)
@@ -206,3 +209,18 @@ private class PrintWriterBuildMessageLogger(
disposer.accept(this)
}
}
@Internal
fun reportBuildProblem(description: String, identity: String? = null) {
if (isUnderTeamCity) {
val attributes = mutableMapOf("description" to description)
if (identity != null) {
attributes["identity"] = identity
}
println(ServiceMessage.asString(BUILD_PROBLEM, attributes))
}
else {
error("$identity: $description")
}
}
+1 -1
View File
@@ -5,7 +5,7 @@
<category>Version Controls</category>
<description>
<![CDATA[
Provides integration with <a href="http://github.com/">GitHub</a>.
Provides integration with <a href="https://github.com/">GitHub</a>.
<ul>
<li>Specify your GitHub account to access all of your repositories from the IDE.</li>
<li>Clone repositories, create and review pull requests, create gists, and much more.</li>
+1 -1
View File
@@ -3,7 +3,7 @@
<name>Mercurial</name>
<description>
<![CDATA[
Allows working with <a href="http://www.mercurial-scm.org/">Mercurial version control system</a>.
Allows working with <a href="https://www.mercurial-scm.org/">Mercurial version control system</a>.
The following features are available:
<ul>
<li>Dedicated page under the Version Control node in the Settings/Preferences dialog.</li>
@@ -9,8 +9,8 @@
The Python plug-in provides smart editing for Python scripts. The feature set of the plugin
corresponds to PyCharm IDE Community Edition.
<br>
<a href="http://blog.jetbrains.com/pycharm">PyCharm blog</a><br>
<a href="http://forum.jetbrains.com/forum/PyCharm">Discussion forum</a><br>
<a href="https://blog.jetbrains.com/pycharm">PyCharm blog</a><br>
<a href="https://forum.jetbrains.com/forum/PyCharm">Discussion forum</a><br>
<a href="https://youtrack.jetbrains.com/issues/PY">Issue tracker</a><br>
]]></description>