From 1d473233f21b63f351ded6904f4f9f98db3faaf1 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Tue, 1 Feb 2022 14:26:54 +0100 Subject: [PATCH] [MNG-6727] Using version range in parent and CI Friendly Version fails --- .../DefaultMavenProjectBuilderTest.java | 136 +++++++++++++++++- .../pom.xml | 12 ++ .../pom.xml | 4 +- .../pom.xml | 12 ++ .../pom.xml | 12 ++ .../pom.xml | 14 ++ .../child/pom.xml | 12 ++ .../pom.xml | 0 .../child/pom.xml | 4 +- .../pom.xml | 7 + .../child/pom.xml | 14 ++ .../pom.xml | 7 + .../model/building/DefaultModelBuilder.java | 20 ++- 13 files changed, 242 insertions(+), 12 deletions(-) create mode 100644 maven-core/src/test/resources/projects/parent-version-range-external-child-pom-parent-version-expression/pom.xml rename maven-core/src/test/resources/projects/{parent-version-range-external-child-version-expression => parent-version-range-external-child-pom-version-expression}/pom.xml (69%) create mode 100644 maven-core/src/test/resources/projects/parent-version-range-external-child-project-parent-version-expression/pom.xml create mode 100644 maven-core/src/test/resources/projects/parent-version-range-external-child-project-version-expression/pom.xml create mode 100644 maven-core/src/test/resources/projects/parent-version-range-external-child-revision-expression/pom.xml create mode 100644 maven-core/src/test/resources/projects/parent-version-range-local-child-project-parent-version-expression/child/pom.xml rename maven-core/src/test/resources/projects/{parent-version-range-local-child-version-expression => parent-version-range-local-child-project-parent-version-expression}/pom.xml (100%) rename maven-core/src/test/resources/projects/{parent-version-range-local-child-version-expression => parent-version-range-local-child-project-version-expression}/child/pom.xml (70%) create mode 100644 maven-core/src/test/resources/projects/parent-version-range-local-child-project-version-expression/pom.xml create mode 100644 maven-core/src/test/resources/projects/parent-version-range-local-child-revision-expression/child/pom.xml create mode 100644 maven-core/src/test/resources/projects/parent-version-range-local-child-revision-expression/pom.xml diff --git a/maven-core/src/test/java/org/apache/maven/project/DefaultMavenProjectBuilderTest.java b/maven-core/src/test/java/org/apache/maven/project/DefaultMavenProjectBuilderTest.java index 727f28de33..a2ca9998e7 100644 --- a/maven-core/src/test/java/org/apache/maven/project/DefaultMavenProjectBuilderTest.java +++ b/maven-core/src/test/java/org/apache/maven/project/DefaultMavenProjectBuilderTest.java @@ -28,6 +28,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.fail; import java.io.File; import java.io.InputStream; @@ -249,11 +250,11 @@ public void testBuildParentVersionRangeLocallyWithoutChildVersion() throws Excep * @throws Exception in case of issue */ @Test - public void testBuildParentVersionRangeLocallyWithChildVersionExpression() throws Exception + public void testBuildParentVersionRangeLocallyWithChildProjectVersionExpression() throws Exception { File f1 = getTestFile( - "src/test/resources/projects/parent-version-range-local-child-version-expression/child/pom.xml" ); + "src/test/resources/projects/parent-version-range-local-child-project-version-expression/child/pom.xml" ); ProjectBuildingException e = assertThrows( ProjectBuildingException.class, @@ -261,7 +262,47 @@ public void testBuildParentVersionRangeLocallyWithChildVersionExpression() throw "Expected 'ProjectBuildingException' not thrown." ); assertThat( e.getMessage(), containsString( "Version must be a constant" ) ); } + + /** + * Tests whether local version range parent references are build correctly. + * + * @throws Exception + */ + public void testBuildParentVersionRangeLocallyWithChildProjectParentVersionExpression() throws Exception + { + File f1 = + getTestFile( + "src/test/resources/projects/parent-version-range-local-child-project-parent-version-expression/child/pom.xml" ); + try + { + getProject( f1 ); + fail( "Expected 'ProjectBuildingException' not thrown." ); + } + catch ( final ProjectBuildingException e ) + { + assertNotNull( e.getMessage() ); + assertThat( e.getMessage(), containsString( "Version must be a constant" ) ); + } + } + + /** + * Tests whether local version range parent references are build correctly. + * + * @throws Exception + */ + public void testBuildParentVersionRangeLocallyWithChildRevisionExpression() throws Exception + { + File f1 = + getTestFile( + "src/test/resources/projects/parent-version-range-local-child-revision-expression/child/pom.xml" ); + + MavenProject mp = this.getProjectFromRemoteRepository( f1 ); + + assertEquals("1.0-SNAPSHOT", mp.getVersion()); + + } + /** * Tests whether external version range parent references are build correctly. * @@ -307,11 +348,11 @@ public void testBuildParentVersionRangeExternallyWithoutChildVersion() throws Ex * @throws Exception in case of issue */ @Test - public void testBuildParentVersionRangeExternallyWithChildVersionExpression() throws Exception + public void testBuildParentVersionRangeExternallyWithChildProjectVersionExpression() throws Exception { File f1 = getTestFile( - "src/test/resources/projects/parent-version-range-external-child-version-expression/pom.xml" ); + "src/test/resources/projects/parent-version-range-external-child-project-version-expression/pom.xml" ); ProjectBuildingException e = assertThrows( ProjectBuildingException.class, @@ -350,4 +391,91 @@ public void rereadPom_mng7063() throws Exception assertThat( project.getName(), is( "PROJECT NAME" ) ); } + /** + * Tests whether external version range parent references are build correctly. + * + * @throws Exception + */ + public void testBuildParentVersionRangeExternallyWithChildPomVersionExpression() throws Exception + { + File f1 = + getTestFile( + "src/test/resources/projects/parent-version-range-external-child-pom-version-expression/pom.xml" ); + + try + { + this.getProjectFromRemoteRepository( f1 ); + fail( "Expected 'ProjectBuildingException' not thrown." ); + } + catch ( final ProjectBuildingException e ) + { + assertNotNull( e.getMessage() ); + assertThat( e.getMessage(), containsString( "Version must be a constant" ) ); + } + } + + /** + * Tests whether external version range parent references are build correctly. + * + * @throws Exception + */ + public void testBuildParentVersionRangeExternallyWithChildPomParentVersionExpression() throws Exception + { + File f1 = + getTestFile( + "src/test/resources/projects/parent-version-range-external-child-pom-parent-version-expression/pom.xml" ); + + try + { + this.getProjectFromRemoteRepository( f1 ); + fail( "Expected 'ProjectBuildingException' not thrown." ); + } + catch ( final ProjectBuildingException e ) + { + assertNotNull( e.getMessage() ); + assertThat( e.getMessage(), containsString( "Version must be a constant" ) ); + } + } + + /** + * Tests whether external version range parent references are build correctly. + * + * @throws Exception + */ + public void testBuildParentVersionRangeExternallyWithChildProjectParentVersionExpression() throws Exception + { + File f1 = + getTestFile( + "src/test/resources/projects/parent-version-range-external-child-project-parent-version-expression/pom.xml" ); + + try + { + this.getProjectFromRemoteRepository( f1 ); + fail( "Expected 'ProjectBuildingException' not thrown." ); + } + catch ( final ProjectBuildingException e ) + { + assertNotNull( e.getMessage() ); + assertThat( e.getMessage(), containsString( "Version must be a constant" ) ); + } + } + + /** + * Tests whether external version range parent references are build correctly. + * + * @throws Exception + */ + public void testBuildParentVersionRangeExternallyWithChildRevisionExpression() throws Exception + { + File f1 = + getTestFile( + "src/test/resources/projects/parent-version-range-external-child-revision-expression/pom.xml" ); + + + MavenProject mp = this.getProjectFromRemoteRepository( f1 ); + + assertEquals("1.0-SNAPSHOT", mp.getVersion()); + + + } } diff --git a/maven-core/src/test/resources/projects/parent-version-range-external-child-pom-parent-version-expression/pom.xml b/maven-core/src/test/resources/projects/parent-version-range-external-child-pom-parent-version-expression/pom.xml new file mode 100644 index 0000000000..b37e54a9a9 --- /dev/null +++ b/maven-core/src/test/resources/projects/parent-version-range-external-child-pom-parent-version-expression/pom.xml @@ -0,0 +1,12 @@ + + 4.0.0 + + org.apache + apache + [1,1] + + child + + ${pom.parent.version} + pom + diff --git a/maven-core/src/test/resources/projects/parent-version-range-external-child-version-expression/pom.xml b/maven-core/src/test/resources/projects/parent-version-range-external-child-pom-version-expression/pom.xml similarity index 69% rename from maven-core/src/test/resources/projects/parent-version-range-external-child-version-expression/pom.xml rename to maven-core/src/test/resources/projects/parent-version-range-external-child-pom-version-expression/pom.xml index d07ad6eb56..bd30a9af8e 100644 --- a/maven-core/src/test/resources/projects/parent-version-range-external-child-version-expression/pom.xml +++ b/maven-core/src/test/resources/projects/parent-version-range-external-child-pom-version-expression/pom.xml @@ -6,7 +6,7 @@ [1,1] child - - ${some.property} + + ${project.version} pom diff --git a/maven-core/src/test/resources/projects/parent-version-range-external-child-project-parent-version-expression/pom.xml b/maven-core/src/test/resources/projects/parent-version-range-external-child-project-parent-version-expression/pom.xml new file mode 100644 index 0000000000..a8cf950fa2 --- /dev/null +++ b/maven-core/src/test/resources/projects/parent-version-range-external-child-project-parent-version-expression/pom.xml @@ -0,0 +1,12 @@ + + 4.0.0 + + org.apache + apache + [1,1] + + child + + ${project.parent.version} + pom + diff --git a/maven-core/src/test/resources/projects/parent-version-range-external-child-project-version-expression/pom.xml b/maven-core/src/test/resources/projects/parent-version-range-external-child-project-version-expression/pom.xml new file mode 100644 index 0000000000..bd30a9af8e --- /dev/null +++ b/maven-core/src/test/resources/projects/parent-version-range-external-child-project-version-expression/pom.xml @@ -0,0 +1,12 @@ + + 4.0.0 + + org.apache + apache + [1,1] + + child + + ${project.version} + pom + diff --git a/maven-core/src/test/resources/projects/parent-version-range-external-child-revision-expression/pom.xml b/maven-core/src/test/resources/projects/parent-version-range-external-child-revision-expression/pom.xml new file mode 100644 index 0000000000..aa724d854a --- /dev/null +++ b/maven-core/src/test/resources/projects/parent-version-range-external-child-revision-expression/pom.xml @@ -0,0 +1,14 @@ + + 4.0.0 + + org.apache + apache + [1,1] + + child + ${revision} + pom + + 1.0-SNAPSHOT + + diff --git a/maven-core/src/test/resources/projects/parent-version-range-local-child-project-parent-version-expression/child/pom.xml b/maven-core/src/test/resources/projects/parent-version-range-local-child-project-parent-version-expression/child/pom.xml new file mode 100644 index 0000000000..ac42c932b5 --- /dev/null +++ b/maven-core/src/test/resources/projects/parent-version-range-local-child-project-parent-version-expression/child/pom.xml @@ -0,0 +1,12 @@ + + 4.0.0 + + parent-version-range-local + parent + [1,10] + + child + + ${project.parent.version} + pom + diff --git a/maven-core/src/test/resources/projects/parent-version-range-local-child-version-expression/pom.xml b/maven-core/src/test/resources/projects/parent-version-range-local-child-project-parent-version-expression/pom.xml similarity index 100% rename from maven-core/src/test/resources/projects/parent-version-range-local-child-version-expression/pom.xml rename to maven-core/src/test/resources/projects/parent-version-range-local-child-project-parent-version-expression/pom.xml diff --git a/maven-core/src/test/resources/projects/parent-version-range-local-child-version-expression/child/pom.xml b/maven-core/src/test/resources/projects/parent-version-range-local-child-project-version-expression/child/pom.xml similarity index 70% rename from maven-core/src/test/resources/projects/parent-version-range-local-child-version-expression/child/pom.xml rename to maven-core/src/test/resources/projects/parent-version-range-local-child-project-version-expression/child/pom.xml index 066a11ecdb..1435070a8b 100644 --- a/maven-core/src/test/resources/projects/parent-version-range-local-child-version-expression/child/pom.xml +++ b/maven-core/src/test/resources/projects/parent-version-range-local-child-project-version-expression/child/pom.xml @@ -6,7 +6,7 @@ [1,10] child - - ${some.property} + + ${project.version} pom diff --git a/maven-core/src/test/resources/projects/parent-version-range-local-child-project-version-expression/pom.xml b/maven-core/src/test/resources/projects/parent-version-range-local-child-project-version-expression/pom.xml new file mode 100644 index 0000000000..858cf1c3f0 --- /dev/null +++ b/maven-core/src/test/resources/projects/parent-version-range-local-child-project-version-expression/pom.xml @@ -0,0 +1,7 @@ + + 4.0.0 + parent-version-range-local + parent + 1 + pom + diff --git a/maven-core/src/test/resources/projects/parent-version-range-local-child-revision-expression/child/pom.xml b/maven-core/src/test/resources/projects/parent-version-range-local-child-revision-expression/child/pom.xml new file mode 100644 index 0000000000..b29b5d23bf --- /dev/null +++ b/maven-core/src/test/resources/projects/parent-version-range-local-child-revision-expression/child/pom.xml @@ -0,0 +1,14 @@ + + 4.0.0 + + parent-version-range-local + parent + [1,10] + + child + ${revision} + pom + + 1.0-SNAPSHOT + + diff --git a/maven-core/src/test/resources/projects/parent-version-range-local-child-revision-expression/pom.xml b/maven-core/src/test/resources/projects/parent-version-range-local-child-revision-expression/pom.xml new file mode 100644 index 0000000000..858cf1c3f0 --- /dev/null +++ b/maven-core/src/test/resources/projects/parent-version-range-local-child-revision-expression/pom.xml @@ -0,0 +1,7 @@ + + 4.0.0 + parent-version-range-local + parent + 1 + pom + diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java index d09c705e12..de84b90de0 100644 --- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java +++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java @@ -1320,7 +1320,9 @@ private ModelData readParentLocally( Model childModel, Source childSource, Model } // Validate versions aren't inherited when using parent ranges the same way as when read externally. - if ( childModel.getVersion() == null ) + String rawChildModelVersion = childModel.getVersion(); + + if ( rawChildModelVersion == null ) { // Message below is checked for in the MNG-2199 core IT. problems.add( new ModelProblemCollectorRequest( Severity.FATAL, Version.V31 ) @@ -1329,7 +1331,7 @@ private ModelData readParentLocally( Model childModel, Source childSource, Model } else { - if ( childModel.getVersion().contains( "${" ) ) + if ( rawChildVersionReferencesParent( rawChildModelVersion ) ) { // Message below is checked for in the MNG-2199 core IT. problems.add( new ModelProblemCollectorRequest( Severity.FATAL, Version.V31 ) @@ -1360,6 +1362,14 @@ private ModelData readParentLocally( Model childModel, Source childSource, Model return new ModelData( candidateSource, candidateModel, groupId, artifactId, version ); } + private boolean rawChildVersionReferencesParent( String rawChildModelVersion ) + { + return rawChildModelVersion.equals( "${pom.version}" ) + || rawChildModelVersion.equals( "${project.version}" ) + || rawChildModelVersion.equals( "${pom.parent.version}" ) + || rawChildModelVersion.equals( "${project.parent.version}" ); + } + private ModelSource getParentPomFile( Model childModel, Source source ) { if ( !( source instanceof ModelSource2 ) ) @@ -1441,7 +1451,9 @@ private ModelData readParentExternally( Model childModel, ModelBuildingRequest r if ( !parent.getVersion().equals( version ) ) { - if ( childModel.getVersion() == null ) + String rawChildModelVersion = childModel.getVersion(); + + if ( rawChildModelVersion == null ) { // Message below is checked for in the MNG-2199 core IT. problems.add( new ModelProblemCollectorRequest( Severity.FATAL, Version.V31 ) @@ -1450,7 +1462,7 @@ private ModelData readParentExternally( Model childModel, ModelBuildingRequest r } else { - if ( childModel.getVersion().contains( "${" ) ) + if ( rawChildVersionReferencesParent( rawChildModelVersion ) ) { // Message below is checked for in the MNG-2199 core IT. problems.add( new ModelProblemCollectorRequest( Severity.FATAL, Version.V31 )