Skip to content

Commit 3a178a5

Browse files
committed
feat: Replaced dynamic property handling in grovvy with fields #353 #288 #281
1 parent 118db22 commit 3a178a5

12 files changed

+185
-85
lines changed

README.md

+26-2
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ release {
195195

196196
This are all possible configuration options and its default values:
197197

198-
```
198+
``` build.gradle
199199
release {
200200
failOnCommitNeeded = true
201201
failOnPublishNeeded = true
@@ -216,7 +216,7 @@ release {
216216
versionPatterns = [
217217
/(\d+)([^\d]*$)/: { Matcher m, Project p -> m.replaceAll("${(m[0][1] as int) + 1}${m[0][2]}") }
218218
]
219-
pushReleaseVersionBranch = false
219+
pushReleaseVersionBranch = null
220220
scmAdapters = [
221221
net.researchgate.release.GitAdapter,
222222
net.researchgate.release.SvnAdapter,
@@ -240,6 +240,30 @@ release {
240240
}
241241
```
242242

243+
### Kotlin DSL Example
244+
245+
``` build.gradle.kts
246+
import net.researchgate.release.ReleaseExtension
247+
repositories {
248+
maven {
249+
url 'https://plugins.gradle.org/m2/'
250+
}
251+
}
252+
dependencies {
253+
classpath 'net.researchgate:gradle-release:3.0.0'
254+
}
255+
256+
apply(plugin = "base")
257+
apply(plugin = "net.researchgate.release")
258+
259+
configure<ReleaseExtension> {
260+
ignoredSnapshotDependencies.set(listOf("net.researchgate:gradle-release"))
261+
with(git) {
262+
requireBranch = "master"
263+
}
264+
}
265+
```
266+
243267
### Custom release steps
244268

245269
To add a step to the release process is very easy. Gradle provides a very nice mechanism for [manipulating existing tasks](http://gradle.org/docs/current/userguide/tutorial_using_tasks.html#N102B2). There are two available hooks provided: `beforeReleaseBuild` which runs before build and `afterReleaseBuild` which runs afterwards.

src/main/groovy/net/researchgate/release/BaseScmAdapter.groovy

-2
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ abstract class BaseScmAdapter extends PluginHelper {
2121
extension = project.extensions['release'] as ReleaseExtension
2222
}
2323

24-
abstract Object createNewConfig()
25-
2624
abstract boolean isSupported(File directory)
2725

2826
abstract void init()

src/main/groovy/net/researchgate/release/BzrAdapter.groovy

-5
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,6 @@ class BzrAdapter extends BaseScmAdapter {
2222
super(project, attributes)
2323
}
2424

25-
@Override
26-
Object createNewConfig() {
27-
return null
28-
}
29-
3025
@Override
3126
boolean isSupported(File directory) {
3227
if (!directory.list().grep('.bzr')) {

src/main/groovy/net/researchgate/release/GitAdapter.groovy

-16
Original file line numberDiff line numberDiff line change
@@ -35,30 +35,14 @@ class GitAdapter extends BaseScmAdapter {
3535
def pushOptions = []
3636
boolean signTag = false
3737

38-
/** @deprecated Remove in version 3.0 */
39-
@Deprecated
40-
boolean pushToCurrentBranch = false
4138
String pushToBranchPrefix
4239
boolean commitVersionFileOnly = false
43-
44-
void setProperty(String name, Object value) {
45-
if (name == 'pushToCurrentBranch') {
46-
project.logger?.warn("You are setting the deprecated and unused option '${name}'. You can safely remove it. The deprecated option will be removed in 3.0")
47-
}
48-
49-
metaClass.setProperty(this, name, value)
50-
}
5140
}
5241

5342
GitAdapter(Project project, Map<String, Object> attributes) {
5443
super(project, attributes)
5544
}
5645

57-
@Override
58-
Object createNewConfig() {
59-
return new GitConfig()
60-
}
61-
6246
@Override
6347
boolean isSupported(File directory) {
6448
if (!directory.list().grep('.git')) {

src/main/groovy/net/researchgate/release/HgAdapter.groovy

-5
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,6 @@ class HgAdapter extends BaseScmAdapter {
2020
super(project, attributes)
2121
}
2222

23-
@Override
24-
Object createNewConfig() {
25-
return null
26-
}
27-
2823
@Override
2924
boolean isSupported(File directory) {
3025
if (!directory.list().grep('.hg')) {

src/main/groovy/net/researchgate/release/PluginHelper.groovy

+1-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ class PluginHelper {
7474
project.version = getReleaseVersion('1.0.0')
7575
}
7676

77-
if (!useAutomaticVersion() && promptYesOrNo('Do you want to use SNAPSHOT versions inbetween releases')) {
77+
if (!useAutomaticVersion() && promptYesOrNo('Do you want to use SNAPSHOT versions in between releases')) {
7878
attributes.usesSnapshot = true
7979
}
8080

src/main/groovy/net/researchgate/release/ReleaseExtension.groovy

+32-32
Original file line numberDiff line numberDiff line change
@@ -13,63 +13,95 @@ package net.researchgate.release
1313
import org.gradle.api.Project
1414
import org.gradle.api.provider.ListProperty
1515
import org.gradle.api.provider.Property
16+
import org.gradle.api.tasks.Input
17+
import org.gradle.api.tasks.Internal
18+
import org.gradle.api.tasks.Nested
19+
import org.gradle.api.tasks.Optional
1620
import org.gradle.util.ConfigureUtil
1721

1822
import java.util.regex.Matcher
1923
import java.util.regex.Pattern
2024

2125
class ReleaseExtension {
2226

27+
@Input
2328
Property<Boolean> failOnCommitNeeded = project.objects.property(Boolean.class).convention(true)
2429

30+
@Input
2531
Property<Boolean> failOnPublishNeeded = project.objects.property(Boolean.class).convention(true)
2632

33+
@Input
2734
Property<Boolean> failOnSnapshotDependencies = project.objects.property(Boolean.class).convention(true)
2835

36+
@Input
2937
Property<Boolean> failOnUnversionedFiles = project.objects.property(Boolean.class).convention(true)
3038

39+
@Input
3140
Property<Boolean> failOnUpdateNeeded = project.objects.property(Boolean.class).convention(true)
3241

42+
@Input
3343
Property<Boolean> revertOnFail = project.objects.property(Boolean.class).convention(true)
3444

45+
@Input
46+
@Optional
3547
Property<String> pushReleaseVersionBranch = project.objects.property(String.class)
3648

49+
@Input
3750
Property<String> preCommitText = project.objects.property(String.class).convention('')
3851

52+
@Input
3953
Property<String> preTagCommitMessage = project.objects.property(String.class).convention('[Gradle Release Plugin] - pre tag commit: ')
4054

55+
@Input
4156
Property<String> tagCommitMessage = project.objects.property(String.class).convention('[Gradle Release Plugin] - creating tag: ')
4257

58+
@Input
4359
Property<String> newVersionCommitMessage = project.objects.property(String.class).convention('[Gradle Release Plugin] - new version commit: ')
4460

61+
@Input
4562
Property<String> snapshotSuffix = project.objects.property(String.class).convention('-SNAPSHOT')
4663

64+
@Input
4765
Property<String> tagTemplate = project.objects.property(String.class).convention('$version')
4866

67+
@Input
4968
Property<String> versionPropertyFile = project.objects.property(String.class).convention('gradle.properties')
5069

70+
@Input
5171
ListProperty<String> versionProperties = project.objects.listProperty(String.class).convention([])
5272

73+
@Input
5374
ListProperty<String> buildTasks = project.objects.listProperty(String.class).convention([])
5475

76+
@Input
5577
ListProperty<String> ignoredSnapshotDependencies = project.objects.listProperty(String.class).convention([])
5678

79+
@Input
5780
Map<String, Closure<String>> versionPatterns = [
5881
// Increments last number: "2.5-SNAPSHOT" => "2.6-SNAPSHOT"
5982
/(\d+)([^\d]*$)/: { Matcher m, Project p -> m.replaceAll("${(m[0][1] as int) + 1}${m[0][2]}") }
6083
]
6184

85+
@Nested
86+
GitAdapter.GitConfig git = new GitAdapter.GitConfig()
87+
88+
@Nested
89+
SvnAdapter.SvnConfig svn = new SvnAdapter.SvnConfig()
90+
6291
List<Class<? extends BaseScmAdapter>> scmAdapters = [
6392
GitAdapter,
6493
SvnAdapter,
6594
HgAdapter,
6695
BzrAdapter
6796
]
6897

98+
@Internal
6999
BaseScmAdapter scmAdapter
70100

101+
@Internal
71102
private Project project
72103

104+
@Internal
73105
Map<String, Object> attributes // General plugin attributes
74106

75107
ReleaseExtension(Project project, Map<String, Object> attributes) {
@@ -80,38 +112,6 @@ class ReleaseExtension {
80112
metaClass = mc
81113
}
82114

83-
def propertyMissing(String name) {
84-
BaseScmAdapter adapter = getAdapterForName(name)
85-
Object result = adapter?.createNewConfig()
86-
87-
if (!adapter || !result) {
88-
throw new MissingPropertyException(name, this.class)
89-
}
90-
91-
metaClass."$name" = result
92-
}
93-
94-
def propertyMissing(String name, value) {
95-
BaseScmAdapter adapter = getAdapterForName(name)
96-
97-
if (!adapter) {
98-
throw new MissingPropertyException(name, this.class)
99-
}
100-
metaClass."$name" = value
101-
}
102-
103-
def methodMissing(String name, args) {
104-
metaClass."$name" = { Closure varClosure ->
105-
return ConfigureUtil.configure(varClosure, this."$name")
106-
}
107-
108-
try {
109-
return ConfigureUtil.configure(args[0] as Closure, this."$name")
110-
} catch (MissingPropertyException ignored) {
111-
throw new MissingMethodException(name, this.class, args)
112-
}
113-
}
114-
115115
private BaseScmAdapter getAdapterForName(String name) {
116116
BaseScmAdapter adapter = null
117117
scmAdapters.find {

src/main/groovy/net/researchgate/release/SvnAdapter.groovy

-5
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,6 @@ class SvnAdapter extends BaseScmAdapter {
3737
boolean pinExternals = false
3838
}
3939

40-
@Override
41-
Object createNewConfig() {
42-
return new SvnConfig();
43-
}
44-
4540
@Override
4641
boolean isSupported(File directory) {
4742
if (!directory.list().grep('.svn')) {

src/main/groovy/net/researchgate/release/tasks/BaseReleaseTask.groovy

+10
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import org.apache.tools.ant.BuildException
77
import org.gradle.api.DefaultTask
88
import org.gradle.api.GradleException
99
import org.gradle.api.Project
10+
import org.gradle.api.tasks.Input
11+
import org.gradle.api.tasks.Internal
12+
import org.gradle.api.tasks.Nested
1013
import org.slf4j.Logger
1114
import org.slf4j.LoggerFactory
1215

@@ -17,9 +20,13 @@ class BaseReleaseTask extends DefaultTask {
1720
private static final String LINE_SEP = System.getProperty('line.separator')
1821
private static final String PROMPT = "${LINE_SEP}??>"
1922

23+
@Nested
2024
ReleaseExtension extension
25+
26+
@Internal
2127
Map<String, Object> pluginAttributes
2228

29+
@Internal
2330
Project getRootProject() {
2431
def project = getProject()
2532
if (project.getParent() != null) {
@@ -34,6 +41,7 @@ class BaseReleaseTask extends DefaultTask {
3441
pluginAttributes = extension.attributes
3542
}
3643

44+
@Internal
3745
BaseScmAdapter getScmAdapter() {
3846
return extension.scmAdapter
3947
}
@@ -46,6 +54,7 @@ class BaseReleaseTask extends DefaultTask {
4654
*
4755
* @return SLF4J {@link org.slf4j.Logger} instance
4856
*/
57+
@Internal
4958
Logger getLog() { getProject()?.logger ?: LoggerFactory.getLogger(this.class) }
5059

5160
boolean useAutomaticVersion() {
@@ -91,6 +100,7 @@ class BaseReleaseTask extends DefaultTask {
91100
}
92101
}
93102

103+
@Internal
94104
boolean isVersionDefined() {
95105
getProject().version && Project.DEFAULT_VERSION != getProject().version
96106
}

src/test/groovy/net/researchgate/release/GitReleasePluginIntegrationTests.groovy

+22-12
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,14 @@
1010

1111
package net.researchgate.release
1212

13+
import net.researchgate.release.cli.Executor
14+
import org.eclipse.jgit.api.ResetCommand
1315
import org.gradle.testkit.runner.BuildResult
1416
import org.gradle.testkit.runner.GradleRunner
1517
import org.gradle.testkit.runner.TaskOutcome
1618

19+
import static org.eclipse.jgit.lib.Repository.shortenRefName
20+
1721
class GitReleasePluginIntegrationTests extends GitSpecification {
1822

1923
File settingsFile
@@ -57,6 +61,7 @@ class GitReleasePluginIntegrationTests extends GitSpecification {
5761
}
5862
"""
5963
}
64+
6065
}
6166

6267
def cleanup() {
@@ -76,19 +81,24 @@ class GitReleasePluginIntegrationTests extends GitSpecification {
7681
.withPluginClasspath()
7782
.build()
7883
def st = localGit.status().call()
84+
gitCheckoutBranch(remoteGit)
85+
remoteGit.reset().setMode(ResetCommand.ResetType.HARD).setRef("HEAD").call()
7986
then: 'execution was successful'
8087
result.tasks.each {it.outcome == TaskOutcome.SUCCESS }
81-
// and: 'project version updated'
82-
// propertiesFile.text == 'version=1.2\n'
83-
// and: 'mo modified files in local repo'
84-
// st.modified.size() == 0 && st.added.size() == 0 && st.changed.size() == 0
85-
// and: 'tag with old version 1.1 created in local repo'
86-
// localGit.tagList().call().any { shortenRefName(it.name) == '1.1' }
87-
// and: 'property file updated to new version in local repo'
88-
// localGit.repository.workTree.listFiles().any { it.name == 'gradle.properties' && it.text.contains("version=1.2") }
89-
// and: 'property file with new version pushed to remote repo'
90-
// remoteGit.repository.workTree.listFiles().any { it.name == 'gradle.properties' && it.text.contains("version=1.2") }
91-
// and: 'tag with old version 1.1 pushed to remote repo'
92-
// remoteGit.tagList().call().any { shortenRefName(it.name) == '1.1' }
88+
and: 'project version updated'
89+
propertiesFile.text == 'version=1.2\n'
90+
and: 'mo modified files in local repo'
91+
st.modified.size() == 0
92+
st.added.size() == 0
93+
st.changed.size() == 0
94+
st.uncommittedChanges.size() == 0
95+
and: 'tag with old version 1.1 created in local repo'
96+
localGit.tagList().call().any { shortenRefName(it.name) == '1.1' }
97+
and: 'tag with old version 1.1 pushed to remote repo'
98+
remoteGit.tagList().call().any { shortenRefName(it.name) == '1.1' }
99+
and: 'property file updated to new version in local repo'
100+
new File(localGit.repository.workTree.getAbsolutePath(), 'gradle.properties').text == 'version=1.2\n'
101+
and: 'property file with new version pushed to remote repo'
102+
new File(remoteGit.repository.workTree.getAbsolutePath(), 'gradle.properties').text == 'version=1.2\n'
93103
}
94104
}

0 commit comments

Comments
 (0)