Skip to content

Commit a718b56

Browse files
committed
feat(builder): don't fetch global exclusions
Signed-off-by: Sam Gammon <[email protected]>
1 parent 8a93525 commit a718b56

File tree

1 file changed

+49
-12
lines changed

1 file changed

+49
-12
lines changed

packages/builder/src/main/kotlin/elide/tooling/jvm/resolver/MavenAetherResolver.kt

Lines changed: 49 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ import org.eclipse.aether.artifact.Artifact
2424
import org.eclipse.aether.artifact.DefaultArtifact
2525
import org.eclipse.aether.collection.CollectRequest
2626
import org.eclipse.aether.graph.Dependency
27+
import org.eclipse.aether.graph.DependencyFilter
28+
import org.eclipse.aether.graph.DependencyNode
2729
import org.eclipse.aether.repository.LocalRepository
2830
import org.eclipse.aether.repository.RemoteRepository
2931
import org.eclipse.aether.repository.RepositoryPolicy
@@ -431,6 +433,10 @@ public class MavenAetherResolver internal constructor (
431433
}
432434
}
433435

436+
private fun registerGlobalExclusions(packages: Iterable<MavenPackage>) {
437+
globalExclusions.addAll(packages)
438+
}
439+
434440
private fun registerPackages(
435441
name: String,
436442
manifest: ElidePackageManifest,
@@ -490,16 +496,16 @@ public class MavenAetherResolver internal constructor (
490496
val repos = state.manifest.dependencies.maven.repositories
491497
val exclusions = state.manifest.dependencies.maven.exclusions
492498

493-
if (exclusions.isNotEmpty()) {
494-
globalExclusions.addAll(exclusions)
495-
}
496499
if (packages.isNotEmpty() || testPackages.isNotEmpty()) {
497500
repos.forEach { repo ->
498501
if (repo.key !in repositories) {
499502
repo.value.name = repo.key
500503
repositories[repo.key] = repo.value
501504
}
502505
}
506+
if (exclusions.isNotEmpty()) registerGlobalExclusions(
507+
exclusions,
508+
)
503509
registerPackages(
504510
"main",
505511
state.manifest,
@@ -629,6 +635,28 @@ public class MavenAetherResolver internal constructor (
629635
}
630636
}
631637

638+
private fun checkIsExcluded(node: DependencyNode): Boolean {
639+
if (node.artifact == null) {
640+
return true // not loaded yet, or a symbolic artifact, like a pom-only dist
641+
}
642+
val coord = buildString {
643+
append(node.artifact.groupId)
644+
append(':')
645+
append(node.artifact.artifactId)
646+
}
647+
val globallyExcluded = globalExclusions.contains(MavenPackage(
648+
group = node.artifact.groupId,
649+
name = node.artifact.artifactId,
650+
classifier = node.artifact.classifier,
651+
coordinate = coord,
652+
))
653+
return when {
654+
// global exclusions take precedence
655+
globallyExcluded -> true
656+
else -> false // not excluded by default
657+
}
658+
}
659+
632660
override suspend fun resolve(scope: CoroutineScope): Sequence<Job> {
633661
check(initialized.value) { "Resolver must be initialized before resolving" }
634662
check(sealed.value) { "Resolver must be sealed before resolving" }
@@ -645,7 +673,11 @@ public class MavenAetherResolver internal constructor (
645673

646674
return sequence {
647675
yield(scope.async {
648-
val dependencyRequest = DependencyRequest(graph, null)
676+
val dependencyRequest = DependencyRequest(graph, object: DependencyFilter {
677+
override fun accept(node: DependencyNode, parents: List<DependencyNode>): Boolean {
678+
return parents.isEmpty() || !checkIsExcluded(node)
679+
}
680+
})
649681
val dependencyResult = system.resolveDependencies(session, dependencyRequest)
650682
logging.debug { "Maven dependency resolution result: $dependencyResult" }
651683
var errors = mutableListOf<Throwable>()
@@ -699,18 +731,23 @@ public class MavenAetherResolver internal constructor (
699731
override val usage: MultiPathUsage? get() = it.type
700732
})
701733
}
702-
}.let { _ ->
734+
}.let { suite ->
703735
ClasspathProvider {
704-
// assemble a class-path from all resolved artifacts for a given spec
705-
// Classpath.from((registryByType[suite] ?: emptyList()).flatMap { pkg ->
706-
// packageArtifacts[pkg]?.files?.map {
707-
// it.toPath()
708-
// } ?: emptyList()
709-
// })
710-
// @TODO don't return all artifacts, only those for the suite
711736
Classpath.from(
712737
packageArtifacts
713738
.filter { it.key !in globalExclusions }
739+
.filter {
740+
when (spec) {
741+
null -> true
742+
else -> when (val usage = registry["${it.key.coordinate}:${it.key.version}"]?.second) {
743+
null -> spec.usage == MultiPathUsage.Compile // can't prove it's for this; include for compile
744+
else -> spec.test(object: ClasspathSpec {
745+
override val name: String? get() = suite?.name
746+
override val usage: MultiPathUsage? get() = usage
747+
})
748+
}
749+
}
750+
}
714751
.flatMap { it.value.files }
715752
.map { it.toPath().absolute() }
716753
.distinct()

0 commit comments

Comments
 (0)