From 4742798f5331fbf71ecc4b98328145e6c39e3e39 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Fri, 2 Feb 2018 01:40:36 +0100 Subject: [PATCH] Fixes different group id pom update and deployment skip for snapshot versions fixes gh-70 gh-67 --- .../release/internal/pom/PomUpdater.java | 49 +++++++++++++++- .../internal/pom/ProjectPomUpdater.java | 5 +- .../internal/PomUpdateAcceptanceTests.java | 19 +++++++ .../release/internal/pom/PomUpdaterTests.java | 56 ++++++++++++++++++- .../internal/project/ProjectBuilderTests.java | 1 - ...different_group_skip_deployment_plugin.xml | 51 +++++++++++++++++ ...nt_group_skip_deployment_plugin_mngmnt.xml | 53 ++++++++++++++++++ ...m_different_group_skip_deployment_prop.xml | 49 ++++++++++++++++ 8 files changed, 279 insertions(+), 4 deletions(-) create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/project/children/pom_different_group_skip_deployment_plugin.xml create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/project/children/pom_different_group_skip_deployment_plugin_mngmnt.xml create mode 100644 spring-cloud-release-tools-core/src/test/resources/projects/project/children/pom_different_group_skip_deployment_prop.xml diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/PomUpdater.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/PomUpdater.java index a76f7dd7..3d93fafe 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/PomUpdater.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/PomUpdater.java @@ -21,11 +21,13 @@ import java.io.FileWriter; import java.lang.invoke.MethodHandles; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Properties; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import org.apache.maven.model.Model; +import org.apache.maven.model.Plugin; import org.apache.maven.plugin.logging.Log; import org.codehaus.mojo.versions.api.PomHelper; import org.codehaus.mojo.versions.change.AbstractVersionChanger; @@ -33,6 +35,7 @@ import org.codehaus.mojo.versions.change.VersionChange; import org.codehaus.mojo.versions.change.VersionChanger; import org.codehaus.mojo.versions.change.VersionChangerFactory; import org.codehaus.mojo.versions.rewriting.ModifiedPomXMLEventReader; +import org.codehaus.plexus.util.xml.Xpp3Dom; import org.codehaus.stax2.XMLInputFactory2; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -71,6 +74,49 @@ class PomUpdater { return true; } + boolean hasSkipDeployment(Model model) { + String property = model.getProperties() + .getProperty("maven.deploy.skip"); + boolean hasSkipDeploymentProperty = Boolean.parseBoolean(property); + if (hasSkipDeploymentProperty) { + return true; + } + if (model.getBuild() == null) { + return false; + } + boolean plugins = model.getBuild() + .getPlugins() + .stream() + .filter(plugin -> "maven-deploy-plugin".equalsIgnoreCase(plugin.getArtifactId())) + .map(this::skipFromConfiguration) + .findFirst() + .orElse(false); + if (plugins) { + return true; + } + if (model.getBuild() + .getPluginManagement() == null) { + return false; + } + return model.getBuild() + .getPluginManagement() + .getPlugins() + .stream() + .filter(plugin -> "maven-deploy-plugin".equalsIgnoreCase(plugin.getArtifactId())) + .map(this::skipFromConfiguration) + .findFirst() + .orElse(false); + } + + private Boolean skipFromConfiguration(Plugin plugin) { + if (!(plugin.getConfiguration() instanceof Xpp3Dom)) { + return false; + } + Xpp3Dom configuration = (Xpp3Dom) plugin.getConfiguration(); + Xpp3Dom skip = configuration.getChild("skip"); + return skip != null && Boolean.parseBoolean(skip.getValue()); + } + private File rootPom(File rootFolder) { if (rootFolder.getName().endsWith(".xml")) { return rootFolder; @@ -130,7 +176,8 @@ class PomUpdater { log.debug("Can't set the value for parent... Will return {}", sourceChanges); return changes; } - if (model.getGroupId() != null && !model.getGroupId().equals(rootProjectGroupId)) { + boolean skipDeployment = hasSkipDeployment(model); + if (!skipDeployment && model.getGroupId() != null && !model.getGroupId().equals(rootProjectGroupId)) { log.info("Will not update the project's [{}] parent [{}] since its group id [{}] is not equal the parent group id [{}]", model.getArtifactId(), model.getParent().getArtifactId(), model.getGroupId(), rootProjectGroupId); return changes; diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/ProjectPomUpdater.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/ProjectPomUpdater.java index 9d10a5fc..e0b53281 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/ProjectPomUpdater.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/ProjectPomUpdater.java @@ -23,8 +23,11 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; +import java.util.Map; import java.util.Scanner; +import org.apache.maven.model.Model; +import org.codehaus.plexus.util.xml.Xpp3Dom; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.release.internal.ReleaserProperties; @@ -128,7 +131,7 @@ public class ProjectPomUpdater { } ModelWrapper model = this.pomUpdater.updateModel(this.rootPom, file, this.versions); this.pomUpdater.overwritePomIfDirty(model, this.versions, file); - if (this.assertSnapshots && !this.snapshotVersion) { + if (this.assertSnapshots && !this.snapshotVersion && !this.pomUpdater.hasSkipDeployment(model.model)) { log.debug("Update is a non-snapshot one. Checking if no snapshot versions remained in the pom"); Scanner scanner = new Scanner(asString(path)); int lineNumber = 0; diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/PomUpdateAcceptanceTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/PomUpdateAcceptanceTests.java index 120e3a3b..ed58b530 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/PomUpdateAcceptanceTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/PomUpdateAcceptanceTests.java @@ -68,6 +68,25 @@ public class PomUpdateAcceptanceTests { @Test public void should_update_fail_when_after_updating_a_release_version_there_still_is_a_snapshot_version() throws Exception { + ReleaserProperties releaserProperties = branchReleaserProperties(); + ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties); + Projects projects = projectPomUpdater.retrieveVersionsFromSCRelease(); + projects.add(new ProjectVersion("spring-cloud-sleuth-samples", "0.0.5.RELEASE")); + File project = new File(this.temporaryFolder, "/spring-cloud-sleuth-with-unmatched-property/spring-cloud-sleuth-samples"); + addBuildSnapshotToChildPom(project); + + projectPomUpdater + .updateProjectFromSCRelease(project, projects, projects.forFile(project), true); + } + + private void addBuildSnapshotToChildPom(File project) throws IOException { + File childPom = new File(project, "pom.xml"); + String text = new String(Files.readAllBytes(childPom.toPath())); + Files.write(childPom.toPath(), text.replaceAll("1.19.2", "1.19.2.BUILD-SNAPSHOT").getBytes()); + } + + @Test + public void should_not_fail_update_when_after_updating_a_release_version_there_still_is_a_snapshot_version_in_a_non_deployable_module() throws Exception { ReleaserProperties releaserProperties = branchReleaserProperties(); ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties); Projects projects = projectPomUpdater.retrieveVersionsFromSCRelease(); diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/PomUpdaterTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/PomUpdaterTests.java index 875717c3..e7696e69 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/PomUpdaterTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/PomUpdaterTests.java @@ -173,7 +173,7 @@ public class PomUpdaterTests { } @Test - public void should_only_update_the_props_when_group_ids_dont_match() throws Exception { + public void should_only_update_the_properties_section_when_group_ids_dont_match_and_there_is_no_skip_deployment() throws Exception { File originalPom = pom("/projects/project/children", "pom_different_group.xml"); File pomInTemp = tmpFile("/project/children/pom_different_group.xml"); ModelWrapper rootPom = model("spring-cloud-sleuth", "org.springframework.cloud"); @@ -190,6 +190,60 @@ public class PomUpdaterTests { .containsEntry("spring-cloud-sleuth.version", "0.0.3.BUILD-SNAPSHOT"); } + @Test + public void should_update_everything_when_group_ids_dont_match_and_there_is_skip_deployment_property() throws Exception { + File originalPom = pom("/projects/project/children", "pom_different_group_skip_deployment_prop.xml"); + File pomInTemp = tmpFile("/project/children/pom_different_group_skip_deployment_prop.xml"); + ModelWrapper rootPom = model("spring-cloud-sleuth", "org.springframework.cloud"); + ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, this.versions); + + File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versions, pomInTemp); + + BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom)); + Model overriddenPomModel = this.pomReader.readPom(storedPom); + BDDAssertions.then(overriddenPomModel.getVersion()).isEqualTo("1.2.2.BUILD-SNAPSHOT"); + BDDAssertions.then(overriddenPomModel.getParent().getVersion()).isEqualTo("0.0.1"); + // the rest is the same + BDDAssertions.then(overriddenPomModel.getProperties()) + .containsEntry("spring-cloud-sleuth.version", "0.0.3.BUILD-SNAPSHOT"); + } + + @Test + public void should_update_everything_when_group_ids_dont_match_and_there_is_skip_in_deployment_plugin() throws Exception { + File originalPom = pom("/projects/project/children", "pom_different_group_skip_deployment_plugin.xml"); + File pomInTemp = tmpFile("/project/children/pom_different_group_skip_deployment_plugin.xml"); + ModelWrapper rootPom = model("spring-cloud-sleuth", "org.springframework.cloud"); + ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, this.versions); + + File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versions, pomInTemp); + + BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom)); + Model overriddenPomModel = this.pomReader.readPom(storedPom); + BDDAssertions.then(overriddenPomModel.getVersion()).isEqualTo("1.2.2.BUILD-SNAPSHOT"); + BDDAssertions.then(overriddenPomModel.getParent().getVersion()).isEqualTo("0.0.1"); + // the rest is the same + BDDAssertions.then(overriddenPomModel.getProperties()) + .containsEntry("spring-cloud-sleuth.version", "0.0.3.BUILD-SNAPSHOT"); + } + + @Test + public void should_update_everything_when_group_ids_dont_match_and_there_is_skip_in_deployment_plugin_management() throws Exception { + File originalPom = pom("/projects/project/children", "pom_different_group_skip_deployment_plugin_mngmnt.xml"); + File pomInTemp = tmpFile("/project/children/pom_different_group_skip_deployment_plugin_mngmnt.xml"); + ModelWrapper rootPom = model("spring-cloud-sleuth", "org.springframework.cloud"); + ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, this.versions); + + File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versions, pomInTemp); + + BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom)); + Model overriddenPomModel = this.pomReader.readPom(storedPom); + BDDAssertions.then(overriddenPomModel.getVersion()).isEqualTo("1.2.2.BUILD-SNAPSHOT"); + BDDAssertions.then(overriddenPomModel.getParent().getVersion()).isEqualTo("0.0.1"); + // the rest is the same + BDDAssertions.then(overriddenPomModel.getProperties()) + .containsEntry("spring-cloud-sleuth.version", "0.0.3.BUILD-SNAPSHOT"); + } + @Test public void should_not_update_the_project_if_group_doesnt_match() throws Exception { File originalPom = pom("/projects/project/children", "pom_case_from_contract.xml"); diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/project/ProjectBuilderTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/project/ProjectBuilderTests.java index 96900e8e..27eeb2c8 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/project/ProjectBuilderTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/project/ProjectBuilderTests.java @@ -27,7 +27,6 @@ import org.springframework.util.FileSystemUtils; */ public class ProjectBuilderTests { - TestPomReader reader = new TestPomReader(); @Rule public TemporaryFolder tmp = new TemporaryFolder(); File temporaryFolder; @Rule public OutputCapture outputCapture = new OutputCapture(); diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/project/children/pom_different_group_skip_deployment_plugin.xml b/spring-cloud-release-tools-core/src/test/resources/projects/project/children/pom_different_group_skip_deployment_plugin.xml new file mode 100644 index 00000000..61652b99 --- /dev/null +++ b/spring-cloud-release-tools-core/src/test/resources/projects/project/children/pom_different_group_skip_deployment_plugin.xml @@ -0,0 +1,51 @@ + + + + + 4.0.0 + + com.example + http-server-dsl + 1.2.2.BUILD-SNAPSHOT + + Spring Cloud Contract Verifier Http Server Sample + Spring Cloud Contract Verifier Http Server Sample + + + org.springframework.boot + spring-boot-starter-parent + 1.5.8.RELEASE + + + + + 1.3.1.BUILD-SNAPSHOT + + + + + + maven-deploy-plugin + + true + + + + + diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/project/children/pom_different_group_skip_deployment_plugin_mngmnt.xml b/spring-cloud-release-tools-core/src/test/resources/projects/project/children/pom_different_group_skip_deployment_plugin_mngmnt.xml new file mode 100644 index 00000000..d70d7ce8 --- /dev/null +++ b/spring-cloud-release-tools-core/src/test/resources/projects/project/children/pom_different_group_skip_deployment_plugin_mngmnt.xml @@ -0,0 +1,53 @@ + + + + + 4.0.0 + + com.example + http-server-dsl + 1.2.2.BUILD-SNAPSHOT + + Spring Cloud Contract Verifier Http Server Sample + Spring Cloud Contract Verifier Http Server Sample + + + org.springframework.boot + spring-boot-starter-parent + 1.5.8.RELEASE + + + + + 1.3.1.BUILD-SNAPSHOT + + + + + + + maven-deploy-plugin + + true + + + + + + diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/project/children/pom_different_group_skip_deployment_prop.xml b/spring-cloud-release-tools-core/src/test/resources/projects/project/children/pom_different_group_skip_deployment_prop.xml new file mode 100644 index 00000000..a2904f27 --- /dev/null +++ b/spring-cloud-release-tools-core/src/test/resources/projects/project/children/pom_different_group_skip_deployment_prop.xml @@ -0,0 +1,49 @@ + + + + + 4.0.0 + + com.example + http-server-dsl + 1.2.2.BUILD-SNAPSHOT + + Spring Cloud Contract Verifier Http Server Sample + Spring Cloud Contract Verifier Http Server Sample + + + org.springframework.boot + spring-boot-starter-parent + 1.5.8.RELEASE + + + + + 1.3.1.BUILD-SNAPSHOT + true + + + + + + maven-deploy-plugin + + + +