Skip to content

Commit 059134b

Browse files
committed
Merge pull request #16 from nebula-plugins/npe-on-error
Fix NPE on unresolved dependencies due to untested branch in align rules
2 parents a98ee7c + d8bae34 commit 059134b

File tree

2 files changed

+43
-8
lines changed

2 files changed

+43
-8
lines changed

src/functionalTest/groovy/nebula/plugin/resolutionrules/AlignRulesSpec.groovy

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -660,12 +660,43 @@ class AlignRulesSpec extends IntegrationSpec {
660660
"""
661661

662662
when:
663-
def results = runTasks('dependencies', '--configuration', 'compile')
663+
runTasksSuccessfully('dependencies', '--configuration', 'compile')
664664

665665
then:
666666
noExceptionThrown()
667667
}
668668

669+
def 'unresolvable dependencies cause warnings to be output'() {
670+
rulesJsonFile << '''\
671+
{
672+
"deny": [], "reject": [], "substitute": [], "replace": [],
673+
"align": [
674+
{
675+
"name": "testNebula",
676+
"group": "com.google.guava",
677+
"reason": "Align guava",
678+
"author": "Example Person <person@example.org>",
679+
"date": "2016-03-17T20:21:20.368Z"
680+
}
681+
]
682+
}
683+
'''.stripIndent()
684+
685+
buildFile << """\
686+
repositories { jcenter() }
687+
dependencies {
688+
compile 'org.slf4j:slf4j-api:1.7.21'
689+
compile 'com.google.guava:guava:oops'
690+
}
691+
"""
692+
693+
when:
694+
def result = runTasksSuccessfully('dependencies', '--configuration', 'compile')
695+
696+
then:
697+
result.standardOutput.contains("Cannot resolve all dependencies to align, configuration 'compile' should also fail to resolve")
698+
}
699+
669700
def 'allow skipping an align rule'() {
670701
def graph = new DependencyGraphBuilder()
671702
.addModule('test.nebula:a:1.0.0')

src/main/groovy/nebula/plugin/resolutionrules/Rules.groovy

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import org.gradle.api.artifacts.*
2020
import org.gradle.api.artifacts.component.ComponentSelector
2121
import org.gradle.api.artifacts.component.ModuleComponentIdentifier
2222
import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.strategy.DefaultVersionComparator
23+
import org.gradle.api.specs.Specs
2324
import org.joda.time.DateTime
2425
import org.joda.time.DateTimeZone
2526

@@ -209,20 +210,23 @@ class AlignRules implements ProjectConfigurationRule {
209210
return
210211
}
211212

212-
def detached = configuration.copyRecursive()
213-
detached.exclude group: project.group, module: project.name
213+
def copy = configuration.copyRecursive()
214+
copy.exclude group: project.group, module: project.name
214215
def artifacts
215-
if (detached.resolvedConfiguration.hasError()) {
216-
project.logger.info('Cannot resolve all dependencies to align')
217-
artifacts = detached.resolvedConfiguration.lenientConfiguration.getArtifacts()
216+
def resolvedConfiguration = copy.resolvedConfiguration
217+
if (resolvedConfiguration.hasError()) {
218+
def lenientConfiguration = resolvedConfiguration.lenientConfiguration
219+
project.logger.info("Cannot resolve all dependencies to align, configuration '${configuration.name}' should also fail to resolve")
220+
artifacts = lenientConfiguration.getArtifacts(Specs.SATISFIES_ALL)
218221
} else {
219-
artifacts = detached.resolvedConfiguration.resolvedArtifacts.collect { it.moduleVersion }
222+
artifacts = resolvedConfiguration.resolvedArtifacts
220223
}
221224

225+
def moduleVersions = artifacts.collect { it.moduleVersion }
222226
def selectedVersion = [:]
223227
aligns.each { AlignRule align ->
224228
if (align.shouldNotBeSkipped(extension)) {
225-
def matches = artifacts.findAll { ResolvedModuleVersion dep -> align.resolvedMatches(dep) }
229+
def matches = moduleVersions.findAll { ResolvedModuleVersion dep -> align.resolvedMatches(dep) }
226230
def versions = matches.collect { ResolvedModuleVersion dep -> dep.id.version }.toUnique()
227231
def comparator = new DefaultVersionComparator().asStringComparator()
228232
def alignedVersion = versions.max { a, b -> comparator.compare(a, b) }

0 commit comments

Comments
 (0)