Skip to content

Commit

Permalink
Merge pull request #168 from nebula-plugins/core_locks_update
Browse files Browse the repository at this point in the history
Core locks update
  • Loading branch information
OdysseusLives committed Jul 3, 2019
2 parents 53bb11a + 363c8e8 commit aa27fb0
Show file tree
Hide file tree
Showing 7 changed files with 365 additions and 56 deletions.
5 changes: 0 additions & 5 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -41,15 +41,10 @@ contacts {
}
}

ext {
kotlinVersion = '1.3.11'
}

dependencies {
compile 'com.squareup.moshi:moshi:1.8.0'
compile 'joda-time:joda-time:2.10'
compile 'com.netflix.nebula:nebula-gradle-interop:latest.release'
compile "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
compile 'com.netflix.nebula:gradle-scm-plugin:latest.release'
compile 'com.netflix.nebula:gradle-metrics-plugin:8.+', optional
compile 'org.codehaus.groovy.modules.http-builder:http-builder:0.7.1'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ package nebula.plugin.dependencylock

import nebula.plugin.dependencylock.tasks.GenerateLockTask
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.gradle.api.logging.Logger
import org.gradle.api.logging.Logging

Expand All @@ -31,8 +32,15 @@ class ConfigurationsToLockFinder {
this.project = project
}

List<String> findConfigurationsToLock(Set<String> configurationNames, List<String> additionalBaseConfigurationsToLock = new ArrayList<>()) {
def configurationsToLock = new ArrayList<String>()
List<String> findConfigurationsToLock(Set<String> configurationNames, Collection<String> additionalBaseConfigurationsToLock = new ArrayList<>()) {
Collection<String> gatheredConfigurationNames = gatherConfigurationNames(additionalBaseConfigurationsToLock)
Collection<String> lockableConfigurationNames = gatherLockableConfigurationNames(configurationNames, gatheredConfigurationNames)
Collection<String> sortedLockableConfigNames = lockableConfigurationNames.sort()
return sortedLockableConfigNames
}

private Collection<String> gatherConfigurationNames(Collection<String> additionalBaseConfigurationsToLock) {
def configurationsToLock = new HashSet<String>()
def baseConfigurations = [
'annotationProcessor',
'compileClasspath',
Expand All @@ -42,37 +50,60 @@ class ConfigurationsToLockFinder {

configurationsToLock.addAll(baseConfigurations)

def dependencyLockExtension = project.extensions.findByType(DependencyLockExtension)
def additionalConfigurationsToLock = project.hasProperty('dependencyLock.additionalConfigurationsToLock')
? (project['dependencyLock.additionalConfigurationsToLock'] as String).split(",") as Set<String>
: dependencyLockExtension.additionalConfigurationsToLock as Set<String>
configurationsToLock.addAll(additionalConfigurationsToLock)

def confSuffix = 'CompileClasspath'
def configurationsWithPrefix = project.configurations.findAll { it.name.contains(confSuffix) }
configurationsWithPrefix.each {
def confPrefix = it.name.replace(confSuffix, '')
configurationsToLock.addAll(returnConfigurationNamesWithPrefix(confPrefix, baseConfigurations))
}

// ensure gathered configurations to lock are lockable
def originatingConfigurationsToAlsoLock = new HashSet<String>()
configurationsToLock.each { nameOfConfToLock ->
originatingConfigurationsToAlsoLock.addAll(
findOriginatingConfigurationsOf(nameOfConfToLock, originatingConfigurationsToAlsoLock).collect { it -> it.name }
)
}
configurationsToLock.addAll(originatingConfigurationsToAlsoLock)

return configurationsToLock.sort()
}

private Collection<String> gatherLockableConfigurationNames(Collection<String> configurationNames, Collection<String> gatheredConfigurations) {
def lockableConfigurationNames = []
def lockableConfigurations = GenerateLockTask.lockableConfigurations(project, project, configurationNames)
def lockableConfigurations = GenerateLockTask.lockableConfigurations(project, project, configurationNames as Set)
lockableConfigurations.each {
lockableConfigurationNames.add(it.name)
}
def lockableConfigsToLock = configurationsToLock.findAll {
def lockableConfigsToLock = gatheredConfigurations.findAll {
lockableConfigurationNames.contains(it)
}
lockableConfigsToLock
}

def sortedLockableConfigs = lockableConfigsToLock.sort()
return sortedLockableConfigs
private Collection<Configuration> findOriginatingConfigurationsOf(String nameOfConfToLock, Collection<String> accumulator) {
accumulator.add(nameOfConfToLock)
project.configurations.findAll { conf ->
conf.name == nameOfConfToLock
}.each { conf ->
if (conf.extendsFrom.size() != 0) {
def newConfigs = new HashSet<Configuration>()
conf.extendsFrom.each { newConf ->
if (!accumulator.contains(newConf.name)) {
newConfigs.addAll(findOriginatingConfigurationsOf(newConf.name, accumulator))
}
}
accumulator.addAll(newConfigs.collect { it -> it.name })
return accumulator
} else {
return []
}
}
}

private static List<String> returnConfigurationNamesWithPrefix(it, List<String> baseConfigurations) {
private static Collection<String> returnConfigurationNamesWithPrefix(String prefix, Collection<String> baseConfigurations) {
def configurationNamesWithPrefix = []
baseConfigurations.each { baseConfig ->
configurationNamesWithPrefix.add("${it}${baseConfig.capitalize()}".toString())
configurationNamesWithPrefix.add("${prefix}${baseConfig.capitalize()}".toString())
}
return configurationNamesWithPrefix
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,24 +19,21 @@
package nebula.plugin.dependencylock.utils

import nebula.plugin.dependencylock.ConfigurationsToLockFinder
import nebula.plugin.dependencylock.DependencyLockExtension
import nebula.plugin.dependencylock.tasks.GenerateLockTask
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.gradle.api.logging.Logger
import org.gradle.api.logging.Logging
import org.gradle.api.plugins.JavaBasePlugin
import org.gradle.api.plugins.JavaLibraryPlugin
import org.gradle.api.plugins.JavaPlugin
import org.gradle.util.DeprecationLogger
import org.jetbrains.kotlin.gradle.plugin.KotlinBasePluginWrapper

class CoreLockingHelper {
private Project project

private Boolean shouldLockAllConfigurations

private static final Logger LOGGER = Logging.getLogger(CoreLockingHelper)

private static final String ADDITIONAL_CONFIGS_TO_LOCK = 'dependencyLock.additionalConfigurationsToLock'

CoreLockingHelper(Project project) {
this.project = project
Expand Down Expand Up @@ -65,31 +62,9 @@ class CoreLockingHelper {
}

private void runClosureWhenPluginsAreSeen(Set<String> configurationNames, Closure closure) {
runClosureOnConfigurations(configurationNames, closure, new ArrayList<String>())

project.plugins.withId("nebula.facet") { // FIXME: not working currently
runClosureOnConfigurations(configurationNames, closure, new ArrayList<String>())
}
project.plugins.withId("nebula.integtest") {
runClosureOnConfigurations(configurationNames, closure, new ArrayList<String>())
}
project.plugins.withType(JavaBasePlugin.class) {
runClosureOnConfigurations(configurationNames, closure, new ArrayList<String>())
}
project.plugins.withType(JavaPlugin.class) {
runClosureOnConfigurations(configurationNames, closure, new ArrayList<String>())
}
project.plugins.withType(JavaLibraryPlugin.class) {
runClosureOnConfigurations(configurationNames, closure, new ArrayList<String>())
}
DeprecationLogger.whileDisabled {
//TODO: remove deprecation logger disabled once we upgrade kotlin versions to one without deprecations
project.plugins.withType(KotlinBasePluginWrapper.class) {
runClosureOnConfigurations(configurationNames, closure, new ArrayList<String>())
}
}
project.plugins.withId("nebula.clojure") {
project.plugins.withType(Plugin) { plugin ->
runClosureOnConfigurations(configurationNames, closure, new ArrayList<String>())
findAndLockAdditionalConfigurations(configurationNames, closure)
}
project.plugins.withId("scala") {
// the configurations `incrementalScalaAnalysisFor_x_ extend from `compile` and `implementation` rather than `compileClasspath`
Expand All @@ -106,9 +81,21 @@ class CoreLockingHelper {

runClosureOnConfigurations(configurationNames, closure, scalaConfigurationsToLock)
}
findAndLockAdditionalConfigurations(configurationNames, closure)
}

private void findAndLockAdditionalConfigurations(Set<String> configurationNames, Closure closure) {
def additionalConfigNames = gatherAdditionalConfigurationsToLock()
project.configurations.matching { // returns a live collection
additionalConfigNames.findAll { additionalConfigName ->
it.name == additionalConfigName
}
}.all { it ->
runClosureOnConfigurations(configurationNames, closure, additionalConfigNames)
}
}

private void runClosureOnConfigurations(Set<String> configurationNames, Closure closure, List<String> additionalBaseConfigurationsToLock) {
private void runClosureOnConfigurations(Set<String> configurationNames, Closure closure, Collection<String> additionalBaseConfigurationsToLock) {
Set<Configuration> configurationsToLock
if (shouldLockAllConfigurations) {
configurationsToLock = GenerateLockTask.lockableConfigurations(project, project, configurationNames)
Expand All @@ -121,7 +108,7 @@ class CoreLockingHelper {
}
}

private Set<Configuration> findConfigurationsToLock(Set<String> configurationNames, List<String> additionalBaseConfigurationsToLock) {
private Set<Configuration> findConfigurationsToLock(Set<String> configurationNames, Collection<String> additionalBaseConfigurationsToLock) {
def lockableConfigurationNames = new ConfigurationsToLockFinder(project).findConfigurationsToLock(configurationNames, additionalBaseConfigurationsToLock)

def lockableConfigurations = new HashSet()
Expand All @@ -132,4 +119,14 @@ class CoreLockingHelper {
}
return lockableConfigurations
}

private Collection<String> gatherAdditionalConfigurationsToLock() {
def dependencyLockExtension = project.extensions.findByType(DependencyLockExtension)
def additionalConfigurationsToLockViaProperty = project.hasProperty(ADDITIONAL_CONFIGS_TO_LOCK)
? (project[ADDITIONAL_CONFIGS_TO_LOCK] as String).split(",") as Set<String>
: []
def additionalConfigurationsToLockViaExtension = dependencyLockExtension.additionalConfigurationsToLock as Set<String>
def additionalConfigNames = additionalConfigurationsToLockViaProperty + additionalConfigurationsToLockViaExtension
additionalConfigNames
}
}

0 comments on commit aa27fb0

Please sign in to comment.