From d8bae3444635e85cde268574a261f45154b53aee Mon Sep 17 00:00:00 2001 From: Danny Thomas Date: Tue, 26 Apr 2016 11:16:17 -0700 Subject: [PATCH] Fix NPE on unresolved dependencies due to untested branch in align rules --- .../resolutionrules/AlignRulesSpec.groovy | 33 ++++++++++++++++++- .../plugin/resolutionrules/Rules.groovy | 18 ++++++---- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/src/functionalTest/groovy/nebula/plugin/resolutionrules/AlignRulesSpec.groovy b/src/functionalTest/groovy/nebula/plugin/resolutionrules/AlignRulesSpec.groovy index 74b1e59..85c5047 100644 --- a/src/functionalTest/groovy/nebula/plugin/resolutionrules/AlignRulesSpec.groovy +++ b/src/functionalTest/groovy/nebula/plugin/resolutionrules/AlignRulesSpec.groovy @@ -660,12 +660,43 @@ class AlignRulesSpec extends IntegrationSpec { """ when: - def results = runTasks('dependencies', '--configuration', 'compile') + runTasksSuccessfully('dependencies', '--configuration', 'compile') then: noExceptionThrown() } + def 'unresolvable dependencies cause warnings to be output'() { + rulesJsonFile << '''\ + { + "deny": [], "reject": [], "substitute": [], "replace": [], + "align": [ + { + "name": "testNebula", + "group": "com.google.guava", + "reason": "Align guava", + "author": "Example Person ", + "date": "2016-03-17T20:21:20.368Z" + } + ] + } + '''.stripIndent() + + buildFile << """\ + repositories { jcenter() } + dependencies { + compile 'org.slf4j:slf4j-api:1.7.21' + compile 'com.google.guava:guava:oops' + } + """ + + when: + def result = runTasksSuccessfully('dependencies', '--configuration', 'compile') + + then: + result.standardOutput.contains("Cannot resolve all dependencies to align, configuration 'compile' should also fail to resolve") + } + def 'allow skipping an align rule'() { def graph = new DependencyGraphBuilder() .addModule('test.nebula:a:1.0.0') diff --git a/src/main/groovy/nebula/plugin/resolutionrules/Rules.groovy b/src/main/groovy/nebula/plugin/resolutionrules/Rules.groovy index 4c645cb..159804f 100644 --- a/src/main/groovy/nebula/plugin/resolutionrules/Rules.groovy +++ b/src/main/groovy/nebula/plugin/resolutionrules/Rules.groovy @@ -20,6 +20,7 @@ import org.gradle.api.artifacts.* import org.gradle.api.artifacts.component.ComponentSelector import org.gradle.api.artifacts.component.ModuleComponentIdentifier import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.strategy.DefaultVersionComparator +import org.gradle.api.specs.Specs import org.joda.time.DateTime import org.joda.time.DateTimeZone @@ -209,20 +210,23 @@ class AlignRules implements ProjectConfigurationRule { return } - def detached = configuration.copyRecursive() - detached.exclude group: project.group, module: project.name + def copy = configuration.copyRecursive() + copy.exclude group: project.group, module: project.name def artifacts - if (detached.resolvedConfiguration.hasError()) { - project.logger.info('Cannot resolve all dependencies to align') - artifacts = detached.resolvedConfiguration.lenientConfiguration.getArtifacts() + def resolvedConfiguration = copy.resolvedConfiguration + if (resolvedConfiguration.hasError()) { + def lenientConfiguration = resolvedConfiguration.lenientConfiguration + project.logger.info("Cannot resolve all dependencies to align, configuration '${configuration.name}' should also fail to resolve") + artifacts = lenientConfiguration.getArtifacts(Specs.SATISFIES_ALL) } else { - artifacts = detached.resolvedConfiguration.resolvedArtifacts.collect { it.moduleVersion } + artifacts = resolvedConfiguration.resolvedArtifacts } + def moduleVersions = artifacts.collect { it.moduleVersion } def selectedVersion = [:] aligns.each { AlignRule align -> if (align.shouldNotBeSkipped(extension)) { - def matches = artifacts.findAll { ResolvedModuleVersion dep -> align.resolvedMatches(dep) } + def matches = moduleVersions.findAll { ResolvedModuleVersion dep -> align.resolvedMatches(dep) } def versions = matches.collect { ResolvedModuleVersion dep -> dep.id.version }.toUnique() def comparator = new DefaultVersionComparator().asStringComparator() def alignedVersion = versions.max { a, b -> comparator.compare(a, b) }