project/UpdateWithIDEAInjectionTasks2.scala (74 lines of code) (raw):
import org.apache.commons.io.{FileUtils, FilenameUtils}
import org.jetbrains.sbtidea.Keys.{intellijAttachSources, intellijBaseDirectory, productInfo}
import org.jetbrains.sbtidea.download.idea.IdeaSourcesInstaller
import sbt.Keys.*
import sbt.{Def, File, *}
import scala.jdk.CollectionConverters.collectionAsScalaIterableConverter
/**
* The code inside is very similar to [[org.jetbrains.sbtidea.tasks.UpdateWithIDEAInjectionTask]]
* Consider deduplicating it, extracting common utilites in sbt-idea-plugin
*/
object UpdateWithIDEAInjectionTasks2 {
def getUpdateReportWithIntellijSdkSubsetModuleTask(
intellijSdkSubsetInfo: IntellijSdkSubsetInfo
): Def.Initialize[Task[UpdateReport]] = Def.task {
val intellijBaseDir = intellijBaseDirectory.value
val jars = intellijSdkSubsetInfo.jarsRelativePaths.map(intellijBaseDir / _)
val updateReportOriginal = update.value
val buildNumber = productInfo.value.buildNumber
val attachSources = intellijAttachSources.in(Global).value
injectIntellijSdkSubsetModule(
reportOriginal = updateReportOriginal,
jars = jars,
buildNumber = buildNumber,
intellijBaseDir = intellijBaseDir,
attachSources = attachSources,
artifact = intellijSdkSubsetInfo.artifact,
module = intellijSdkSubsetInfo.modulePrefix % buildNumber,
)
}
private def injectIntellijSdkSubsetModule(
reportOriginal: UpdateReport,
jars: Seq[File],
buildNumber: String,
intellijBaseDir: File,
attachSources: Boolean,
artifact: Artifact,
module: ModuleID,
): UpdateReport = {
val ijSourcesArchives = findSourcesArchives(intellijBaseDir)
val ijSourcesMappings: Seq[(Artifact, File)] =
if (attachSources) ijSourcesArchives.map { file =>
val extension = FilenameUtils.getExtension(file.getName)
//similar to org.jetbrains.sbtidea.tasks.classpath.AttributedClasspathTasks.Artifacts$.ideaSourcesArtifact
val sourcesArtifact = Artifact(name = artifact.name, `type` = Artifact.SourceType, extension = extension)
sourcesArtifact -> file
}
else Seq.empty
val intellijSubsetArtifactMappings: Seq[(Artifact, File)] =
jars.map(artifact -> _) ++ ijSourcesMappings
val injectInfos: Seq[(sbt.ModuleID, Seq[(sbt.Artifact, sbt.File)], Configuration)] = Seq(
(module, intellijSubsetArtifactMappings, Configurations.Compile),
)
val reportNew = injectInfos.foldLeft(reportOriginal) { case (previousReport, (module, artifactMappings, configuration)) =>
injectModulesIntoUpdateReport(previousReport, module, artifactMappings, configuration)
}
reportNew //keep a separate variable for easier debugging
}
private def findSourcesArchives(intellijBaseDir: File): Seq[File] = {
val sourcesDir = IdeaSourcesInstaller.sourcesRoot(intellijBaseDir.toPath).toFile
if (sourcesDir.isDirectory) FileUtils.listFiles(sourcesDir, Array("zip", "jar"), false).asScala.toSeq
else Seq()
}
private def injectModulesIntoUpdateReport(
report: UpdateReport,
module: ModuleID,
artifacts: Seq[(Artifact, File)],
configuration: Configuration,
): UpdateReport = {
val newConfigurationReports = report.configurations.map { confReport =>
if (confReport.configuration.name == configuration.name) {
val newModuleReport = ModuleReport(module, artifacts.toVector, Vector.empty)
val modules = confReport.modules :+ newModuleReport
confReport.withModules(modules)
} else
confReport
}
report.withConfigurations(newConfigurationReports)
}
}