Skip to content

Commit 27f3523

Browse files
committed
build: perf parse of versions local plugin
1 parent 5f278d8 commit 27f3523

File tree

3 files changed

+178
-210
lines changed

3 files changed

+178
-210
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+
* @author Rey Acosta (Kingg22)
14+
*/
15+
public abstract class VersionPropertiesSource implements ValueSource<String, VersionPropertiesSource.Params> {
16+
public interface Params extends ValueSourceParameters {
17+
RegularFileProperty getFile();
18+
}
19+
20+
@Override
21+
public String obtain() {
22+
final var file = getParameters().getFile().getAsFile().get();
23+
if ( !file.exists() ) {
24+
throw new RuntimeException( "Version file " + file.getAbsolutePath() + " does not exists" );
25+
}
26+
final var props = new Properties();
27+
try ( final var in = new FileInputStream(file) ) {
28+
props.load(in);
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+
}
Lines changed: 144 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,17 @@
11
package org.hibernate.reactive.env;
22

3-
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;
9-
103
import org.gradle.api.Plugin;
4+
import org.gradle.api.artifacts.VersionCatalog;
5+
import org.gradle.api.artifacts.VersionCatalogsExtension;
6+
import org.gradle.api.provider.Provider;
117
import org.gradle.api.Project;
128

139
/**
1410
* Build plugin which applies some DSL extensions to the Project. Currently, these
1511
* extensions are all related to version.
1612
*
1713
* @author Steve Ebersole
14+
* @author Rey Acosta (Kingg22)
1815
*/
1916
public class VersionsPlugin implements Plugin<Project> {
2017
public static final String VERSION_FILE = "versionFile";
@@ -28,137 +25,144 @@ public class VersionsPlugin implements Plugin<Project> {
2825
public static final String SKIP_ORM_VERSION_PARSING = "skipOrmVersionParsing";
2926

3027
public static final String RELATIVE_FILE = "gradle/version.properties";
31-
public static final String RELATIVE_CATALOG = "gradle/libs.versions.toml";
32-
33-
@Override
34-
public void apply(Project project) {
35-
final File versionFile = project.getRootProject().file( RELATIVE_FILE );
36-
project.getExtensions().add( VERSION_FILE, versionFile );
37-
38-
final ProjectVersion releaseVersion = determineReleaseVersion( project );
39-
final ProjectVersion developmentVersion = determineDevelopmentVersion( project );
40-
final ProjectVersion projectVersion = determineProjectVersion( project, releaseVersion, versionFile );
41-
42-
project.getLogger().lifecycle( "Project version: {} ({})", projectVersion.getFullName(), projectVersion.getFamily() );
43-
project.getExtensions().add( PROJECT_VERSION, projectVersion );
44-
45-
if ( releaseVersion != null ) {
46-
project.getLogger().lifecycle( "Release version: {} ({})", releaseVersion.getFullName(), releaseVersion.getFamily() );
47-
project.getExtensions().add( RELEASE_VERSION, releaseVersion );
48-
}
49-
else {
50-
project.getLogger().lifecycle( "Release version: n/a" );
51-
}
52-
53-
if ( developmentVersion != null ) {
54-
project.getLogger().lifecycle( "Development version: {} ({})", developmentVersion.getFullName(), developmentVersion.getFamily() );
55-
project.getExtensions().add( DEVELOPMENT_VERSION, developmentVersion );
56-
}
57-
else {
58-
project.getLogger().lifecycle( "Development version: n/a" );
59-
}
60-
61-
final VersionsTomlParser tomlParser = new VersionsTomlParser( project.getRootProject().file( RELATIVE_CATALOG ) );
62-
final String ormVersionString = determineOrmVersion( project, tomlParser );
63-
final Object ormVersion = resolveOrmVersion( ormVersionString, project );
64-
project.getLogger().lifecycle( "ORM version: {}", ormVersion );
65-
project.getExtensions().add( ORM_VERSION, ormVersion );
66-
67-
final Object ormPluginVersion = determineOrmPluginVersion( ormVersion, project, tomlParser );
68-
project.getLogger().lifecycle( "ORM Gradle plugin version: {}", ormPluginVersion );
69-
project.getExtensions().add( ORM_PLUGIN_VERSION, ormPluginVersion );
70-
}
71-
72-
private ProjectVersion determineReleaseVersion(Project project) {
73-
if ( project.hasProperty( RELEASE_VERSION ) ) {
74-
final Object version = project.property( RELEASE_VERSION );
75-
if ( version != null ) {
76-
return new ProjectVersion( (String) version );
77-
}
78-
}
79-
return null;
80-
}
81-
82-
private ProjectVersion determineDevelopmentVersion(Project project) {
83-
if ( project.hasProperty( DEVELOPMENT_VERSION ) ) {
84-
final Object version = project.property( DEVELOPMENT_VERSION );
85-
if ( version != null ) {
86-
return new ProjectVersion( (String) version );
87-
}
88-
}
89-
return null;
90-
}
91-
92-
public static ProjectVersion determineProjectVersion(Project project, ProjectVersion releaseVersion, File versionFile) {
93-
if ( releaseVersion != null ) {
94-
return releaseVersion;
95-
}
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" );
104-
}
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" );
117-
}
118-
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-
}
127-
128-
private String determineOrmVersion(Project project, VersionsTomlParser parser) {
129-
// Check if it has been set in the project
130-
if ( project.hasProperty( ORM_VERSION ) ) {
131-
return (String) project.property( ORM_VERSION );
132-
}
133-
134-
// Check in the catalog
135-
final String version = parser.read( ORM_VERSION );
136-
if ( version != null ) {
137-
return version;
138-
}
139-
throw new IllegalStateException( "Hibernate ORM version not specified on project" );
140-
}
141-
142-
private Object resolveOrmVersion(String stringForm, Project project) {
143-
if ( project.hasProperty( SKIP_ORM_VERSION_PARSING )
144-
&& Boolean.parseBoolean( (String) project.property( SKIP_ORM_VERSION_PARSING ) ) ) {
145-
return stringForm;
146-
}
147-
return new ProjectVersion( stringForm );
148-
}
149-
150-
private Object determineOrmPluginVersion(Object ormVersion, Project project, VersionsTomlParser parser) {
151-
// Check if it has been set in the project
152-
if ( project.hasProperty( ORM_PLUGIN_VERSION ) ) {
153-
return project.property( ORM_PLUGIN_VERSION );
154-
}
155-
156-
// Check in the catalog
157-
final String version = parser.read( ORM_PLUGIN_VERSION );
158-
if ( version != null ) {
159-
return version;
160-
}
161-
162-
throw new IllegalStateException( "Hibernate ORM Gradle plugin version not specified on project" );
163-
}
28+
29+
@Override
30+
public void apply(Project project) {
31+
final var log = project.getLogger();
32+
33+
// Expose the version file as an extension
34+
final var versionFile = project.getRootProject().file( RELATIVE_FILE );
35+
project.getExtensions().add( VERSION_FILE, versionFile );
36+
37+
// 1) release/development via -P if they come
38+
final var releaseVersion = determineReleaseVersion(project);
39+
final var developmentVersion = determineDevelopmentVersion(project);
40+
41+
// 2) read projectVersion from version.properties using ValueSource (cacheable)
42+
final var projectVersionString = project.getProviders().of(
43+
VersionPropertiesSource.class, spec -> {
44+
final var rf = project.getLayout()
45+
.getProjectDirectory()
46+
.file( RELATIVE_FILE );
47+
spec.getParameters().getFile().set(rf);
48+
}
49+
);
50+
51+
final var projectVersion = determineProjectVersion(
52+
project, releaseVersion, projectVersionString
53+
);
54+
55+
log.lifecycle( "Project version: {} ({})", projectVersion.getFullName(), projectVersion.getFamily() );
56+
project.getExtensions().add( PROJECT_VERSION, projectVersion );
57+
58+
if ( releaseVersion != null ) {
59+
log.lifecycle( "Release version: {} ({})", releaseVersion.getFullName(), releaseVersion.getFamily() );
60+
project.getExtensions().add( RELEASE_VERSION, releaseVersion );
61+
} else {
62+
log.lifecycle( "Release version: n/a" );
63+
}
64+
65+
if ( developmentVersion != null ) {
66+
log.lifecycle( "Development version: {} ({})", developmentVersion.getFullName(), developmentVersion.getFamily() );
67+
project.getExtensions().add( DEVELOPMENT_VERSION, developmentVersion );
68+
} else {
69+
log.lifecycle( "Development version: n/a" );
70+
}
71+
72+
// 3) Version Catalog ("libs") See local-build-plugins/settings.gradle
73+
final var catalogs = project.getExtensions().getByType( VersionCatalogsExtension.class );
74+
final var libs = catalogs.named( "libs" );
75+
76+
final var ormVersionString = determineOrmVersion(project, libs);
77+
final var ormVersion = resolveOrmVersion(ormVersionString, project);
78+
log.lifecycle( "ORM version: {}", ormVersion );
79+
project.getExtensions().add( ORM_VERSION, ormVersion );
80+
81+
final var ormPluginVersion = determineOrmPluginVersion(ormVersion, project, libs);
82+
log.lifecycle( "ORM Gradle plugin version: {}", ormPluginVersion );
83+
project.getExtensions().add( ORM_PLUGIN_VERSION, ormPluginVersion );
84+
}
85+
86+
// --- Release / Development (with -P) --------------------------------------
87+
private ProjectVersion determineReleaseVersion(final Project project) {
88+
if ( project.hasProperty( RELEASE_VERSION ) ) {
89+
final var version = project.property( RELEASE_VERSION );
90+
if ( version != null ) {
91+
return new ProjectVersion((String) version);
92+
}
93+
}
94+
return null;
95+
}
96+
97+
private ProjectVersion determineDevelopmentVersion(final Project project) {
98+
if ( project.hasProperty( DEVELOPMENT_VERSION ) ) {
99+
final var version = project.property( DEVELOPMENT_VERSION );
100+
if ( version != null ) {
101+
return new ProjectVersion((String) version);
102+
}
103+
}
104+
return null;
105+
}
106+
107+
// --- Project version (ValueSource for configuration cache) ---------------
108+
109+
public static ProjectVersion determineProjectVersion(
110+
Project project,
111+
ProjectVersion releaseVersion,
112+
Provider<String> projectVersionString
113+
) {
114+
if ( releaseVersion != null ) {
115+
return releaseVersion;
116+
}
117+
// Si no hay release explícito, usamos el valor del archivo (vía ValueSource)
118+
final var fullName = projectVersionString.get();
119+
if ( fullName.isEmpty() ) {
120+
final var file = project.getRootProject().file(RELATIVE_FILE);
121+
throw new RuntimeException( "Property 'projectVersion' is missing in " + file.getAbsolutePath() );
122+
}
123+
return new ProjectVersion(fullName);
124+
}
125+
126+
// --- ORM version from -P or catalogs ------------------------------------
127+
128+
private String determineOrmVersion(final Project project, final VersionCatalog libs) {
129+
// -PhibernateOrmVersion have priority
130+
if ( project.hasProperty( ORM_VERSION ) ) {
131+
return (String) project.property( ORM_VERSION );
132+
}
133+
// Find in Version Catalog
134+
final var vc = libs.findVersion( ORM_VERSION );
135+
if ( vc.isPresent() ) {
136+
final var required = vc.get().getRequiredVersion();
137+
if ( !required.isEmpty() ) {
138+
return required;
139+
}
140+
}
141+
throw new IllegalStateException("Hibernate ORM version not specified on project");
142+
}
143+
144+
private Object resolveOrmVersion(final String stringForm, final Project project) {
145+
if ( project.hasProperty( SKIP_ORM_VERSION_PARSING ) &&
146+
Boolean.parseBoolean((String) project.property( SKIP_ORM_VERSION_PARSING ) )
147+
) {
148+
return stringForm;
149+
}
150+
return new ProjectVersion(stringForm);
151+
}
152+
153+
private Object determineOrmPluginVersion(final Object ormVersion, final Project project, final VersionCatalog libs) {
154+
// -PhibernateOrmGradlePluginVersion have priority
155+
if ( project.hasProperty( ORM_PLUGIN_VERSION ) ) {
156+
return project.property( ORM_PLUGIN_VERSION );
157+
}
158+
// Find in Version Catalog
159+
final var vc = libs.findVersion( ORM_PLUGIN_VERSION );
160+
if ( vc.isPresent() ) {
161+
final var required = vc.get().getRequiredVersion();
162+
if ( !required.isEmpty() ) {
163+
return required;
164+
}
165+
}
166+
throw new IllegalStateException("Hibernate ORM Gradle plugin version not specified on project");
167+
}
164168
}

0 commit comments

Comments
 (0)