Skip to content

Commit 53a2fc6

Browse files
authored
AlignRule - catch errors with align range and provide exception with rule name for better diagnosis (#91)
1 parent 64b913a commit 53a2fc6

File tree

1 file changed

+45
-40
lines changed

1 file changed

+45
-40
lines changed

src/main/kotlin/nebula/plugin/resolutionrules/alignRule.kt

Lines changed: 45 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.netflix.nebula.interop.selectedId
55
import com.netflix.nebula.interop.selectedModuleVersion
66
import com.netflix.nebula.interop.selectedVersion
77
import org.gradle.api.Action
8+
import org.gradle.api.GradleException
89
import org.gradle.api.Project
910
import org.gradle.api.artifacts.*
1011
import org.gradle.api.artifacts.ModuleVersionIdentifier
@@ -299,53 +300,57 @@ data class AlignRules(val aligns: List<AlignRule>) : Rule {
299300
}
300301

301302
private fun alignedRange(rule: AlignRule, moduleVersions: List<ModuleVersionIdentifier>, configuration: Configuration): VersionWithSelector {
302-
val versions = moduleVersions.mapToSet { VersionWithSelector(it.version) }
303-
check(versions.all { !it.asSelector().isDynamic }) { "A dynamic version was included in $versions for $rule" }
304-
val highestVersion = versions.max()!!
305-
306-
val forcedModules = moduleVersions.flatMap { moduleVersion ->
307-
configuration.resolutionStrategy.forcedModules.filter {
308-
it.group == moduleVersion.group && it.name == moduleVersion.name
303+
try {
304+
val versions = moduleVersions.mapToSet { VersionWithSelector(it.version) }
305+
check(versions.all { !it.asSelector().isDynamic }) { "A dynamic version was included in $versions for $rule" }
306+
val highestVersion = versions.max()!!
307+
308+
val forcedModules = moduleVersions.flatMap { moduleVersion ->
309+
configuration.resolutionStrategy.forcedModules.filter {
310+
it.group == moduleVersion.group && it.name == moduleVersion.name
311+
}
309312
}
310-
}
311313

312-
val forcedDependencies = moduleVersions.flatMap { moduleVersion ->
313-
configuration.dependencies.filter {
314-
it is ExternalDependency && it.isForce && it.group == moduleVersion.group && it.name == moduleVersion.name
314+
val forcedDependencies = moduleVersions.flatMap { moduleVersion ->
315+
configuration.dependencies.filter {
316+
it is ExternalDependency && it.isForce && it.group == moduleVersion.group && it.name == moduleVersion.name
317+
}
318+
}.map {
319+
val moduleIdentifier = DefaultModuleIdentifier.newId(it.group, it.name)
320+
DefaultModuleVersionSelector.newSelector(moduleIdentifier, it.version)
315321
}
316-
}.map {
317-
val moduleIdentifier = DefaultModuleIdentifier.newId(it.group, it.name)
318-
DefaultModuleVersionSelector.newSelector(moduleIdentifier, it.version)
319-
}
320322

321-
val forced = forcedModules + forcedDependencies
322-
if (forced.isNotEmpty()) {
323-
val (dynamic, static) = forced
324-
.mapToSet { VersionWithSelector(it.version!!) }
325-
.partition { it.asSelector().isDynamic }
326-
return if (static.isNotEmpty()) {
327-
val forcedVersion = static.min()!!
328-
logger.debug("Found force(s) $forced that supersede resolution rule $rule. Will use $forcedVersion") // FIXME: What about locks?
329-
forcedVersion
330-
} else {
331-
val mostSpecific = dynamic.minBy {
332-
when (it.asSelector().javaClass.kotlin) {
333-
LatestVersionSelector::class -> 2
334-
SubVersionSelector::class -> 1
335-
VersionRangeSelector::class -> 0
336-
else -> throw IllegalArgumentException("Unknown selector type $it")
337-
}
338-
}!!
339-
val forcedVersion = if (mostSpecific.asSelector() is LatestVersionSelector) {
340-
highestVersion
323+
val forced = forcedModules + forcedDependencies
324+
if (forced.isNotEmpty()) {
325+
val (dynamic, static) = forced
326+
.mapToSet { VersionWithSelector(it.version!!) }
327+
.partition { it.asSelector().isDynamic }
328+
return if (static.isNotEmpty()) {
329+
val forcedVersion = static.min()!!
330+
logger.debug("Found force(s) $forced that supersede resolution rule $rule. Will use $forcedVersion") // FIXME: What about locks?
331+
forcedVersion
341332
} else {
342-
versions.filter { mostSpecific.asSelector().accept(it.stringVersion) }.max()!!
333+
val mostSpecific = dynamic.minBy {
334+
when (it.asSelector().javaClass.kotlin) {
335+
LatestVersionSelector::class -> 2
336+
SubVersionSelector::class -> 1
337+
VersionRangeSelector::class -> 0
338+
else -> throw IllegalArgumentException("Unknown selector type $it")
339+
}
340+
}!!
341+
val forcedVersion = if (mostSpecific.asSelector() is LatestVersionSelector) {
342+
highestVersion
343+
} else {
344+
versions.filter { mostSpecific.asSelector().accept(it.stringVersion) }.max()!!
345+
}
346+
logger.debug("Found force(s) $forced that supersede resolution rule $rule. Will use highest dynamic version $forcedVersion that matches most specific selector $mostSpecific") // FIXME: What about locks?
347+
forcedVersion
343348
}
344-
logger.debug("Found force(s) $forced that supersede resolution rule $rule. Will use highest dynamic version $forcedVersion that matches most specific selector $mostSpecific") // FIXME: What about locks?
345-
forcedVersion
346349
}
347-
}
348350

349-
return highestVersion
351+
return highestVersion
352+
} catch (e: Exception) {
353+
throw GradleException("Could not apply alignment rule ${rule.name} | Reason: ${e.message}", e)
354+
}
350355
}
351356
}

0 commit comments

Comments
 (0)