Skip to content
Merged
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
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@
*.iml
.gradle/
build/
out/
out/
.claude/
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ plugins {

compileGroovy.groovyOptions.configurationScript = file('src/groovyCompile/groovycConfig.groovy')

description 'Gradle plugin collect and provide information about the environment'
description = 'Gradle plugin collect and provide information about the environment'

contacts {
'nebula-plugins-oss@netflix.com' {
Expand Down
21 changes: 12 additions & 9 deletions src/main/groovy/nebula/plugin/info/InfoBrokerPlugin.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -57,25 +57,28 @@ class InfoBrokerPlugin implements Plugin<Project> {
}

private void filterManifestEntries(InfoBrokerPluginExtension extension) {
if (extension.includedManifestProperties && extension.excludedManifestProperties) {
List<String> includedProperties = extension.includedManifestProperties.getOrElse([])
List<String> excludedProperties = extension.excludedManifestProperties.getOrElse([])
boolean hasIncluded = !includedProperties.isEmpty()
boolean hasExcluded = !excludedProperties.isEmpty()

if (hasIncluded && hasExcluded) {
throw new GradleException("includedManifestProperties and excludedManifestProperties are mutually exclusive. Only one should be provided")
} else if (extension.excludedManifestProperties) {
removeExcludedProperties(extension)
} else if (extension.includedManifestProperties) {
filterOnlyIncludedProperties(extension)
} else if (hasExcluded) {
removeExcludedProperties(excludedProperties)
} else if (hasIncluded) {
filterOnlyIncludedProperties(includedProperties)
}
}

private void filterOnlyIncludedProperties(InfoBrokerPluginExtension extension) {
List<String> includedProperties = extension.includedManifestProperties
private void filterOnlyIncludedProperties(List<String> includedProperties) {
List<ManifestEntry> filteredManifestEntries = manifestEntries.findAll { entry ->
(entry.name in includedProperties)
}
manifestEntries = filteredManifestEntries
}

private void removeExcludedProperties(InfoBrokerPluginExtension extension) {
List<String> excludedProperties = extension.excludedManifestProperties
private void removeExcludedProperties(List<String> excludedProperties) {
List<ManifestEntry> filteredManifestEntries = manifestEntries.findAll { entry ->
!(entry.name in excludedProperties)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package nebula.plugin.info

class InfoBrokerPluginExtension {
List<String> includedManifestProperties = []
List<String> excludedManifestProperties = []
import org.gradle.api.provider.ListProperty

abstract class InfoBrokerPluginExtension {
abstract ListProperty<String> getIncludedManifestProperties()
abstract ListProperty<String> getExcludedManifestProperties()
}
Original file line number Diff line number Diff line change
Expand Up @@ -100,8 +100,8 @@ class BasicInfoPlugin implements Plugin<Project>, InfoCollectorPlugin {
manifestPlugin.add(IMPLEMENTATION_VERSION.toString(), { projectVersion.get() })
manifestPlugin.add(BUILD_STATUS_PROPERTY, { projectStatus.get() }) // Could be promoted, so this is the actual status necessarily

String builtBy = providers.systemProperty("user.name").get()
String builtOs = providers.systemProperty("os.name").get()
String builtBy = providers.systemProperty("user.name").getOrElse("unknown")
String builtOs = providers.systemProperty("os.name").getOrElse("unknown")
manifestPlugin.add(BUILT_BY_PROPERTY, builtBy)
manifestPlugin.add(BUILT_OS_PROPERTY, builtOs)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ abstract class AbstractContinuousIntegrationProvider implements ContinuousIntegr
}

protected String getEnvironmentVariable(String envKey) {
return providerFactory.environmentVariable(envKey).present ? providerFactory.environmentVariable(envKey).get() : null
return providerFactory.environmentVariable(envKey).getOrElse(null)
}

protected static String hostname() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,12 @@

package nebula.plugin.info.ci

class ContinuousIntegrationInfoExtension {
String host
String job
String buildNumber
String buildId
String buildUrl
import org.gradle.api.provider.Property

abstract class ContinuousIntegrationInfoExtension {
abstract Property<String> getHost()
abstract Property<String> getJob()
abstract Property<String> getBuildNumber()
abstract Property<String> getBuildId()
abstract Property<String> getBuildUrl()
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,10 @@

package nebula.plugin.info.ci

import groovy.transform.CompileDynamic
import nebula.plugin.info.InfoBrokerPlugin
import nebula.plugin.info.InfoCollectorPlugin
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.internal.ConventionMapping
import org.gradle.api.internal.IConventionAware
import org.gradle.api.provider.ProviderFactory

import javax.inject.Inject
Expand Down Expand Up @@ -55,22 +52,20 @@ class ContinuousIntegrationInfoPlugin implements Plugin<Project>, InfoCollectorP
configureExtMapping(project, extension)

project.plugins.withType(InfoBrokerPlugin) { InfoBrokerPlugin manifestPlugin ->
manifestPlugin.add('Build-Host') { extension.host }
manifestPlugin.add('Build-Job') { extension.job }
manifestPlugin.add('Build-Number') { extension.buildNumber }
manifestPlugin.add('Build-Id') { extension.buildId }
manifestPlugin.add('Build-Url') { extension.buildUrl }
manifestPlugin.add('Build-Host') { extension.host.getOrNull() }
manifestPlugin.add('Build-Job') { extension.job.getOrNull() }
manifestPlugin.add('Build-Number') { extension.buildNumber.getOrNull() }
manifestPlugin.add('Build-Id') { extension.buildId.getOrNull() }
manifestPlugin.add('Build-Url') { extension.buildUrl.getOrNull() }
}
}

@CompileDynamic
private void configureExtMapping(Project project, ContinuousIntegrationInfoExtension extension) {
ConventionMapping extMapping = ((IConventionAware) extension).getConventionMapping()
extMapping.host = { selectedProvider.calculateHost(project) }
extMapping.job = { selectedProvider.calculateJob(project) }
extMapping.buildNumber = { selectedProvider.calculateBuildNumber(project) }
extMapping.buildId = { selectedProvider.calculateBuildId(project) }
extMapping.buildUrl = { selectedProvider.calculateBuildUrl(project) }
extension.host.convention(providerFactory.provider { selectedProvider.calculateHost(project) })
extension.job.convention(providerFactory.provider { selectedProvider.calculateJob(project) })
extension.buildNumber.convention(providerFactory.provider { selectedProvider.calculateBuildNumber(project) })
extension.buildId.convention(providerFactory.provider { selectedProvider.calculateBuildId(project) })
extension.buildUrl.convention(providerFactory.provider { selectedProvider.calculateBuildUrl(project) })
}

ContinuousIntegrationInfoProvider findProvider(Project project) {
Expand Down
6 changes: 3 additions & 3 deletions src/main/groovy/nebula/plugin/info/java/InfoJavaPlugin.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,8 @@ class InfoJavaPlugin implements Plugin<Project>, InfoCollectorPlugin {
void apply(Project project) {
// This can't change, so we can commit it early
project.plugins.withType(InfoBrokerPlugin) { InfoBrokerPlugin manifestPlugin ->
String javaRuntimeVersion = providers.systemProperty("java.runtime.version").get()
String javaVmVendor = providers.systemProperty("java.vm.vendor").get()
String javaRuntimeVersion = providers.systemProperty("java.runtime.version").getOrElse("unknown")
String javaVmVendor = providers.systemProperty("java.vm.vendor").getOrElse("unknown")

manifestPlugin.add(CREATED_PROPERTY, "$javaRuntimeVersion ($javaVmVendor)")
}
Expand All @@ -77,7 +77,7 @@ class InfoJavaPlugin implements Plugin<Project>, InfoCollectorPlugin {
if (javaLauncher.isPresent()) {
manifestPlugin.add(JDK_PROPERTY, javaLauncher.get().metadata.languageVersion.toString())
} else {
String javaVersionFromSystemProperty = providers.systemProperty("java.version").get()
String javaVersionFromSystemProperty = providers.systemProperty("java.version").getOrElse("unknown")
manifestPlugin.add(JDK_PROPERTY, javaVersionFromSystemProperty)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,8 @@ class InfoJarPropertiesFilePlugin implements Plugin<Project>, InfoReporterPlugin

jarTask.doFirst {
//when we are after all caching decisions we fill the file with all the data
PropertiesWriter.writeProperties(propertiesFile.get().asFile, manifestPlugin)
File propFile = propertiesFile.get().asFile
PropertiesWriter.writeProperties(propFile, manifestPlugin)
}
jarTask.doLast {
//we need to cleanup file in case we got multiple jar tasks
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,9 @@ package nebula.plugin.info.reporting

import groovy.transform.CompileDynamic
import nebula.plugin.info.InfoBrokerPlugin
import org.gradle.api.DefaultTask
import org.gradle.api.Project
import org.gradle.api.file.RegularFile
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.internal.ConventionTask
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction
Expand All @@ -35,7 +33,7 @@ import javax.inject.Inject
*/
@CompileDynamic
@DisableCachingByDefault
abstract class InfoPropertiesFile extends ConventionTask {
abstract class InfoPropertiesFile extends DefaultTask {
private InfoBrokerPlugin infoBrokerPlugin

@Inject
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,9 @@ class InfoPropertiesFilePlugin implements Plugin<Project>, InfoReporterPlugin {
manifestTask = project.tasks.register('writeManifestProperties', InfoPropertiesFile) { task ->
if (project.plugins.hasPlugin(BasePlugin)) {
BasePluginExtension baseExtension = project.extensions.getByType(BasePluginExtension)
task.propertiesFile.set(project.layout.buildDirectory.file("manifest/${baseExtension.archivesName.get()}.properties"))
task.propertiesFile.set(project.layout.buildDirectory.file(
baseExtension.archivesName.map { name -> "manifest/${name}.properties" }
))
} else {
task.propertiesFile.set(project.layout.buildDirectory.file("manifest/info.properties"))
}
Expand Down
7 changes: 2 additions & 5 deletions src/main/groovy/nebula/plugin/info/scm/GitScmProvider.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -67,12 +67,9 @@ class GitScmProvider extends AbstractScmProvider {

@Override
String calculateFullChange(File projectDir) {
boolean isHashPresent = providerFactory.environmentVariable('GIT_COMMIT').present
String hash
if (!isHashPresent) {
String hash = providerFactory.environmentVariable('GIT_COMMIT').getOrElse(null)
if (!hash) {
hash = executeGitCommand("git", "rev-parse", "HEAD")
} else {
hash = providerFactory.environmentVariable('GIT_COMMIT').get()
}
return hash
}
Expand Down
19 changes: 12 additions & 7 deletions src/main/groovy/nebula/plugin/info/scm/PerforceScmProvider.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -43,18 +43,21 @@ class PerforceScmProvider extends AbstractScmProvider {
// Better to check git first, since it can make a more intelligent guess
// TODO When we can make p4java optional, we'll add a classForName check here.
try {
return (providerFactory.environmentVariable('WORKSPACE').present && providerFactory.environmentVariable('P4CLIENT').present) || findFile(project.projectDir, providerFactory.environmentVariable('P4CONFIG').get())
boolean hasWorkspaceAndClient = providerFactory.environmentVariable('WORKSPACE').present &&
providerFactory.environmentVariable('P4CLIENT').present
boolean hasP4ConfigFile = findFile(project.projectDir, providerFactory.environmentVariable('P4CONFIG').getOrElse(null))
return hasWorkspaceAndClient || hasP4ConfigFile
} catch(Exception e) {
return false
}
}

@Override
String calculateModuleSource(File projectDir) {
String workspacePath = providerFactory.environmentVariable('WORKSPACE').present ? providerFactory.environmentVariable('WORKSPACE').get() : {
String workspacePath = providerFactory.environmentVariable('WORKSPACE').getOrElse(DEFAULT_WORKSPACE)
if (workspacePath == DEFAULT_WORKSPACE) {
logger.info("WORKSPACE environment variable is not set. Using ${DEFAULT_WORKSPACE}")
DEFAULT_WORKSPACE
}.call()
}
File workspace = new File(workspacePath)
return calculateModuleSource(workspace, projectDir)
}
Expand All @@ -73,7 +76,7 @@ class PerforceScmProvider extends AbstractScmProvider {

@Override
String calculateChange(File projectDir) {
return providerFactory.environmentVariable('P4_CHANGELIST').get()
return providerFactory.environmentVariable('P4_CHANGELIST').getOrElse(null)
}

@Override
Expand Down Expand Up @@ -143,7 +146,9 @@ class PerforceScmProvider extends AbstractScmProvider {
findP4Config(projectDir) // Might be noop
if (p4configFile) {
Properties props = new Properties()
props.load(new FileReader(p4configFile))
p4configFile.withInputStream { inputStream ->
props.load(inputStream)
}
defaults = overrideFromMap(defaults, props as Map<String, String>)
}

Expand All @@ -165,7 +170,7 @@ class PerforceScmProvider extends AbstractScmProvider {
@PackageScope
void findP4Config(File starting) {
if (p4configFile == null) {
p4configFile = findFile(starting, providerFactory.environmentVariable('P4CONFIG').get())
p4configFile = findFile(starting, providerFactory.environmentVariable('P4CONFIG').getOrElse(null))
}
}
}
14 changes: 8 additions & 6 deletions src/main/groovy/nebula/plugin/info/scm/ScmInfoExtension.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,12 @@

package nebula.plugin.info.scm

class ScmInfoExtension {
String origin
String source
String change
String fullChange
String branch
import org.gradle.api.provider.Property

abstract class ScmInfoExtension {
abstract Property<String> getOrigin()
abstract Property<String> getSource()
abstract Property<String> getChange()
abstract Property<String> getFullChange()
abstract Property<String> getBranch()
}
45 changes: 19 additions & 26 deletions src/main/groovy/nebula/plugin/info/scm/ScmInfoPlugin.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,10 @@

package nebula.plugin.info.scm

import groovy.transform.CompileDynamic
import nebula.plugin.info.InfoBrokerPlugin
import nebula.plugin.info.InfoCollectorPlugin
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.internal.ConventionMapping
import org.gradle.api.internal.IConventionAware
import org.gradle.api.provider.ProviderFactory

import javax.inject.Inject
Expand Down Expand Up @@ -86,7 +83,7 @@ class ScmInfoPlugin implements Plugin<Project>, InfoCollectorPlugin {
private void configureWithScmProvider(Project project) {
ScmInfoExtension extension = project.extensions.create('scminfo', ScmInfoExtension)
project.logger.debug("Project $project.name SCM information is being collected from provider ${selectedProvider.class.name}")
configureExtMappingWithScmProvider(project, extension)
configureExtensionFromProvider(project, extension)
configureInfoBrokerManifest(project, extension)
}

Expand All @@ -97,28 +94,24 @@ class ScmInfoPlugin implements Plugin<Project>, InfoCollectorPlugin {
private void configureWithoutScmProvider(Project project, ScmInfoExtension scmInfoRootProjectExtension) {
ScmInfoExtension extension = project.extensions.create('scminfo', ScmInfoExtension)
project.logger.debug("Project $project.name SCM information is being collected from rootProject extension")
configureExtMappingWithoutScmProvider(project, extension, scmInfoRootProjectExtension)
configureExtensionFromRootProject(extension, scmInfoRootProjectExtension)
configureInfoBrokerManifest(project, extension)
}

@CompileDynamic
private void configureExtMappingWithScmProvider(Project project, ScmInfoExtension extension) {
ConventionMapping extMapping = ((IConventionAware) extension).getConventionMapping()
extMapping.origin = { selectedProvider.calculateOrigin(project) }
extMapping.source = { selectedProvider.calculateSource(project)?.replace(File.separatorChar, '/' as char) }
extMapping.change = { selectedProvider.calculateChange(project) }
extMapping.fullChange = { selectedProvider.calculateFullChange(project) }
extMapping.branch = { selectedProvider.calculateBranch(project) }
private void configureExtensionFromProvider(Project project, ScmInfoExtension extension) {
extension.origin.convention(providerFactory.provider { selectedProvider.calculateOrigin(project) })
extension.source.convention(providerFactory.provider { selectedProvider.calculateSource(project)?.replace(File.separatorChar, '/' as char) })
extension.change.convention(providerFactory.provider { selectedProvider.calculateChange(project) })
extension.fullChange.convention(providerFactory.provider { selectedProvider.calculateFullChange(project) })
extension.branch.convention(providerFactory.provider { selectedProvider.calculateBranch(project) })
}

@CompileDynamic
private void configureExtMappingWithoutScmProvider(Project project, ScmInfoExtension extension, ScmInfoExtension scmInfoRootProjectExtension) {
ConventionMapping extMapping = ((IConventionAware) extension).getConventionMapping()
extMapping.origin = { scmInfoRootProjectExtension.origin }
extMapping.source = { scmInfoRootProjectExtension.source }
extMapping.change = { scmInfoRootProjectExtension.change }
extMapping.fullChange = { scmInfoRootProjectExtension.fullChange }
extMapping.branch = { scmInfoRootProjectExtension.branch }
private void configureExtensionFromRootProject(ScmInfoExtension extension, ScmInfoExtension scmInfoRootProjectExtension) {
extension.origin.convention(scmInfoRootProjectExtension.origin)
extension.source.convention(scmInfoRootProjectExtension.source)
extension.change.convention(scmInfoRootProjectExtension.change)
extension.fullChange.convention(scmInfoRootProjectExtension.fullChange)
extension.branch.convention(scmInfoRootProjectExtension.branch)
}

/**
Expand All @@ -128,11 +121,11 @@ class ScmInfoPlugin implements Plugin<Project>, InfoCollectorPlugin {
*/
private void configureInfoBrokerManifest(Project project, ScmInfoExtension scmInfoExtension ) {
project.plugins.withType(InfoBrokerPlugin) { InfoBrokerPlugin manifestPlugin ->
manifestPlugin.add(MODULE_SOURCE_PROPERTY) { scmInfoExtension.source }
manifestPlugin.add(MODULE_ORIGIN_PROPERTY) { scmInfoExtension.origin }
manifestPlugin.add(CHANGE_PROPERTY) { scmInfoExtension.change }
manifestPlugin.add(FULL_CHANGE_PROPERTY) { scmInfoExtension.fullChange }
manifestPlugin.add(BRANCH_PROPERTY) { scmInfoExtension.branch }
manifestPlugin.add(MODULE_SOURCE_PROPERTY) { scmInfoExtension.source.getOrNull() }
manifestPlugin.add(MODULE_ORIGIN_PROPERTY) { scmInfoExtension.origin.getOrNull() }
manifestPlugin.add(CHANGE_PROPERTY) { scmInfoExtension.change.getOrNull() }
manifestPlugin.add(FULL_CHANGE_PROPERTY) { scmInfoExtension.fullChange.getOrNull() }
manifestPlugin.add(BRANCH_PROPERTY) { scmInfoExtension.branch.getOrNull() }
}
}

Expand Down
Loading