Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@ licenseReport {
// Defaults to current project and all its subprojects
projects = [project] + project.subprojects

// Select projects to examine their buildScripts / plugins for dependencies.
// Defaults to nothing. Could be configured like [project] + project.subprojects
buildScriptProjects = []

// Adjust the configurations to fetch dependencies. Default is 'runtimeClasspath'
// For Android projects use 'releaseRuntimeClasspath' or 'yourFlavorNameReleaseRuntimeClasspath'
// Use 'ALL' to dynamically resolve all configurations:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import com.github.jk1.license.render.ReportRenderer
import com.github.jk1.license.render.SimpleHtmlReportRenderer
import org.gradle.api.Project
import org.gradle.api.artifacts.ResolvedDependency
import org.gradle.api.initialization.dsl.ScriptHandler
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.Nested
Expand All @@ -32,6 +33,7 @@ class LicenseReportExtension {
public boolean unionParentPomLicenses
public String outputDir
public Project[] projects
public Project[] buildScriptProjects
public ReportRenderer[] renderers
public DependencyDataImporter[] importers
public DependencyFilter[] filters
Expand All @@ -46,6 +48,7 @@ class LicenseReportExtension {
unionParentPomLicenses = true
outputDir = project.layout.buildDirectory.dir("reports/dependency-license").get().asFile.absolutePath
projects = [project] + project.subprojects
buildScriptProjects = []
renderers = new SimpleHtmlReportRenderer()
configurations = null
excludeOwnGroup = true
Expand Down Expand Up @@ -85,6 +88,8 @@ class LicenseReportExtension {
def snapshot = []
snapshot << 'projects'
snapshot += projects.collect { it.path }
snapshot << 'buildScriptProjects'
snapshot += buildScriptProjects.collect { it.path }
snapshot << 'renderers'
snapshot += renderers.collect { it.class.name }
snapshot << 'importers'
Expand Down
20 changes: 20 additions & 0 deletions src/main/groovy/com/github/jk1/license/Model.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,26 @@ package com.github.jk1.license
import groovy.transform.Canonical
import groovy.transform.Sortable
import org.gradle.api.Project
import org.gradle.api.artifacts.ConfigurationContainer
import org.gradle.api.artifacts.dsl.DependencyHandler
import org.gradle.api.initialization.dsl.ScriptHandler
import org.gradle.api.plugins.PluginContainer

@Canonical
class GradleProject {
String name
ConfigurationContainer configurations
DependencyHandler dependencies
PluginContainer plugins

static GradleProject ofProject(Project project) {
return new GradleProject(project.getName(), project.getConfigurations(), project.getDependencies(), project.getPlugins());
}

static GradleProject ofScript(Project project) {
return new GradleProject(project.name + "/buildScript", project.buildscript.getConfigurations(), project.buildscript.getDependencies(), project.getPlugins());
}
}

@Canonical
class ProjectData {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
package com.github.jk1.license.reader

import com.github.jk1.license.ConfigurationData
import com.github.jk1.license.GradleProject
import com.github.jk1.license.LicenseReportExtension
import com.github.jk1.license.task.ReportTask
import org.gradle.api.Project
Expand All @@ -37,7 +38,7 @@ class ConfigurationReader {
this.moduleReader = moduleReader
}

ConfigurationData read(Project project, Configuration configuration) {
ConfigurationData read(GradleProject project, Configuration configuration) {
ConfigurationData data = new ConfigurationData()
data.name = configuration.name

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
*/
package com.github.jk1.license.reader

import com.github.jk1.license.GradleProject
import com.github.jk1.license.LicenseReportExtension
import com.github.jk1.license.ModuleData
import com.github.jk1.license.task.ReportTask
Expand All @@ -29,7 +30,7 @@ import org.gradle.maven.MavenModule
import org.gradle.maven.MavenPomArtifact

interface ModuleReader {
ModuleData read(Project project, ResolvedDependency dependency)
ModuleData read(GradleProject project, ResolvedDependency dependency)
}

class ModuleReaderImpl implements ModuleReader {
Expand All @@ -47,7 +48,7 @@ class ModuleReaderImpl implements ModuleReader {
this.filesReader = new LicenseFilesReader(config)
}

ModuleData read(Project project, ResolvedDependency dependency) {
ModuleData read(GradleProject project, ResolvedDependency dependency) {
ModuleData moduleData = new ModuleData(dependency.moduleGroup, dependency.moduleName, dependency.moduleVersion)
dependency.moduleArtifacts.each { ResolvedArtifact artifact ->
LOGGER.info("Processing artifact: $artifact ($artifact.file)")
Expand Down Expand Up @@ -79,7 +80,7 @@ class ModuleReaderImpl implements ModuleReader {
return moduleData
}

private static Collection<ResolvedArtifactResult> resolvePom(Project project, ResolvedDependency dependency) {
private static Collection<ResolvedArtifactResult> resolvePom(GradleProject project, ResolvedDependency dependency) {
try {
DefaultArtifactResolutionQuery resolutionQuery = (DefaultArtifactResolutionQuery) project.dependencies.createArtifactResolutionQuery()
return resolutionQuery
Expand Down Expand Up @@ -107,7 +108,7 @@ class CachedModuleReader implements ModuleReader {
this.actualReader = new ModuleReaderImpl(config)
}

ModuleData read(Project project, ResolvedDependency dependency) {
ModuleData read(GradleProject project, ResolvedDependency dependency) {
String dataName = "${dependency.moduleGroup}:${dependency.moduleName}:${dependency.moduleVersion}"
return moduleDataCache.computeIfAbsent(dataName) {
actualReader.read(project, dependency)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
*/
package com.github.jk1.license.reader

import com.github.jk1.license.GradleProject
import com.github.jk1.license.License
import com.github.jk1.license.LicenseReportExtension
import com.github.jk1.license.PomData
Expand Down Expand Up @@ -46,7 +47,7 @@ class PomReader {
this.config = config
}

PomData readPomData(Project project, ResolvedArtifact artifact) {
PomData readPomData(GradleProject project, ResolvedArtifact artifact) {
resolver = new CachingArtifactResolver(project)
GPathResult pomContent = findAndSlurpPom(artifact.file)
boolean pomRepresentsArtifact = true
Expand Down Expand Up @@ -74,7 +75,7 @@ class PomReader {
}
}

PomData readPomData(Project project, ResolvedArtifactResult artifact) {
PomData readPomData(GradleProject project, ResolvedArtifactResult artifact) {
resolver = new CachingArtifactResolver(project)
GPathResult pomContent = findAndSlurpPom(artifact.file)
return readPomFile(pomContent)
Expand Down
39 changes: 22 additions & 17 deletions src/main/groovy/com/github/jk1/license/reader/ProjectReader.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
package com.github.jk1.license.reader

import com.github.jk1.license.ConfigurationData
import com.github.jk1.license.GradleProject
import com.github.jk1.license.LicenseReportExtension
import com.github.jk1.license.ProjectData
import com.github.jk1.license.task.ReportTask
Expand All @@ -27,13 +28,15 @@ import org.gradle.api.logging.Logging
class ProjectReader {
private Logger LOGGER = Logging.getLogger(ReportTask.class)

private Project[] projects
private GradleProject[] projects
private GradleProject[] buildScriptProjects
private String[] configurations

private ConfigurationReader configurationReader

ProjectReader(LicenseReportExtension config) {
this.projects = config.projects
this.projects = config.projects.collect { GradleProject.ofProject(it) }
this.buildScriptProjects = config.buildScriptProjects.collect { GradleProject.ofScript(it) }
this.configurations = config.configurations
this.configurationReader = new ConfigurationReader(config, new CachedModuleReader(config))
}
Expand All @@ -43,22 +46,14 @@ class ProjectReader {
data.project = project

LOGGER.info("Configured projects: ${projects.join(',')}")
data.configurations.addAll(readProjects(projects))
LOGGER.info("Configured buildScript projects: ${buildScriptProjects.join(',')}")
data.configurations.addAll(readProjects(buildScriptProjects))

List<ConfigurationData> readConfigurations = projects.collect { subProject ->
Set<Configuration> configurationsToScan = findConfigurationsToScan(subProject)

configurationsToScan.addAll(getAllExtendedConfigurations(configurationsToScan))

LOGGER.info("Configurations(${subProject.name}): ${configurationsToScan.join(',')}")
readConfigurationData(configurationsToScan, subProject)
}.flatten()
readConfigurations = mergeConfigurationDataWithSameName(readConfigurations)

data.configurations.addAll(readConfigurations)
return data
}

private Set<Configuration> findConfigurationsToScan(Project project) {
private Set<Configuration> findConfigurationsToScan(GradleProject project) {
Set<Configuration> toScan
if (configurations == null) {
LOGGER.info("No configurations defined, falling back to the default ones")
Expand All @@ -77,22 +72,32 @@ class ProjectReader {
toScan
}

private static Set<Configuration> findResolvableConfigurations(Project project) {
private static Set<Configuration> findResolvableConfigurations(GradleProject project) {
project.configurations.findAll { config -> isResolvable(config) }
}

private static Set<Configuration> getAllExtendedConfigurations(Collection<Configuration> configurationsToScan) {
configurationsToScan.collect { it.extendsFrom }.flatten().findAll { config -> isResolvable(config) }.toSet()
}

private List<ConfigurationData> readConfigurationData(Collection<Configuration> configurationsToScan, Project project) {
private List<ConfigurationData> readConfigurationData(Collection<Configuration> configurationsToScan, GradleProject project) {
configurationsToScan.collect { config ->
LOGGER.info("Reading configuration: " + config)
configurationReader.read(project, config)
}
}

private Set<Configuration> findConfiguredConfigurations(Project project) {
private List<ConfigurationData> readProjects(GradleProject[] projectsToScan) {
List<ConfigurationData> readConfigurations = projectsToScan.collect { subProject ->
Set<Configuration> configurationsToScan = findConfigurationsToScan(subProject)
configurationsToScan.addAll(getAllExtendedConfigurations(configurationsToScan))
LOGGER.info("Configurations(${subProject.name}): ${configurationsToScan.join(',')}")
readConfigurationData(configurationsToScan, subProject)
}.flatten()
mergeConfigurationDataWithSameName(readConfigurations)
}

private Set<Configuration> findConfiguredConfigurations(GradleProject project) {
project.configurations.findAll { config -> config.name in configurations }
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,7 @@ class ReportTask extends DefaultTask {
def reader = new ProjectReader(config)
// take configurations' shallow snapshot but don't revolve them
def deps = getConfig().projects
.collectMany { reader.findConfigurationsToScan(it) }
.collectMany { it.allDependencies }
.collectMany { reader.read(it).allDependencies }
.collect { it.name + it.group + it.version}
deps
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
*/
package com.github.jk1.license.util

import org.gradle.api.Project
import com.github.jk1.license.GradleProject
import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.Dependency
import org.gradle.api.artifacts.ResolvedArtifact
Expand All @@ -26,9 +26,9 @@ class CachingArtifactResolver {

private static Logger LOGGER = Logging.getLogger(CachingArtifactResolver.class)
private Map<Map<String, String>, Collection<ResolvedArtifact>> cache = new HashMap<>()
private Project project
private GradleProject project

CachingArtifactResolver(Project project) {
CachingArtifactResolver(GradleProject project) {
this.project = project
}

Expand Down
Loading
Loading