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 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)

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