From 32657328189752b634d6d9557ec2739c716a6bbb Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Fri, 10 Mar 2017 12:16:24 +0100 Subject: [PATCH] Fixed version bump --- .../cloud/release/internal/Releaser.java | 2 +- .../release/internal/ReleaserProperties.java | 13 ---- .../internal/pom/ProjectPomUpdater.java | 23 ++++++- .../release/internal/project/Project.java | 21 +++---- .../release/internal/AcceptanceTests.java | 60 ++++++++++++------- .../internal/PomUpdateAcceptanceTests.java | 4 +- ...Tests.java => ProjectPomUpdaterTests.java} | 17 +++++- .../internal/project/ProjectTests.java | 35 ++++------- .../spring-cloud-contract-tools/pom.xml | 2 +- .../spring-cloud-contract-converters/pom.xml | 2 +- .../release/spring/ReleaserConfiguration.java | 5 +- 11 files changed, 103 insertions(+), 81 deletions(-) rename spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/{PomUpdaterTests.java => ProjectPomUpdaterTests.java} (94%) diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/Releaser.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/Releaser.java index d2495a91..f1ce1165 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/Releaser.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/Releaser.java @@ -41,7 +41,7 @@ public class Releaser { ProjectVersion originalVersion = new ProjectVersion(project); ProjectVersion changedVersion = new ProjectVersion(project); if (!skipPoms) { - this.projectPomUpdater.updateProject(project); + this.projectPomUpdater.updateProjectFromSCRelease(project); changedVersion = new ProjectVersion(project); log.info("\n\nProject was successfully updated to [{}]", originalVersion); } diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/ReleaserProperties.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/ReleaserProperties.java index de0b6638..524057c4 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/ReleaserProperties.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/ReleaserProperties.java @@ -129,11 +129,6 @@ public class ReleaserProperties { */ private String deployCommand = "./mvnw deploy -DskipTests -Pfast"; - /** - * Command to be executed to bump versions. The new version will be passed under %s param - */ - private String bumpVersionsCommand = "./mvnw versions:set -DgenerateBackupPoms=false -DnewVersion=%s"; - /** * Command to be executed to deploy a built project. If present "{{version}}" will be replaced by the * provided version @@ -180,14 +175,6 @@ public class ReleaserProperties { public void setPublishDocsCommands(String[] publishDocsCommands) { this.publishDocsCommands = publishDocsCommands; } - - public String getBumpVersionsCommand() { - return this.bumpVersionsCommand; - } - - public void setBumpVersionsCommand(String bumpVersionsCommand) { - this.bumpVersionsCommand = bumpVersionsCommand; - } } public String getWorkingDir() { 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 5234838e..ffdc06d8 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,6 +23,8 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; +import java.util.HashSet; +import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -51,7 +53,7 @@ public class ProjectPomUpdater { * * @param projectRoot - root folder with project to update */ - public void updateProject(File projectRoot) { + public void updateProjectFromSCRelease(File projectRoot) { File clonedScRelease = this.gitRepo.cloneScReleaseProject(); this.gitRepo.checkout(clonedScRelease, this.properties.getPom().getBranch()); SCReleasePomParser sCReleasePomParser = new SCReleasePomParser(clonedScRelease); @@ -61,10 +63,27 @@ public class ProjectPomUpdater { log.info("Skipping project updating"); return; } + updatePoms(projectRoot, versions); + } + + private void updatePoms(File projectRoot, Versions versions) { File rootPom = new File(projectRoot, "pom.xml"); ModelWrapper rootPomModel = this.pomUpdater.readModel(rootPom); processAllPoms(projectRoot, new PomWalker(rootPomModel, versions, this.pomUpdater, - properties)); + this.properties)); + } + + public void updatePomsForRootVersion(File directory, String version) { + File pom = new File(directory, "pom.xml"); + Versions versions = versions(version, pom); + updatePoms(directory, versions); + } + + private Versions versions(String version, File pom) { + ModelWrapper model = this.pomUpdater.readModel(pom); + Set projects = new HashSet<>(); + projects.add(new Project(model.projectName(), version)); + return new Versions("", "", projects); } private void processAllPoms(File projectRoot, PomWalker pomWalker) { diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/Project.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/Project.java index 10b6971d..aec1d16e 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/Project.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/Project.java @@ -13,6 +13,7 @@ import java.util.concurrent.TimeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.release.internal.ReleaserProperties; +import org.springframework.cloud.release.internal.pom.ProjectPomUpdater; /** * @author Marcin Grzejszczak @@ -24,15 +25,18 @@ public class Project { private final ReleaserProperties properties; private final ProcessExecutor executor; + private final ProjectPomUpdater pomUpdater; - public Project(ReleaserProperties properties) { + public Project(ReleaserProperties properties, ProjectPomUpdater pomUpdater) { this.properties = properties; this.executor = new ProcessExecutor(properties); + this.pomUpdater = pomUpdater; } Project(ReleaserProperties properties, ProcessExecutor executor) { this.properties = properties; this.executor = executor; + this.pomUpdater = new ProjectPomUpdater(properties); } public void build() { @@ -85,18 +89,9 @@ public class Project { } public void bumpVersions(String version) { - try { - log.info("Bumping versions to [{}]", version); - String[] commands = String.format(bumpVersionsCommand(), version).split(" "); - runCommand(commands); - log.info("Versions successfully bumped"); - } catch (Exception e) { - throw new IllegalStateException(e); - } - } - - String bumpVersionsCommand() { - return this.properties.getMaven().getBumpVersionsCommand(); + String workingDir = this.properties.getWorkingDir(); + File dir = new File(workingDir); + this.pomUpdater.updatePomsForRootVersion(dir, version); } } diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/AcceptanceTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/AcceptanceTests.java index 574f47a3..cf4621f7 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/AcceptanceTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/AcceptanceTests.java @@ -1,11 +1,11 @@ package org.springframework.cloud.release.internal; import java.io.File; -import java.io.IOException; import java.net.URISyntaxException; -import java.nio.file.Files; import java.util.Iterator; +import org.apache.maven.model.Model; +import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.revwalk.RevCommit; import org.junit.Before; import org.junit.Rule; @@ -45,24 +45,49 @@ public class AcceptanceTests { @Test public void should_perform_a_release_of_consul() throws Exception { File origin = clonedProject(this.tmp.newFolder(), this.springCloudConsulProject); + pomVersionIsEqualTo(origin, "1.2.0.BUILD-SNAPSHOT"); + pomParentVersionIsEqualTo(origin, "1.2.0.BUILD-SNAPSHOT"); File project = clonedProject(this.tmp.newFolder(), tmpFile("spring-cloud-consul")); setOriginOnProjectToTmp(origin, project); Releaser releaser = releaser(project); releaser.release(); - then(this.temporaryFolder).exists(); - File afterProcessing = new File(project, "bumped"); - then(afterProcessing).exists(); - Iterable commits = openGitProject(project).log().call(); + Iterable commits = listOfCommits(project); Iterator iterator = commits.iterator(); - RevCommit afterRelease = iterator.next(); - RevCommit goingBackToSnapshots = iterator.next(); - RevCommit bumping = iterator.next(); + tagIsPresentInOrigin(origin); + commitIsPresent(iterator, "Bumping versions after release"); + commitIsPresent(iterator, "Going back to snapshots"); + commitIsPresent(iterator, "Bumping versions before release"); + pomVersionIsEqualTo(project, "1.2.1.BUILD-SNAPSHOT"); + pomParentVersionIsEqualTo(project, "1.2.1.BUILD-SNAPSHOT"); + } + + private Iterable listOfCommits(File project) throws GitAPIException { + return openGitProject(project).log().call(); + } + + private void pomParentVersionIsEqualTo(File project, String expected) { + then(pom(new File(project, "spring-cloud-starter-consul")).getParent() + .getVersion()).isEqualTo(expected); + } + + private void pomVersionIsEqualTo(File project, String expected) { + then(pom(project).getVersion()).isEqualTo(expected); + } + + private void commitIsPresent(Iterator iterator, + String expected) { + RevCommit commit = iterator.next(); + then(commit.getShortMessage()).isEqualTo(expected); + } + + private void tagIsPresentInOrigin(File origin) throws GitAPIException { then(openGitProject(origin).tagList().call().iterator().next().getName()).endsWith("v1.1.2.RELEASE"); - then(afterRelease.getShortMessage()).isEqualTo("Bumping versions after release"); - then(goingBackToSnapshots.getShortMessage()).isEqualTo("Going back to snapshots"); - then(bumping.getShortMessage()).isEqualTo("Bumping versions before release"); + } + + private Model pom(File dir) { + return this.testPomReader.readPom(new File(dir, "pom.xml")); } private ReleaserProperties releaserProperties(File project) throws URISyntaxException { @@ -73,14 +98,13 @@ public class AcceptanceTests { releaserProperties.getMaven().setBuildCommand("touch build"); releaserProperties.getMaven().setDeployCommand("touch deploy"); releaserProperties.getMaven().setPublishDocsCommands(new String[] { "touch docs"} ); - releaserProperties.getMaven().setBumpVersionsCommand("touch bumped"); return releaserProperties; } private Releaser releaser(File projectFile) throws Exception { ReleaserProperties properties = releaserProperties(projectFile); ProjectPomUpdater pomUpdater = new ProjectPomUpdater(properties); - Project project = new Project(properties); + Project project = new Project(properties, pomUpdater); ProjectGitUpdater gitUpdater = new ProjectGitUpdater(properties); return new Releaser(properties, pomUpdater, project, gitUpdater) { @Override boolean skipStep() { @@ -96,12 +120,4 @@ public class AcceptanceTests { private File file(String relativePath) throws URISyntaxException { return new File(AcceptanceTests.class.getResource(relativePath).toURI()); } - - private File pom(String relativePath) throws URISyntaxException { - return new File(new File(AcceptanceTests.class.getResource(relativePath).toURI()), "pom.xml"); - } - - private String asString(File file) throws IOException { - return new String(Files.readAllBytes(file.toPath())); - } } 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 32a22d65..0e76aa49 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 @@ -39,7 +39,7 @@ public class PomUpdateAcceptanceTests { ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties); projectPomUpdater - .updateProject(new File(this.temporaryFolder, "/spring-cloud-sleuth")); + .updateProjectFromSCRelease(new File(this.temporaryFolder, "/spring-cloud-sleuth")); then(this.temporaryFolder).exists(); Model rootPom = this.testPomReader.readPom(tmpFile("/spring-cloud-sleuth/pom.xml")); @@ -64,7 +64,7 @@ public class PomUpdateAcceptanceTests { ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties); File beforeProcessing = pom("/projects/project/"); - projectPomUpdater.updateProject(tmpFile("/project/")); + projectPomUpdater.updateProjectFromSCRelease(tmpFile("/project/")); then(this.temporaryFolder).exists(); File afterProcessing = tmpFile("/project/pom.xml"); 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/ProjectPomUpdaterTests.java similarity index 94% rename from spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/PomUpdaterTests.java rename to spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/ProjectPomUpdaterTests.java index c79a5885..ebe6de69 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/ProjectPomUpdaterTests.java @@ -36,7 +36,7 @@ import org.springframework.util.FileSystemUtils; /** * @author Marcin Grzejszczak */ -public class PomUpdaterTests { +public class ProjectPomUpdaterTests { Versions versions = new Versions("0.0.1", "0.0.2", projects()); PomUpdater pomUpdater = new PomUpdater(); @@ -263,6 +263,21 @@ public class PomUpdaterTests { .contains("Won't update the version of module"); } + @Test + public void should_return_a_change_version() throws Exception { + File originalPom = pom("/projects/project/", "pom_matching_artifact_same_version.xml"); + File pomInTemp = tmpFile("/project/pom_matching_artifact_same_version.xml"); + ModelWrapper rootPom = model("spring-cloud-sleuth"); + ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, this.versions); + + File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versions, pomInTemp); + + BDDAssertions.then(asString(storedPom)).isEqualTo(asString(originalPom)); + BDDAssertions.then(this.capture.toString()) + .contains("Won't update the version of parent") + .contains("Won't update the version of module"); + } + Set projects() { Set projects = new HashSet<>(); projects.add(new Project("spring-cloud-contract", "0.0.2.BUILD-SNAPSHOT")); diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/project/ProjectTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/project/ProjectTests.java index a6ee1c92..ef9cf4c0 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/project/ProjectTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/project/ProjectTests.java @@ -9,6 +9,7 @@ import org.junit.Assume; import org.junit.Before; import org.junit.Test; import org.springframework.cloud.release.internal.ReleaserProperties; +import org.springframework.cloud.release.internal.pom.TestPomReader; import static org.assertj.core.api.BDDAssertions.then; import static org.assertj.core.api.BDDAssertions.thenThrownBy; @@ -18,6 +19,8 @@ import static org.assertj.core.api.BDDAssertions.thenThrownBy; */ public class ProjectTests { + TestPomReader reader = new TestPomReader(); + @Before public void checkOs() { Assume.assumeFalse(System.getProperty("os.name").toLowerCase().startsWith("win")); @@ -124,31 +127,17 @@ public class ProjectTests { @Test public void should_successfully_execute_a_bump_versions_command() throws Exception { ReleaserProperties properties = new ReleaserProperties(); - properties.setWorkingDir(file("/projects/builder/resolved").getPath()); - Project builder = new Project(properties, executor(properties)) { - @Override String bumpVersionsCommand() { - return "%s"; - } - }; + properties.setWorkingDir(file("/projects/spring-cloud-contract").getPath()); + Project builder = new Project(properties, executor(properties)); - builder.bumpVersions("ls -al"); + builder.bumpVersions("2.3.4.BUILD-SNAPSHOT"); - then(asString(file("/projects/builder/resolved/resolved.log"))) - .contains("file.txt"); - } - - @Test - public void should_throw_exception_when_bump_command_took_too_long_to_execute() throws Exception { - ReleaserProperties properties = new ReleaserProperties(); - properties.getMaven().setWaitTimeInMinutes(0); - properties.setWorkingDir(file("/projects/builder/unresolved").getPath()); - Project builder = new Project(properties, executor(properties)) { - @Override String bumpVersionsCommand() { - return "echo '%s'"; - } - }; - - thenThrownBy(() -> builder.bumpVersions("1.0.0")).hasMessageContaining("Process waiting time of [0] minutes exceeded"); + File rootPom = file("/projects/spring-cloud-contract/pom.xml"); + File tools = file("/projects/spring-cloud-contract/spring-cloud-contract-tools/pom.xml"); + File converters = file("/projects/spring-cloud-contract/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml"); + then(this.reader.readPom(rootPom).getVersion()).isEqualTo("2.3.4.BUILD-SNAPSHOT"); + then(this.reader.readPom(tools).getParent().getVersion()).isEqualTo("2.3.4.BUILD-SNAPSHOT"); + then(this.reader.readPom(converters).getParent().getVersion()).isEqualTo("2.3.4.BUILD-SNAPSHOT"); } private TestProcessExecutor executor(ReleaserProperties properties) { diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-contract/spring-cloud-contract-tools/pom.xml b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-contract/spring-cloud-contract-tools/pom.xml index 67ce9f8f..dfe7b507 100644 --- a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-contract/spring-cloud-contract-tools/pom.xml +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-contract/spring-cloud-contract-tools/pom.xml @@ -7,7 +7,7 @@ org.springframework.cloud spring-cloud-contract-parent - + 1.1.0.BUILD-SNAPSHOT .. diff --git a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-contract/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-contract/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml index 7873089a..cb274e94 100644 --- a/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-contract/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml +++ b/spring-cloud-release-tools-core/src/test/resources/projects/spring-cloud-contract/spring-cloud-contract-tools/spring-cloud-contract-converters/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-contract-tools - + 1.1.0.BUILD-SNAPSHOT .. spring-cloud-contract-converters diff --git a/spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/spring/ReleaserConfiguration.java b/spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/spring/ReleaserConfiguration.java index 064797f7..6f05e9a0 100644 --- a/spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/spring/ReleaserConfiguration.java +++ b/spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/spring/ReleaserConfiguration.java @@ -29,7 +29,8 @@ import org.springframework.context.annotation.Configuration; class ReleaserConfiguration { @Bean Releaser releaser(ReleaserProperties properties) { - return new Releaser(properties, new ProjectPomUpdater(properties), - new Project(properties), new ProjectGitUpdater(properties)); + ProjectPomUpdater pomUpdater = new ProjectPomUpdater(properties); + return new Releaser(properties, pomUpdater, + new Project(properties, pomUpdater), new ProjectGitUpdater(properties)); } }