Skip to content

Commit 8a139d0

Browse files
Update fetching boolean propertes in buildscripts
1 parent 6644ecf commit 8a139d0

8 files changed

Lines changed: 109 additions & 81 deletions

File tree

.github/workflows/gradle-publish-release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,4 @@ jobs:
4141
run: |
4242
VERSION="${GITHUB_REF_NAME#v}" # removes leading 'v' from tag name
4343
echo "::notice::publishing version $VERSION"
44-
./gradlew -Pversion="$VERSION" -Psign publishAllPublicationsToCentralPortal
44+
./gradlew -Pversion="$VERSION" -Psign -Pspotless.license-year-enabled publishAllPublicationsToCentralPortal

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,14 @@ task. **Note** that **building will fail** if code is not properly formatted.
167167
./gradlew spotlessApply
168168
```
169169

170+
**Note** that if the year has changed, add `-Pspotless.license-year-enabled` flag to update the year in license headers.
171+
The [publishing GitHub Action](.github/workflows/gradle-publish-release.yml) will fail if the year is not updated, but
172+
for local development and builds you can choose to skip it and update the year later.
173+
174+
```bash
175+
./gradlew spotlessApply -Pspotless.license-year-enabled
176+
```
177+
170178
To publish the built artifacts to local Maven repository, use `publishToMavenLocal` task.
171179

172180
```bash

build.gradle.kts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import com.diffplug.spotless.LineEnding
2+
import internal.getBooleanProperty
23

34
plugins {
45
id("internal.java-library-convention")
@@ -36,10 +37,11 @@ nmcp {
3637

3738
spotless {
3839
val licenseHeader = "${rootProject.rootDir}/gradle/license-header.java"
40+
val updateLicenseYear = project.getBooleanProperty("spotless.license-year-enabled")
3941

4042
java {
4143
target("**/src/**/*.java")
42-
licenseHeaderFile(licenseHeader).updateYearWithLatest(true)
44+
licenseHeaderFile(licenseHeader).updateYearWithLatest(updateLicenseYear)
4345

4446
// NOTE: decided not to upgrade Google Java Format, as versions 1.29+ require running it on Java 21
4547
googleJavaFormat("1.28.0")
@@ -54,7 +56,9 @@ spotless {
5456
// License headers in these files are not formatted with standard java group, so we need to use custom settings.
5557
// The regex is designed find out where the code starts in these files, so the license header can be placed
5658
// before it. The code starts with either "package", "import", "module" or "/**" in case of a global JavaDoc.
57-
licenseHeaderFile(licenseHeader, "^(package|import|module|/\\*\\*)").updateYearWithLatest(true)
59+
val delimiter = "^(package|import|module|/\\*\\*)"
60+
61+
licenseHeaderFile(licenseHeader, delimiter).updateYearWithLatest(updateLicenseYear)
5862
}
5963

6064
kotlin {

buildSrc/src/main/kotlin/internal.publishing-convention.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import internal.InternalPublishingExtension
22
import internal.findDevelopers
33
import internal.findLicenses
4+
import internal.getBooleanProperty
45

56
plugins {
67
id("internal.common-convention")
@@ -70,7 +71,7 @@ publishing {
7071
}
7172

7273
signing {
73-
if (project.hasProperty("sign")) {
74+
if (project.getBooleanProperty("sign")) {
7475
useInMemoryPgpKeys(System.getenv("SIGNING_KEY"), System.getenv("SIGNING_PASSWORD"))
7576
sign(publishing.publications["maven"])
7677
}
Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package internal
22

3-
import org.gradle.api.Project
4-
53
/**
64
* Represents a single developer entry used in publishing metadata (e.g. POM developers section).
75
*
@@ -23,41 +21,3 @@ data class Developer(
2321
val organization: String?,
2422
val organizationUrl: String?,
2523
)
26-
27-
/**
28-
* Evaluates a structured list of developers defined in `gradle.properties`.
29-
*
30-
* Developers are resolved using zero-based indexing and the following property naming convention:
31-
* ```properties
32-
* internal.pom.developers.0.id=john.doe
33-
* internal.pom.developers.0.name=JohnDoe
34-
* internal.pom.developers.0.url=https://johndoe.me
35-
*
36-
* internal.pom.developers.1.id=otherdev
37-
* internal.pom.developers.1.name=Other Developer
38-
* ```
39-
*
40-
* Evaluation stops at the first missing mandatory `id` property. This allows the list to be
41-
* extended by simply adding the next index.
42-
*
43-
* @return An ordered list of resolved [Developer] definitions.
44-
* @receiver Gradle [Project] from which properties are read.
45-
*/
46-
fun Project.findDevelopers(): List<Developer> {
47-
val developers = mutableListOf<Developer>()
48-
var index = 0
49-
while (true) {
50-
developers.add(
51-
Developer(
52-
findProperty("internal.pom.developers.$index.id") as? String ?: break,
53-
findProperty("internal.pom.developers.$index.name") as? String,
54-
findProperty("internal.pom.developers.$index.url") as? String,
55-
findProperty("internal.pom.developers.$index.email") as? String,
56-
findProperty("internal.pom.developers.$index.organization") as? String,
57-
findProperty("internal.pom.developers.$index.organization-url") as? String,
58-
)
59-
)
60-
index++
61-
}
62-
return developers
63-
}
Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package internal
22

3-
import org.gradle.api.Project
4-
53
/**
64
* Represents a single developer entry used in publishing metadata (e.g. POM developers section).
75
*
@@ -17,37 +15,3 @@ data class License(
1715
val distribution: String?,
1816
val comments: String?,
1917
)
20-
21-
/**
22-
* Evaluates a structured list of licenses defined in `gradle.properties`.
23-
*
24-
* Licenses are resolved using zero-based indexing and the following property naming convention:
25-
* ```properties
26-
* internal.pom.licenses.0.name=MIT License
27-
* internal.pom.licenses.0.url=https://opensource.org/license/MIT
28-
*
29-
* internal.pom.licenses.1.name=Apache-2.0 License
30-
* ```
31-
*
32-
* Evaluation stops at the first missing mandatory `name` property. This allows the list to be
33-
* extended by simply adding the next index.
34-
*
35-
* @return An ordered list of resolved [License] definitions.
36-
* @receiver Gradle [Project] from which properties are read.
37-
*/
38-
fun Project.findLicenses(): List<License> {
39-
val developers = mutableListOf<License>()
40-
var index = 0
41-
while (true) {
42-
developers.add(
43-
License(
44-
findProperty("internal.pom.licenses.$index.name") as? String ?: break,
45-
findProperty("internal.pom.licenses.$index.url") as? String,
46-
findProperty("internal.pom.licenses.$index.distribution") as? String,
47-
findProperty("internal.pom.licenses.$index.comments") as? String,
48-
)
49-
)
50-
index++
51-
}
52-
return developers
53-
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package internal
2+
3+
// This file contains extension functions for Gradle's Project API.
4+
5+
import org.gradle.api.Project
6+
7+
/**
8+
* Evaluates a structured list of developers defined in `gradle.properties`.
9+
*
10+
* Developers are resolved using zero-based indexing and the following property naming convention:
11+
* ```properties
12+
* internal.pom.developers.0.id=john.doe
13+
* internal.pom.developers.0.name=JohnDoe
14+
* internal.pom.developers.0.url=https://johndoe.me
15+
*
16+
* internal.pom.developers.1.id=otherdev
17+
* internal.pom.developers.1.name=Other Developer
18+
* ```
19+
*
20+
* Evaluation stops at the first missing mandatory `id` property. This allows the list to be
21+
* extended by simply adding the next index.
22+
*
23+
* @return An ordered list of resolved [Developer] definitions.
24+
* @receiver Gradle [Project] from which properties are read.
25+
*/
26+
fun Project.findDevelopers(): List<Developer> {
27+
val developers = mutableListOf<Developer>()
28+
var index = 0
29+
while (true) {
30+
developers.add(
31+
Developer(
32+
findProperty("internal.pom.developers.$index.id") as? String ?: break,
33+
findProperty("internal.pom.developers.$index.name") as? String,
34+
findProperty("internal.pom.developers.$index.url") as? String,
35+
findProperty("internal.pom.developers.$index.email") as? String,
36+
findProperty("internal.pom.developers.$index.organization") as? String,
37+
findProperty("internal.pom.developers.$index.organization-url") as? String,
38+
)
39+
)
40+
index++
41+
}
42+
return developers
43+
}
44+
45+
/**
46+
* Evaluates a structured list of licenses defined in `gradle.properties`.
47+
*
48+
* Licenses are resolved using zero-based indexing and the following property naming convention:
49+
* ```properties
50+
* internal.pom.licenses.0.name=MIT License
51+
* internal.pom.licenses.0.url=https://opensource.org/license/MIT
52+
*
53+
* internal.pom.licenses.1.name=Apache-2.0 License
54+
* ```
55+
*
56+
* Evaluation stops at the first missing mandatory `name` property. This allows the list to be
57+
* extended by simply adding the next index.
58+
*
59+
* @return An ordered list of resolved [License] definitions.
60+
* @receiver Gradle [Project] from which properties are read.
61+
*/
62+
fun Project.findLicenses(): List<License> {
63+
val developers = mutableListOf<License>()
64+
var index = 0
65+
while (true) {
66+
developers.add(
67+
License(
68+
findProperty("internal.pom.licenses.$index.name") as? String ?: break,
69+
findProperty("internal.pom.licenses.$index.url") as? String,
70+
findProperty("internal.pom.licenses.$index.distribution") as? String,
71+
findProperty("internal.pom.licenses.$index.comments") as? String,
72+
)
73+
)
74+
index++
75+
}
76+
return developers
77+
}
78+
79+
/**
80+
* Retrieves a boolean property from the project, interpreting any value other than `"false"` as
81+
* `true`.
82+
*
83+
* @param name The name of the property to retrieve.
84+
* @param defaultValue The default boolean value to return if the property is not set. Defaults to
85+
* `false`.
86+
* @return The boolean value of the property, or [defaultValue] if the property is not set.
87+
* @receiver Gradle [Project] from which the property is read.
88+
*/
89+
fun Project.getBooleanProperty(name: String, defaultValue: Boolean = false): Boolean {
90+
return if (hasProperty(name)) findProperty(name)?.toString() != "false" else defaultValue
91+
}

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ org.gradle.workers.max=4
77
group=io.github.problem4j
88
version=1.4.1-SNAPSHOT
99
#
10-
# Project internal settings
10+
# Internal buildscript settings
1111
internal.pom.url=https://github.com/problem4j/problem4j-core
1212
internal.pom.inception-year=2025
1313
internal.pom.licenses.0.name=MIT License

0 commit comments

Comments
 (0)