From b0ea26366d32b111ed9e2bfd997bea636a114e48 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Tue, 24 Oct 2017 09:29:33 +0200 Subject: [PATCH] Allow bumping of gradle props; fixes #43 --- .../cloud/release/internal/Releaser.java | 9 +++-- .../internal/gradle/GradleUpdater.java | 25 +++++++++--- .../internal/pom/ProjectPomUpdater.java | 39 ++++++++----------- .../cloud/release/internal/pom/Projects.java | 10 +++-- .../internal/project/ProjectBuilder.java | 9 ----- .../cloud/release/internal/ReleaserTests.java | 30 ++++++++++---- .../internal/gradle/GradleUpdaterTests.java | 7 ++-- .../release/internal/pom/ProjectsTests.java | 17 ++++++-- .../internal/project/ProjectBuilderTests.java | 16 -------- .../cloud/release/internal/spring/Tasks.java | 2 +- 10 files changed, 90 insertions(+), 74 deletions(-) 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 f8b4d7b2..81f4437d 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 @@ -45,7 +45,7 @@ public class Releaser { public void updateProjectFromScRelease(File project, Projects versions, ProjectVersion versionFromScRelease) { this.projectPomUpdater.updateProjectFromSCRelease(project, versions, versionFromScRelease); - this.gradleUpdater.updateProjectFromSCRelease(project, versions); + this.gradleUpdater.updateProjectFromSCRelease(project, versions, versionFromScRelease); ProjectVersion changedVersion = new ProjectVersion(project); log.info("\n\nProject was successfully updated to [{}]", changedVersion); } @@ -70,7 +70,7 @@ public class Releaser { log.info("\nThe docs were published successfully"); } - public void rollbackReleaseVersion(File project, ProjectVersion scReleaseVersion) { + public void rollbackReleaseVersion(File project, Projects projects, ProjectVersion scReleaseVersion) { if (scReleaseVersion.isSnapshot()) { log.info("\nWon't rollback a snapshot version"); return; @@ -79,7 +79,10 @@ public class Releaser { ProjectVersion originalVersion = originalVersion(project); log.info("Original project version is [{}]", originalVersion); if ((scReleaseVersion.isRelease() || scReleaseVersion.isServiceRelease()) && originalVersion.isSnapshot()) { - this.projectBuilder.bumpVersions(originalVersion.bumpedVersion()); + Projects newProjects = new Projects(projects); + newProjects.remove(scReleaseVersion.projectName); + newProjects.add(new ProjectVersion(originalVersion.projectName, originalVersion.bumpedVersion())); + updateProjectFromScRelease(project, newProjects, originalVersion); this.projectGitHandler.commitAfterBumpingVersions(project, originalVersion); log.info("\nSuccessfully reverted the commit and bumped snapshot versions"); } else { diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/gradle/GradleUpdater.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/gradle/GradleUpdater.java index f42e0d93..0675afe1 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/gradle/GradleUpdater.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/gradle/GradleUpdater.java @@ -39,14 +39,17 @@ public class GradleUpdater { * the project name via {@link ReleaserProperties.Gradle#gradlePropsSubstitution} * @param projectRoot - root folder with project to update * @param projects - versions of projects used to update poms + * @param versionFromScRelease - version for the project from Spring Cloud Release */ - public void updateProjectFromSCRelease(File projectRoot, Projects projects) { - processAllGradleProps(projectRoot, projects); + public void updateProjectFromSCRelease(File projectRoot, Projects projects, + ProjectVersion versionFromScRelease) { + processAllGradleProps(projectRoot, projects, versionFromScRelease); } - private void processAllGradleProps(File projectRoot, Projects projects) { + private void processAllGradleProps(File projectRoot, Projects projects, + ProjectVersion versionFromScRelease) { try { - Files.walkFileTree(projectRoot.toPath(), new GradlePropertiesWalker(this.properties, projects)); + Files.walkFileTree(projectRoot.toPath(), new GradlePropertiesWalker(this.properties, projects, versionFromScRelease)); } catch (IOException e) { throw new IllegalStateException(e); @@ -59,10 +62,13 @@ public class GradleUpdater { private final ReleaserProperties properties; private final Projects projects; + private final ProjectVersion versionFromScRelease; - private GradlePropertiesWalker(ReleaserProperties properties, Projects projects) { + private GradlePropertiesWalker(ReleaserProperties properties, Projects projects, + ProjectVersion versionFromScRelease) { this.properties = properties; this.projects = projects; + this.versionFromScRelease = versionFromScRelease; } @Override @@ -106,7 +112,14 @@ public class GradleUpdater { private boolean pathIgnored(File file) { String path = file.getPath(); - return this.properties.getGradle().getIgnoredGradleRegex().stream().anyMatch(path::matches); + return bumpingToRelease() && + this.properties.getGradle().getIgnoredGradleRegex().stream().anyMatch(path::matches); + } + + private boolean bumpingToRelease() { + ProjectVersion version = this.projects + .forName(this.versionFromScRelease.projectName); + return version.isRelease() || version.isServiceRelease(); } private String asString(Path path) { 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 9bf1ed46..f9c50c89 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,9 +23,7 @@ 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.Scanner; -import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -77,31 +75,17 @@ public class ProjectPomUpdater { log.info("Skipping project updating"); return; } - updatePoms(projectRoot, versions, versionFromScRelease, Assertion.ASSERT_SNAPSHOTS); + updatePoms(projectRoot, projects, versionFromScRelease, Assertion.ASSERT_SNAPSHOTS); } - private void updatePoms(File projectRoot, Versions versions, + private void updatePoms(File projectRoot, Projects projects, ProjectVersion versionFromScRelease, Assertion assertSnapshots) { File rootPom = new File(projectRoot, "pom.xml"); ModelWrapper rootPomModel = this.pomUpdater.readModel(rootPom); - processAllPoms(projectRoot, new PomWalker(rootPomModel, versions, this.pomUpdater, + processAllPoms(projectRoot, new PomWalker(rootPomModel, projects, this.pomUpdater, this.properties, versionFromScRelease, assertSnapshots)); } - public void updatePomsForRootVersion(File directory, String version) { - File pom = new File(directory, "pom.xml"); - Versions versions = versions(version, pom); - updatePoms(directory, versions, new ProjectVersion("fake", "1.0.0"), - Assertion.IGNORE_ASSERTION); - } - - 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) { try { Files.walkFileTree(projectRoot.toPath(), pomWalker); @@ -121,18 +105,22 @@ public class ProjectPomUpdater { private final ReleaserProperties properties; private final boolean snapshotVersion; private final Assertion assertSnapshots; + private final ProjectVersion versionFromScRelease; + private final Projects projects; - private PomWalker(ModelWrapper rootPom, Versions versions, PomUpdater pomUpdater, + private PomWalker(ModelWrapper rootPom, Projects projects, PomUpdater pomUpdater, ReleaserProperties properties, ProjectVersion versionFromScRelease, Assertion assertSnapshots) { this.rootPom = rootPom; - this.versions = versions; + this.versions = new Versions(projects); this.pomUpdater = pomUpdater; this.properties = properties; this.snapshotVersion = assertSnapshots != Assertion.ASSERT_SNAPSHOTS || versionFromScRelease .isSnapshot(); this.assertSnapshots = assertSnapshots; + this.versionFromScRelease = versionFromScRelease; + this.projects = projects; } @Override @@ -166,7 +154,14 @@ public class ProjectPomUpdater { private boolean pathIgnored(File file) { String path = file.getPath(); - return this.properties.getPom().getIgnoredPomRegex().stream().anyMatch(path::matches); + return bumpingToRelease() && + this.properties.getPom().getIgnoredPomRegex().stream().anyMatch(path::matches); + } + + private boolean bumpingToRelease() { + ProjectVersion version = this.projects + .forName(this.versionFromScRelease.projectName); + return version.isRelease() || version.isServiceRelease(); } private String asString(Path path) { diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/Projects.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/Projects.java index 4900d6cf..12ebebca 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/Projects.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/Projects.java @@ -1,8 +1,7 @@ package org.springframework.cloud.release.internal.pom; -import edu.emory.mathcs.backport.java.util.Arrays; - import java.io.File; +import java.util.Arrays; import java.util.HashSet; import java.util.Set; @@ -19,7 +18,12 @@ public class Projects extends HashSet { @SuppressWarnings("unchecked") public Projects(ProjectVersion... versions) { - addAll(new HashSet(Arrays.asList(versions))); + addAll(new HashSet<>(Arrays.asList(versions))); + } + + public void remove(String projectName) { + ProjectVersion projectVersion = forName(projectName); + remove(projectVersion); } public ProjectVersion forFile(File projectRoot) { diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/ProjectBuilder.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/ProjectBuilder.java index 6e82db82..3794e0cf 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/ProjectBuilder.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/ProjectBuilder.java @@ -11,9 +11,7 @@ import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.LinkedList; import java.util.List; -import java.util.Queue; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @@ -22,7 +20,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.release.internal.ReleaserProperties; import org.springframework.cloud.release.internal.pom.ProjectPomUpdater; -import org.springframework.cloud.release.internal.pom.ProjectVersion; import org.springframework.util.StringUtils; /** @@ -103,12 +100,6 @@ public class ProjectBuilder { } } - public void bumpVersions(String version) { - String workingDir = this.properties.getWorkingDir(); - File dir = new File(workingDir); - this.pomUpdater.updatePomsForRootVersion(dir, version); - } - /** * We need to insert the system properties as a list of -Dkey=value entries * instead of just pasting the String that contains these values diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/ReleaserTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/ReleaserTests.java index fb698e28..dc47eef2 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/ReleaserTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/ReleaserTests.java @@ -2,7 +2,6 @@ package org.springframework.cloud.release.internal; import static org.mockito.BDDMockito.then; import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.never; import java.io.File; @@ -10,15 +9,19 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.function.Supplier; +import org.assertj.core.api.BDDAssertions; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; +import org.springframework.boot.test.rule.OutputCapture; import org.springframework.cloud.release.internal.git.ProjectGitHandler; import org.springframework.cloud.release.internal.gradle.GradleUpdater; import org.springframework.cloud.release.internal.pom.ProjectPomUpdater; import org.springframework.cloud.release.internal.pom.ProjectVersion; +import org.springframework.cloud.release.internal.pom.Projects; import org.springframework.cloud.release.internal.project.ProjectBuilder; import org.springframework.cloud.release.internal.sagan.SaganUpdater; import org.springframework.cloud.release.internal.template.TemplateGenerator; @@ -35,6 +38,7 @@ public class ReleaserTests { @Mock TemplateGenerator templateGenerator; @Mock GradleUpdater gradleUpdater; @Mock SaganUpdater saganUpdater; + @Rule public OutputCapture outputCapture = new OutputCapture(); File pom; @Before @@ -63,27 +67,35 @@ public class ReleaserTests { public void should_not_bump_versions_for_original_release_project() throws Exception { releaser(() -> new ProjectVersion("original", "1.0.0.RELEASE")) .rollbackReleaseVersion(this.pom, - new ProjectVersion("changed", "1.0.0.RELEASE")); + new Projects(new ProjectVersion("changed", "1.0.0.RELEASE")), + new ProjectVersion("changed", "1.0.0.RELEASE")); - then(this.projectBuilder).should(never()).bumpVersions(anyString()); + BDDAssertions.then(this.outputCapture.toString()).contains("Successfully reverted the commit and came back to snapshot versions"); + then(this.projectGitHandler).should(never()).commitAfterBumpingVersions(any(File.class), any(ProjectVersion.class)); } @Test public void should_not_bump_versions_for_original_snapshot_project_and_current_snapshot() throws Exception { releaser(() -> new ProjectVersion("original", "1.0.0.BUILD-SNAPSHOT")) .rollbackReleaseVersion(this.pom, - new ProjectVersion("changed", "1.0.0.BUILD-SNAPSHOT")); + new Projects(new ProjectVersion("changed", "1.0.0.BUILD-SNAPSHOT")), + new ProjectVersion("changed", "1.0.0.BUILD-SNAPSHOT")); - then(this.projectBuilder).should(never()).bumpVersions(anyString()); + BDDAssertions.then(this.outputCapture.toString()).contains("Won't rollback a snapshot version"); + then(this.projectGitHandler).should(never()).commitAfterBumpingVersions(any(File.class), any(ProjectVersion.class)); } @Test public void should_bump_versions_for_original_snapshot_project() throws Exception { ProjectVersion scReleaseVersion = new ProjectVersion("changed", "1.0.0.RELEASE"); releaser(() -> new ProjectVersion("original", "1.0.0.BUILD-SNAPSHOT")) - .rollbackReleaseVersion(this.pom, scReleaseVersion); + .rollbackReleaseVersion(this.pom, + new Projects(new ProjectVersion("changed", "1.0.0.RELEASE")), + scReleaseVersion); - then(this.projectBuilder).should().bumpVersions(anyString()); + BDDAssertions.then(this.outputCapture.toString()) + .contains("Project was successfully updated") + .contains("Successfully reverted the commit and bumped snapshot versions"); } @Test @@ -110,7 +122,9 @@ public class ReleaserTests { @Test public void should_not_rollback_for_snapshots() throws Exception { releaser(() -> new ProjectVersion("original", "1.0.0.BUILD-SNAPSHOT")) - .rollbackReleaseVersion(null, new ProjectVersion("original", "1.0.0.BUILD-SNAPSHOT")); + .rollbackReleaseVersion(null, + new Projects(new ProjectVersion("original", "1.0.0.BUILD-SNAPSHOT")), + new ProjectVersion("original", "1.0.0.BUILD-SNAPSHOT")); then(this.projectGitHandler).should(never()).revertChangesIfApplicable(any(File.class), any(ProjectVersion.class)); } diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/gradle/GradleUpdaterTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/gradle/GradleUpdaterTests.java index 3d476081..b1765b44 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/gradle/GradleUpdaterTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/gradle/GradleUpdaterTests.java @@ -1,5 +1,7 @@ package org.springframework.cloud.release.internal.gradle; +import static org.assertj.core.api.BDDAssertions.then; + import java.io.File; import java.io.IOException; import java.net.URISyntaxException; @@ -16,8 +18,6 @@ import org.springframework.cloud.release.internal.pom.ProjectVersion; import org.springframework.cloud.release.internal.pom.Projects; import org.springframework.util.FileSystemUtils; -import static org.assertj.core.api.BDDAssertions.then; - /** * @author Marcin Grzejszczak */ @@ -45,7 +45,8 @@ public class GradleUpdaterTests { new ProjectVersion("spring-cloud-sleuth", "2.0.0") ); - new GradleUpdater(properties).updateProjectFromSCRelease(projectRoot, projects); + new GradleUpdater(properties).updateProjectFromSCRelease(projectRoot, + projects, new ProjectVersion("spring-cloud-contract", "1.0.0")); then(asString(tmpFile("gradleproject/gradle.properties"))) .contains("foo=1.0.0"); diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/ProjectsTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/ProjectsTests.java index 3158d6db..9e3ed744 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/ProjectsTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/ProjectsTests.java @@ -1,5 +1,8 @@ package org.springframework.cloud.release.internal.pom; +import static org.assertj.core.api.BDDAssertions.then; +import static org.assertj.core.api.BDDAssertions.thenThrownBy; + import java.io.File; import java.net.URISyntaxException; import java.util.HashSet; @@ -7,9 +10,6 @@ import java.util.Set; import org.junit.Test; -import static org.assertj.core.api.BDDAssertions.then; -import static org.assertj.core.api.BDDAssertions.thenThrownBy; - /** * @author Marcin Grzejszczak */ @@ -35,6 +35,17 @@ public class ProjectsTests { then(projects.forName("spring-cloud-starter-build").version).isEqualTo("1.0.0"); } + @Test + public void should_remove_a_project_by_name() { + Set projectVersions = new HashSet<>(); + projectVersions.add(new ProjectVersion("spring-cloud-starter-build", "1.0.0")); + Projects projects = new Projects(projectVersions); + + projects.remove("spring-cloud-starter-build"); + + then(projects).isEmpty(); + } + @Test public void should_return_true_when_there_is_at_least_one_snapshot_project() { Set projectVersions = new HashSet<>(); 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 3671ee3a..20850c84 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 @@ -224,22 +224,6 @@ public class ProjectBuilderTests { thenThrownBy(builder::build).hasMessageContaining("The process has exited with exit code [1]"); } - @Test - public void should_successfully_execute_a_bump_versions_command() throws Exception { - ReleaserProperties properties = new ReleaserProperties(); - properties.setWorkingDir(tmpFile("/spring-cloud-contract").getPath()); - ProjectBuilder builder = new ProjectBuilder(properties, executor(properties)); - - builder.bumpVersions("2.3.4.BUILD-SNAPSHOT"); - - File rootPom = tmpFile("/spring-cloud-contract/pom.xml"); - File tools = tmpFile("/spring-cloud-contract/spring-cloud-contract-tools/pom.xml"); - File converters = tmpFile("/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 Process processWithInvalidExitCode() { return new Process() { @Override public OutputStream getOutputStream() { diff --git a/spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/internal/spring/Tasks.java b/spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/internal/spring/Tasks.java index c28b96ed..b1af34aa 100644 --- a/spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/internal/spring/Tasks.java +++ b/spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/internal/spring/Tasks.java @@ -34,7 +34,7 @@ class Tasks { static Task SNAPSHOTS = task("snapshots", "s", "REVERTING CHANGES & BUMPING VERSION (RELEASE ONLY)", "Go back to snapshots and bump originalVersion by patch", - args -> args.releaser.rollbackReleaseVersion(args.project, args.versionFromScRelease)); + args -> args.releaser.rollbackReleaseVersion(args.project, args.projects, args.versionFromScRelease)); static Task PUSH = task("push", "p", "PUSHING CHANGES", "Push the commits",