Skip to content
This repository was archived by the owner on Dec 17, 2019. It is now read-only.

Commit 98f3745

Browse files
author
itaimarko
committed
V 0.4
1 parent 0ed554c commit 98f3745

File tree

7 files changed

+442
-0
lines changed

7 files changed

+442
-0
lines changed

build.gradle

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
2+
apply plugin: 'groovy'
3+
apply plugin: 'maven'
4+
5+
group = 'org.whitesource'
6+
version = '0.4'
7+
8+
repositories {
9+
mavenLocal()
10+
mavenCentral()
11+
}
12+
13+
dependencies {
14+
compile gradleApi()
15+
compile localGroovy()
16+
compile 'org.whitesource:wss-agent-api-client:2.2.5', 'org.whitesource:wss-agent-report:2.2.5'
17+
testCompile group: 'junit', name: 'junit', version: '4.11'
18+
}

settings.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
rootProject.name = 'whitesource-gradle-plugin'
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
package org.whitesource.gradle
2+
3+
import org.gradle.api.Project
4+
import org.gradle.api.artifacts.Configuration
5+
import org.gradle.api.artifacts.Dependency
6+
import org.gradle.api.specs.Spec
7+
8+
/**
9+
* @author Itai Marko
10+
*/
11+
class WhitesourceConfiguration {
12+
13+
String orgToken
14+
String productName
15+
String productVersion
16+
Set<Project> includedProjects = []
17+
Set<Configuration> includedConfigurations = []
18+
Set<String> includedConfigurationNames = []
19+
Spec<? super Dependency> dependencyFilter
20+
/*String*/boolean checkPolicies
21+
File reportsDirectory
22+
boolean failOnRejection = true
23+
boolean forceUpdate = false
24+
25+
String projectToken
26+
Map<String, String> projectTokens = [:]
27+
28+
String requesterEmail
29+
boolean failOnError = true
30+
31+
32+
ProxyConfiguration proxyConf
33+
34+
void orgToken(String orgToken) {
35+
this.orgToken = orgToken
36+
}
37+
38+
void productName(String productName) {
39+
this.productName = productName
40+
}
41+
42+
void productVersion(String productVersion) {
43+
this.productVersion = productVersion
44+
}
45+
46+
void includeProject(Project project) {
47+
this.includedProjects << project
48+
}
49+
50+
void includeProjects(Collection<Project> projects) {
51+
this.includedProjects += projects
52+
}
53+
54+
void includeConfiguration(Configuration configuration) {
55+
this.includedConfigurations << configuration
56+
}
57+
58+
void includeConfiguration(String configurationName) {
59+
this.includedConfigurationNames << configurationName
60+
}
61+
62+
void includeConfigurations(Collection<Configuration> configurations) {
63+
this.includedConfigurations += configurations
64+
}
65+
66+
void dependencyFilter(Spec<? super Dependency> dependencyFilter) {
67+
this.dependencyFilter = dependencyFilter
68+
}
69+
70+
void checkPolicies(/*String*/boolean checkPolicies) {
71+
this.checkPolicies = checkPolicies
72+
}
73+
74+
void reportsDirectory(File reportsDirectory) {
75+
this.reportsDirectory = reportsDirectory
76+
}
77+
78+
void failOnRejection(boolean failOnRejection) {
79+
this.failOnRejection = failOnRejection
80+
}
81+
82+
void forceUpdate(boolean forceUpdate) {
83+
this.forceUpdate = forceUpdate
84+
}
85+
86+
void host(String host) {
87+
this.proxyConf.host = host
88+
}
89+
90+
void port(String port) {
91+
this.proxyConf.port = port
92+
}
93+
94+
void user(String user) {
95+
this.proxyConf.user = user
96+
}
97+
98+
void password(String password) {
99+
this.proxyConf.password = password
100+
}
101+
102+
void projectToken(String projectToken) {
103+
this.projectToken = projectToken
104+
}
105+
106+
void projectTokens(Map<String, String> projectTokens) {
107+
this.projectTokens = projectTokens
108+
}
109+
110+
void requesterEmail(String requesterEmail) {
111+
this.requesterEmail = requesterEmail
112+
}
113+
114+
void failOnError(boolean failOnError) {
115+
this.failOnError = failOnError
116+
}
117+
}
118+
119+
class ProxyConfiguration {
120+
String host
121+
String port
122+
String user
123+
String password
124+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package org.whitesource.gradle
2+
3+
import org.gradle.api.Plugin
4+
import org.gradle.api.Project
5+
import org.gradle.api.Task
6+
import org.gradle.api.artifacts.Dependency
7+
import org.gradle.api.artifacts.ExternalDependency
8+
import org.gradle.api.artifacts.FileCollectionDependency
9+
import org.gradle.api.internal.project.ProjectInternal
10+
import org.gradle.api.specs.Spec
11+
import org.whitesource.gradle.tasks.CollectProjectInfoTask
12+
import org.whitesource.gradle.tasks.UpdateWhitesourceInventoryTask
13+
14+
/**
15+
* @author Itai Marko
16+
*/
17+
class WhitesourcePlugin implements Plugin<Project> {
18+
19+
@Override
20+
void apply(Project project) {
21+
project.configure(project) {
22+
project.ext {
23+
projectInfos = []
24+
includeAllDependencies =
25+
new Spec<Dependency>(){
26+
@Override
27+
boolean isSatisfiedBy(Dependency dep) {
28+
return true
29+
}
30+
}
31+
defaultDependencyFilter =
32+
new Spec<Dependency>(){
33+
@Override
34+
boolean isSatisfiedBy(Dependency dep) {
35+
return dep instanceof ExternalDependency
36+
}
37+
}
38+
includeExternalOrFileDependencies =
39+
new Spec<Dependency>(){
40+
@Override
41+
boolean isSatisfiedBy(Dependency dep) {
42+
return dep instanceof ExternalDependency || dep instanceof FileCollectionDependency
43+
}
44+
}
45+
}
46+
47+
// create extension objects
48+
def wssConfig = project.extensions.create('whitesource', WhitesourceConfiguration)
49+
project.whitesource.extensions.create('proxy', ProxyConfiguration)
50+
51+
afterEvaluate {
52+
//set defaults
53+
wssConfig.productName = wssConfig.productName ?: rootProject.name
54+
wssConfig.includedProjects = wssConfig.includedProjects ?: allprojects
55+
if (!(wssConfig.includedConfigurations || wssConfig.includedConfigurationNames)) {
56+
wssConfig.includedConfigurationNames << 'runtime'
57+
}
58+
wssConfig.dependencyFilter = wssConfig.dependencyFilter ?: project.defaultDependencyFilter
59+
if (wssConfig.checkPolicies) {
60+
61+
if (!wssConfig.reportsDirectory) {
62+
wssConfig.reportsDirectory = ((ProjectInternal)project).fileResolver.withBaseDir(project.buildDir).resolve('reports')
63+
}
64+
}
65+
66+
// create a collectProjectInfo task for each of the included projects
67+
def collectProjectInfoTaskName = 'collectProjectInfo'
68+
configure (wssConfig.includedProjects) {
69+
tasks.create(name: collectProjectInfoTaskName, type: CollectProjectInfoTask) {
70+
group = 'whitesource'
71+
}
72+
}
73+
74+
// create an updateWhitesource task for the root project
75+
Task uwi = tasks.create(name: 'updateWhitesource', type: UpdateWhitesourceInventoryTask) {
76+
group = 'whitesource'
77+
}
78+
79+
// set the updateWhitesource task to depend on each collectProjectInfo task created
80+
uwi.dependsOn wssConfig.includedProjects.collect {
81+
it.tasks.findByName(collectProjectInfoTaskName)
82+
}
83+
}
84+
}
85+
}
86+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package org.whitesource.gradle.tasks
2+
3+
import org.gradle.api.DefaultTask
4+
import org.gradle.api.tasks.TaskAction
5+
import org.whitesource.agent.api.ChecksumUtils
6+
import org.whitesource.agent.api.model.AgentProjectInfo
7+
import org.whitesource.agent.api.model.Coordinates
8+
import org.whitesource.agent.api.model.DependencyInfo
9+
import org.whitesource.gradle.WhitesourceConfiguration
10+
11+
/**
12+
* @author Itai Marko
13+
*/
14+
class CollectProjectInfoTask extends DefaultTask {
15+
16+
WhitesourceConfiguration wssConfig = project.whitesource
17+
18+
@TaskAction
19+
def CollectProjectInfos() {
20+
logger.lifecycle("processing ${project.name}")
21+
def projectInfo = new AgentProjectInfo()
22+
projectInfo.setCoordinates(new Coordinates(null, project.name, null))
23+
if (project.parent)
24+
projectInfo.setParentCoordinates(new Coordinates(null, project.parent.name, null))
25+
26+
if (wssConfig.includedProjects.size() > 1) {
27+
projectInfo.setProjectToken(wssConfig.projectTokens.get(project.name))
28+
} else {
29+
projectInfo.setProjectToken(wssConfig.projectToken)
30+
}
31+
32+
def configurationsToInclude = project.configurations.findAll { thisProjConf ->
33+
thisProjConf.name in wssConfig.includedConfigurationNames || thisProjConf.name in wssConfig.includedConfigurations*.name
34+
}
35+
36+
def addedSha1s = new HashSet<String>()
37+
configurationsToInclude*.resolvedConfiguration*.getFiles(wssConfig.dependencyFilter).flatten().each {
38+
def sha1 = ChecksumUtils.calculateSHA1(it)
39+
if (!addedSha1s.contains(sha1)) {
40+
def dependencyInfo = new DependencyInfo()
41+
dependencyInfo.setArtifactId(it.name)
42+
dependencyInfo.setSystemPath(it.absolutePath)
43+
dependencyInfo.setSha1(sha1)
44+
projectInfo.getDependencies().add(dependencyInfo)
45+
addedSha1s.add(sha1)
46+
}
47+
}
48+
49+
project.projectInfos.add(projectInfo)
50+
}
51+
}

0 commit comments

Comments
 (0)