jps-bootstrap: module may have no production sources

GitOrigin-RevId: d08adeb14126fb1afd41f779591ba49b21ccfc44
This commit is contained in:
Dmitriy.Panov
2023-10-24 22:47:28 +02:00
committed by intellij-monorepo-bot
parent 674fc6cdbb
commit 665856499a
2 changed files with 17 additions and 11 deletions

View File

@@ -9,6 +9,7 @@ import org.jetbrains.intellij.build.dependencies.BuildDependenciesDownloader.dow
import org.jetbrains.intellij.build.dependencies.BuildDependenciesDownloader.extractFileToCacheLocation
import org.jetbrains.intellij.build.dependencies.BuildDependenciesLogging.verbose
import org.jetbrains.jps.model.JpsProject
import org.jetbrains.jps.model.java.JavaSourceRootType
import org.jetbrains.jps.model.java.JpsJavaExtensionService
import org.jetbrains.jps.model.module.JpsModule
import org.jetbrains.jps.util.JpsPathUtil
@@ -26,7 +27,7 @@ object ClassesFromCompileInc {
const val MANIFEST_JSON_HTTP_PASSWORD_ENV_NAME = "JPS_BOOTSTRAP_MANIFEST_JSON_HTTP_PASSWORD"
@Throws(IOException::class, InterruptedException::class)
fun downloadProjectClasses(project: JpsProject, communityRoot: BuildDependenciesCommunityRoot, modules: Collection<JpsModule?>?) {
fun downloadProjectClasses(project: JpsProject, communityRoot: BuildDependenciesCommunityRoot, modules: Collection<JpsModule>) {
val manifestUrl = System.getenv(MANIFEST_JSON_URL_ENV_NAME)
check(!manifestUrl.isNullOrBlank()) { "Env variable '$MANIFEST_JSON_URL_ENV_NAME' is missing or empty" }
verbose("Got manifest json url '$manifestUrl' from $MANIFEST_JSON_URL_ENV_NAME")
@@ -59,22 +60,26 @@ object ClassesFromCompileInc {
}
}
private fun downloadProductionPartsFromMetadataJson(metadataJson: Path, communityRoot: BuildDependenciesCommunityRoot, modules: Collection<JpsModule?>?): Map<JpsModule, Path> {
private fun downloadProductionPartsFromMetadataJson(metadataJson: Path, communityRoot: BuildDependenciesCommunityRoot, modules: Collection<JpsModule>): Map<JpsModule, Path> {
var partsMetadata: CompilationPartsMetadata
Files.newBufferedReader(metadataJson, StandardCharsets.UTF_8).use { manifestReader -> partsMetadata = Gson().fromJson(manifestReader, CompilationPartsMetadata::class.java) }
check(partsMetadata.files!!.isNotEmpty()) { "partsMetadata.files is empty, check $metadataJson" }
check(partsMetadata.files?.isNotEmpty() == true) { "partsMetadata.files is empty, check $metadataJson" }
val tasks: MutableList<Callable<Pair<JpsModule, Path>>> = ArrayList()
for (module in modules!!) {
val c = Callable {
val modulePrefix = "production/" + module!!.name
val hash = partsMetadata.files!![modulePrefix]
?: throw IllegalStateException("Unable to find module output by name '$modulePrefix' in $metadataJson")
for (module in modules) {
val modulePrefix = "production/" + module.name
val hash = partsMetadata.files?.get(modulePrefix)
if (hash == null) {
check(module.getSourceRoots(JavaSourceRootType.SOURCE).none()) {
"Unable to find module output by name '$modulePrefix' in $metadataJson"
}
continue
}
tasks += Callable {
val outputPartUri = URI.create(partsMetadata.serverUrl + "/" + partsMetadata.prefix + "/" + modulePrefix + "/" + hash + ".jar")
val outputPart = downloadFileToCacheLocation(communityRoot, outputPartUri)
val outputPartExtracted = extractFileToCacheLocation(communityRoot, outputPart)
module to outputPartExtracted
}
tasks.add(c)
}
return JpsBootstrapUtil.executeTasksInParallel(tasks).associate { it.first to it.second }
}

View File

@@ -9,6 +9,7 @@ import com.intellij.util.io.URLUtil
import org.jetbrains.intellij.build.dependencies.BuildDependenciesLogging.info
import org.jetbrains.jps.model.JpsElementFactory
import org.jetbrains.jps.model.JpsModel
import org.jetbrains.jps.model.java.JavaSourceRootType
import org.jetbrains.jps.model.java.JpsJavaDependenciesEnumerator
import org.jetbrains.jps.model.java.JpsJavaExtensionService
import org.jetbrains.jps.model.java.JpsJavaSdkType
@@ -71,8 +72,8 @@ object JpsProjectUtils {
// they're ok with missing output directory and a known case
val m = allOutputDirectories[root]
if (m != null) {
val moduleWithEmptySources = m.sourceRoots.isEmpty() ||
m.sourceRoots.all { !it.path.exists() || it.path.listDirectoryEntries().isEmpty() }
val moduleWithEmptySources = m.getSourceRoots(JavaSourceRootType.SOURCE).none() ||
m.sourceRoots.all { !it.path.exists() || it.path.listDirectoryEntries().isEmpty() }
if (moduleWithEmptySources) {
// skip it without error
return@filter false