Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 0ce1b0a

Browse files
committed
build: perf parse of versions local plugin
With this change remove manual parser of libs.versions.toml file and use java Properties API. Additional retrieve data of the file with PropertiesSource of gradle to be ready with configuration cache.
1 parent 23b63a6 commit 0ce1b0a

File tree

3 files changed

+110
-129
lines changed

3 files changed

+110
-129
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package org.hibernate.reactive.env;
2+
3+
import org.gradle.api.file.RegularFileProperty;
4+
import org.gradle.api.provider.ValueSource;
5+
import org.gradle.api.provider.ValueSourceParameters;
6+
7+
import java.io.FileInputStream;
8+
import java.util.Properties;
9+
10+
/**
11+
* Reads gradle/version.properties and returns the "projectVersion" property.
12+
* Compatible with Configuration Cache (Gradle declares the file as input).
13+
*/
14+
public abstract class VersionPropertiesSource implements ValueSource<String, VersionPropertiesSource.Params> {
15+
public interface Params extends ValueSourceParameters {
16+
RegularFileProperty getFile();
17+
}
18+
19+
@Override
20+
public String obtain() {
21+
final var file = getParameters().getFile().getAsFile().get();
22+
if ( !file.exists() ) {
23+
throw new RuntimeException( "Version file " + file.getAbsolutePath() + " does not exists" );
24+
}
25+
final var props = new Properties();
26+
try (final var in = new FileInputStream( file )) {
27+
props.load( in );
28+
}
29+
catch (Exception e) {
30+
throw new RuntimeException( "Unable to load properties from file - " + file.getAbsolutePath(), e );
31+
}
32+
return props.getProperty( "projectVersion" );
33+
}
34+
}

‎local-build-plugins/src/main/java/org/hibernate/reactive/env/VersionsPlugin.java

Lines changed: 76 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
package org.hibernate.reactive.env;
22

33
import java.io.File;
4-
import java.io.FileInputStream;
5-
import java.io.IOException;
6-
import java.io.InputStream;
7-
import java.util.Properties;
8-
import java.util.function.Consumer;
4+
import java.util.Optional;
95

106
import org.gradle.api.Plugin;
117
import org.gradle.api.Project;
8+
import org.gradle.api.artifacts.VersionCatalog;
9+
import org.gradle.api.artifacts.VersionCatalogsExtension;
10+
import org.gradle.api.artifacts.VersionConstraint;
11+
import org.gradle.api.logging.Logger;
12+
import org.gradle.api.provider.Provider;
1213

1314
/**
1415
* Build plugin which applies some DSL extensions to the Project. Currently, these
@@ -28,47 +29,71 @@ public class VersionsPlugin implements Plugin<Project> {
2829
public static final String SKIP_ORM_VERSION_PARSING = "skipOrmVersionParsing";
2930

3031
public static final String RELATIVE_FILE = "gradle/version.properties";
31-
public static final String RELATIVE_CATALOG = "gradle/libs.versions.toml";
3232

3333
@Override
3434
public void apply(Project project) {
35+
final Logger log = project.getLogger();
36+
37+
// Expose the version file as an extension
3538
final File versionFile = project.getRootProject().file( RELATIVE_FILE );
3639
project.getExtensions().add( VERSION_FILE, versionFile );
3740

41+
// 1) release/development via -P if they come
3842
final ProjectVersion releaseVersion = determineReleaseVersion( project );
3943
final ProjectVersion developmentVersion = determineDevelopmentVersion( project );
40-
final ProjectVersion projectVersion = determineProjectVersion( project, releaseVersion, versionFile );
4144

42-
project.getLogger().lifecycle( "Project version: {} ({})", projectVersion.getFullName(), projectVersion.getFamily() );
45+
// 2) read projectVersion from version.properties using ValueSource (cacheable)
46+
final var projectVersionString = project.getProviders().of(
47+
VersionPropertiesSource.class, spec -> {
48+
final var rf = project.getLayout()
49+
.getProjectDirectory()
50+
.file( RELATIVE_FILE );
51+
spec.getParameters().getFile().set( rf );
52+
}
53+
);
54+
55+
final ProjectVersion projectVersion = determineProjectVersion(
56+
project, releaseVersion, projectVersionString
57+
);
58+
59+
log.lifecycle( "Project version: {} ({})", projectVersion.getFullName(), projectVersion.getFamily() );
4360
project.getExtensions().add( PROJECT_VERSION, projectVersion );
4461

4562
if ( releaseVersion != null ) {
46-
project.getLogger().lifecycle( "Release version: {} ({})", releaseVersion.getFullName(), releaseVersion.getFamily() );
63+
log.lifecycle( "Release version: {} ({})", releaseVersion.getFullName(), releaseVersion.getFamily() );
4764
project.getExtensions().add( RELEASE_VERSION, releaseVersion );
4865
}
4966
else {
50-
project.getLogger().lifecycle( "Release version: n/a" );
67+
log.lifecycle( "Release version: n/a" );
5168
}
5269

5370
if ( developmentVersion != null ) {
54-
project.getLogger().lifecycle( "Development version: {} ({})", developmentVersion.getFullName(), developmentVersion.getFamily() );
71+
log.lifecycle(
72+
"Development version: {} ({})",
73+
developmentVersion.getFullName(),
74+
developmentVersion.getFamily()
75+
);
5576
project.getExtensions().add( DEVELOPMENT_VERSION, developmentVersion );
5677
}
5778
else {
58-
project.getLogger().lifecycle( "Development version: n/a" );
79+
log.lifecycle( "Development version: n/a" );
5980
}
6081

61-
final VersionsTomlParser tomlParser = new VersionsTomlParser( project.getRootProject().file( RELATIVE_CATALOG ) );
62-
final String ormVersionString = determineOrmVersion( project, tomlParser );
82+
// 3) Version Catalog ("libs") See local-build-plugins/settings.gradle
83+
final VersionCatalogsExtension catalogs = project.getExtensions().getByType( VersionCatalogsExtension.class );
84+
final VersionCatalog libs = catalogs.named( "libs" );
85+
86+
final String ormVersionString = determineOrmVersion( project, libs );
6387
final Object ormVersion = resolveOrmVersion( ormVersionString, project );
64-
project.getLogger().lifecycle( "ORM version: {}", ormVersion );
88+
log.lifecycle( "ORM version: {}", ormVersion );
6589
project.getExtensions().add( ORM_VERSION, ormVersion );
6690

67-
final Object ormPluginVersion = determineOrmPluginVersion( ormVersion, project, tomlParser );
68-
project.getLogger().lifecycle( "ORM Gradle plugin version: {}", ormPluginVersion );
91+
final Object ormPluginVersion = determineOrmPluginVersion( ormVersion, project, libs );
92+
log.lifecycle( "ORM Gradle plugin version: {}", ormPluginVersion );
6993
project.getExtensions().add( ORM_PLUGIN_VERSION, ormPluginVersion );
7094
}
7195

96+
// --- Release / Development (with -P) --------------------------------------
7297
private ProjectVersion determineReleaseVersion(Project project) {
7398
if ( project.hasProperty( RELEASE_VERSION ) ) {
7499
final Object version = project.property( RELEASE_VERSION );
@@ -89,74 +114,66 @@ private ProjectVersion determineDevelopmentVersion(Project project) {
89114
return null;
90115
}
91116

92-
public static ProjectVersion determineProjectVersion(Project project, ProjectVersion releaseVersion, File versionFile) {
117+
// --- Project version (ValueSource for configuration cache) ---------------
118+
119+
public static ProjectVersion determineProjectVersion(
120+
Project project,
121+
ProjectVersion releaseVersion,
122+
Provider<String> projectVersionString
123+
) {
93124
if ( releaseVersion != null ) {
94125
return releaseVersion;
95126
}
96-
97-
final String fullName = readVersionProperties( versionFile );
98-
return new ProjectVersion( fullName );
99-
}
100-
101-
private static String readVersionProperties(File file) {
102-
if ( !file.exists() ) {
103-
throw new RuntimeException( "Version file " + file.getAbsolutePath() + " does not exists" );
127+
// if don't have an explicit release, use value of file (with ValueSource)
128+
final String fullName = projectVersionString.get();
129+
if ( fullName.isEmpty() ) {
130+
final var file = project.getRootProject().file( RELATIVE_FILE );
131+
throw new RuntimeException( "Property 'projectVersion' is missing in " + file.getAbsolutePath() );
104132
}
105-
106-
final Properties versionProperties = new Properties();
107-
withInputStream( file, (stream) -> {
108-
try {
109-
versionProperties.load( stream );
110-
}
111-
catch (IOException e) {
112-
throw new RuntimeException( "Unable to load properties from file - " + file.getAbsolutePath(), e );
113-
}
114-
} );
115-
116-
return versionProperties.getProperty( "projectVersion" );
133+
return new ProjectVersion( fullName );
117134
}
118135

119-
private static void withInputStream(File file, Consumer<InputStream> action) {
120-
try ( final FileInputStream stream = new FileInputStream( file ) ) {
121-
action.accept( stream );
122-
}
123-
catch (IOException e) {
124-
throw new RuntimeException( "Error reading file stream = " + file.getAbsolutePath(), e );
125-
}
126-
}
136+
// --- ORM version from -P or catalogs ------------------------------------
127137

128-
private String determineOrmVersion(Project project, VersionsTomlParserparser) {
138+
private String determineOrmVersion(Project project, VersionCataloglibs) {
129139
// Check if it has been set in the project
140+
// -PhibernateOrmVersion have priority
130141
if ( project.hasProperty( ORM_VERSION ) ) {
131142
return (String) project.property( ORM_VERSION );
132143
}
133-
134-
// Check in the catalog
135-
final String version = parser.read( ORM_VERSION );
136-
if ( version != null ) {
137-
return version;
144+
// Find in Version Catalog
145+
final Optional<VersionConstraint> vc = libs.findVersion( ORM_VERSION );
146+
if ( vc.isPresent() ) {
147+
final String required = vc.get().getRequiredVersion();
148+
if ( !required.isEmpty() ) {
149+
return required;
150+
}
138151
}
139152
throw new IllegalStateException( "Hibernate ORM version not specified on project" );
140153
}
141154

142155
private Object resolveOrmVersion(String stringForm, Project project) {
143156
if ( project.hasProperty( SKIP_ORM_VERSION_PARSING )
144-
&& Boolean.parseBoolean( (String) project.property( SKIP_ORM_VERSION_PARSING ) ) ) {
157+
&& Boolean.parseBoolean( (String) project.property( SKIP_ORM_VERSION_PARSING ) )
158+
) {
145159
return stringForm;
146160
}
147161
return new ProjectVersion( stringForm );
148162
}
149163

150-
private Object determineOrmPluginVersion(Object ormVersion, Project project, VersionsTomlParserparser) {
164+
private Object determineOrmPluginVersion(Object ormVersion, Project project, VersionCataloglibs) {
151165
// Check if it has been set in the project
166+
// -PhibernateOrmGradlePluginVersion have priority
152167
if ( project.hasProperty( ORM_PLUGIN_VERSION ) ) {
153168
return project.property( ORM_PLUGIN_VERSION );
154169
}
155-
156-
// Check in the catalog
157-
final String version = parser.read( ORM_PLUGIN_VERSION );
158-
if ( version != null ) {
159-
return version;
170+
// Find in Version Catalog
171+
final Optional<VersionConstraint> vc = libs.findVersion( ORM_PLUGIN_VERSION );
172+
if ( vc.isPresent() ) {
173+
final String required = vc.get().getRequiredVersion();
174+
if ( !required.isEmpty() ) {
175+
return required;
176+
}
160177
}
161178

162179
throw new IllegalStateException( "Hibernate ORM Gradle plugin version not specified on project" );

‎local-build-plugins/src/main/java/org/hibernate/reactive/env/VersionsTomlParser.java

Lines changed: 0 additions & 70 deletions
This file was deleted.

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /