|
1 | 1 | // All licenses that we accept, and their aliases |
2 | | -def whitelist = [ |
| 2 | +def allowList = [ |
3 | 3 | [name: 'BSD-2-Clause', url: 'http://opensource.org/licenses/BSD-2-Clause', aliases: [ |
4 | 4 | [name: 'BSD-style', url:'http://www.opensource.org/licenses/bsd-license.php'], |
5 | 5 | ]], |
@@ -48,120 +48,96 @@ def whitelist = [ |
48 | 48 | ]] |
49 | 49 | ] |
50 | 50 |
|
51 | | - |
52 | | -subprojects { |
53 | | - apply plugin: 'base' |
54 | | - apply plugin: "com.github.hierynomus.license" |
55 | | - |
56 | | - // License header checking and insertion |
57 | | - license { |
58 | | - header = rootProject.file("etc/licenses/headers/NOTICE-header.txt") |
59 | | - // what comment style to use |
60 | | - mapping { |
61 | | - scala = 'SLASHSTAR_STYLE' |
| 51 | +// Adapted from https://github.com/neo4j/graph-data-science/blob/2.13/gradle/licensing.gradle |
| 52 | +subprojects { proj -> |
| 53 | + plugins.withType(JavaLibraryPlugin) { |
| 54 | + proj.apply plugin: 'com.github.hierynomus.license' |
| 55 | + // License header checking and insertion |
| 56 | + license { |
| 57 | + header = rootProject.file("etc/licenses/headers/NOTICE-header.txt") |
| 58 | + // what comment style to use |
| 59 | + mapping { |
| 60 | + java = 'SLASHSTAR_STYLE' |
| 61 | + } |
| 62 | + // /issues/145 |
| 63 | + // exclude 'test/resources/**' |
| 64 | + // exclude 'main/resources/**' |
| 65 | + include '**/*.java' |
| 66 | + include '**/*.scala' |
62 | 67 | } |
63 | | - // https://github.com/hierynomus/license-gradle-plugin/issues/145 |
64 | | - // exclude 'test/resources/**' |
65 | | - // exclude 'main/resources/**' |
66 | | - include '**/*.scala' |
67 | | - include '**/*.java' |
68 | | - } |
69 | | - |
70 | | - tasks.check.dependsOn tasks.license |
71 | | - |
72 | | - // Dependency license reporting |
73 | | - downloadLicenses { |
74 | | - |
75 | | - dependencyConfiguration = 'compile' |
76 | | - |
77 | | - aliases = whitelist.collectEntries { lic -> |
78 | | - def actual = license(lic.name, lic.url) |
79 | | - def alternatives = lic.aliases.collect { it.url ? license(it.name, it.url) : it.name } |
80 | | - [(actual): alternatives] |
| 68 | + tasks.check.dependsOn tasks.license |
| 69 | + |
| 70 | + // Dependency license reporting |
| 71 | + downloadLicenses { |
| 72 | + dependencyConfiguration = 'runtimeClasspath' |
| 73 | + aliases = allowList.collectEntries { lic -> |
| 74 | + def actual = license(lic.name, lic.url) |
| 75 | + def alternatives = lic.aliases.collect { it.url ? license(it.name, it.url) : it.name } |
| 76 | + [(actual): alternatives] |
| 77 | + } |
81 | 78 | } |
82 | | - } |
83 | | - |
84 | | - tasks.downloadLicenses.outputs.upToDateWhen { false } |
85 | | - |
86 | | - tasks.downloadLicenses.ext.licencesJson = { -> |
87 | | - def jsonDir = tasks.downloadLicenses.jsonDestination |
88 | | - def jsonFile = file("$jsonDir/license-dependency.json") |
89 | | - new groovy.json.JsonSlurper().parseText(jsonFile.text) |
90 | | - } |
91 | | - |
92 | | - // Dependency license validation |
93 | | - task validateLicenses { |
94 | | - group 'license' |
95 | | - description 'Checks dependency licenses against a whitelist' |
96 | | - dependsOn tasks.downloadLicenses |
97 | 79 |
|
98 | | - doLast { |
99 | | - File errFile = file("$tasks.downloadLicenses.jsonDestination/license-errors.txt") |
100 | | - errFile.text = "" |
101 | | - |
102 | | - tasks.downloadLicenses.licencesJson().licences |
103 | | - .findAll { lic -> !whitelist.any { lic.name == it.name } } |
104 | | - .sort { lic -> lic.name } |
105 | | - .each { lic -> logger.error("The license '$lic.name' is not in the license whitelist. Details: ${lic.toMapString()}") } |
106 | | - .each { lic -> errFile << '\n' << lic.toMapString() } |
107 | | - .each { lic -> throw new GradleException("The license '$lic.name' is not in the license whitelist") } |
| 80 | + tasks.downloadLicenses.ext.licenseToDependencyJson = { -> |
| 81 | + def jsonDir = tasks.downloadLicenses.jsonDestination |
| 82 | + def jsonFile = file("$jsonDir/license-dependency.json") |
| 83 | + new groovy.json.JsonSlurper().parseText(jsonFile.text) |
108 | 84 | } |
109 | | - } |
110 | | - |
111 | | - tasks.check.dependsOn tasks.validateLicenses |
112 | | - |
113 | | - // Compound dependency licenses files |
114 | | - task generateLicensesFiles { |
115 | | - description 'Generates dependency license report files' |
116 | | - dependsOn tasks.downloadLicenses |
117 | 85 |
|
118 | | - ext.licensesFile = file("$tasks.downloadLicenses.jsonDestination/LICENSES.txt") |
119 | | - ext.noticeFile = file("$tasks.downloadLicenses.jsonDestination/NOTICE.txt") |
120 | | - |
121 | | - outputs.file(ext.licensesFile) |
122 | | - outputs.file(ext.noticeFile) |
123 | | - |
124 | | - doLast { |
125 | | - licensesFile.createNewFile() |
126 | | - licensesFile.text = rootProject.file("etc/licenses/headers/LICENSES-header.txt").text |
| 86 | + tasks.downloadLicenses.ext.dependencyToLicenseJson = { -> |
| 87 | + def jsonDir = tasks.downloadLicenses.jsonDestination |
| 88 | + def jsonFile = file("$jsonDir/dependency-license.json") |
| 89 | + new groovy.json.JsonSlurper().parseText(jsonFile.text) |
| 90 | + } |
127 | 91 |
|
128 | | - tasks.downloadLicenses.licencesJson().licences.sort { it.name }.each { |
129 | | - licensesFile << '\n\n' |
130 | | - licensesFile << "------------------------------------------------------------------------------\n" |
131 | | - licensesFile << "$it.name\n" |
132 | | - it.dependencies.sort { it }.each { licensesFile << " $it\n" } |
133 | | - licensesFile << "------------------------------------------------------------------------------\n" |
134 | | - licensesFile << '\n' |
135 | | - licensesFile << rootProject.file("etc/licenses/text/$it.name").text |
| 92 | + // Dependency license validation |
| 93 | + tasks.register("validateLicenses") { |
| 94 | + group 'license' |
| 95 | + description 'Checks dependency licenses against an allowlist' |
| 96 | + dependsOn tasks.downloadLicenses |
| 97 | + doLast { |
| 98 | + def allowListedNames = allowList.collect { it.name } |
| 99 | + tasks.downloadLicenses.dependencyToLicenseJson().dependencies |
| 100 | + .findAll { dep -> allowListedNames.intersect(dep.licenses.collect { it.name }).isEmpty() } |
| 101 | + .each { dep -> logger.error("In project ${proj.name}: Could not find an allowed license for dependency '$dep.name'. Details: ${dep.toMapString()}") } |
| 102 | + .each { dep -> throw new GradleException("The dependency '$dep.name' has no allowed license") } |
136 | 103 | } |
137 | | - |
138 | | - noticeFile.createNewFile() |
139 | | - noticeFile.text = rootProject.file("etc/licenses/headers/NOTICE-header.txt").text |
140 | | - noticeFile << '\n\n' |
141 | | - noticeFile << "Third-party licenses\n" |
142 | | - noticeFile << "--------------------\n" |
143 | | - |
144 | | - tasks.downloadLicenses.licencesJson().licences.sort { it.name }.each { |
145 | | - noticeFile << '\n' |
146 | | - noticeFile << "$it.name\n" |
147 | | - it.dependencies.sort { it }.each { noticeFile << " $it\n" } |
| 104 | + } |
| 105 | + tasks.check.dependsOn tasks.validateLicenses |
| 106 | + |
| 107 | + // Compound dependency licenses files |
| 108 | + tasks.register("generateLicensesFiles") { |
| 109 | + description 'Generates dependency license report files' |
| 110 | + dependsOn tasks.downloadLicenses, tasks.validateLicenses |
| 111 | + ext.licensesFile = file("$tasks.downloadLicenses.jsonDestination/LICENSES.txt") |
| 112 | + ext.noticeFile = file("$tasks.downloadLicenses.jsonDestination/NOTICE.txt") |
| 113 | + outputs.file(ext.licensesFile) |
| 114 | + outputs.file(ext.noticeFile) |
| 115 | + doLast { |
| 116 | + licensesFile.createNewFile() |
| 117 | + licensesFile.text = rootProject.file("etc/licenses/headers/LICENSES-header.txt").text |
| 118 | + tasks.downloadLicenses.licenseToDependencyJson().licences |
| 119 | + .findAll { lic -> allowList.any { lic.name == it.name } } |
| 120 | + .sort { it.name }.each { |
| 121 | + licensesFile << '\n\n' |
| 122 | + licensesFile << "------------------------------------------------------------------------------\n" |
| 123 | + licensesFile << "$it.name\n" |
| 124 | + it.dependencies.sort { it }.each { licensesFile << " $it\n" } |
| 125 | + licensesFile << "------------------------------------------------------------------------------\n" |
| 126 | + licensesFile << '\n' |
| 127 | + licensesFile << rootProject.file("etc/licenses/text/$it.name").text |
| 128 | + } |
| 129 | + noticeFile.createNewFile() |
| 130 | + noticeFile.text = rootProject.file("etc/licenses/headers/NOTICE-header.txt").text |
| 131 | + noticeFile << '\n\n' |
| 132 | + noticeFile << "Third-party licenses\n" |
| 133 | + noticeFile << "--------------------\n" |
| 134 | + tasks.downloadLicenses.licenseToDependencyJson().licences.sort { it.name }.each { |
| 135 | + noticeFile << '\n' |
| 136 | + noticeFile << "$it.name\n" |
| 137 | + it.dependencies.sort { it }.each { noticeFile << " $it\n" } |
| 138 | + } |
148 | 139 | } |
149 | 140 | } |
| 141 | + tasks.check.dependsOn tasks.generateLicensesFiles |
150 | 142 | } |
151 | | - |
152 | | - tasks.check.dependsOn tasks.generateLicensesFiles |
153 | | -} |
154 | | - |
155 | | -// Disable dependency license validation on test and documentation projects |
156 | | -['okapi-tck', |
157 | | - 'okapi-testing', |
158 | | - 'okapi-neo4j-io-testing', |
159 | | - 'morpheus-examples', |
160 | | - 'morpheus-tck', |
161 | | - 'morpheus-testing', |
162 | | - 'morpheus-jmh', |
163 | | - 'documentation', |
164 | | -].each { |
165 | | - project(it).tasks.validateLicenses.enabled = false |
166 | | - project(it).tasks.generateLicensesFiles.enabled = false |
167 | 143 | } |
0 commit comments