From 092a8d545de9c37794167c850c1139e47ddcfc97 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Tue, 24 Oct 2017 12:57:17 +0200 Subject: [PATCH] Asserting Gradle snapshots, fixed the way snapshots are asserted after rollback --- .../cloud/release/internal/Releaser.java | 16 +++++++-- .../internal/gradle/GradleUpdater.java | 36 ++++++++++++++++--- .../internal/pom/ProjectPomUpdater.java | 33 +++++------------ .../internal/PomUpdateAcceptanceTests.java | 8 ++--- .../internal/gradle/GradleUpdaterTests.java | 22 +++++++++++- 5 files changed, 78 insertions(+), 37 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 81f4437d..44a8607a 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 @@ -20,6 +20,9 @@ import org.springframework.cloud.release.internal.project.ProjectBuilder; public class Releaser { private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + private static boolean ASSERT_SNAPSHOTS = true; + private static boolean SKIP_SNAPSHOT_ASSERTION = false; + private final ProjectPomUpdater projectPomUpdater; private final ProjectBuilder projectBuilder; private final ProjectGitHandler projectGitHandler; @@ -44,8 +47,15 @@ public class Releaser { public void updateProjectFromScRelease(File project, Projects versions, ProjectVersion versionFromScRelease) { - this.projectPomUpdater.updateProjectFromSCRelease(project, versions, versionFromScRelease); - this.gradleUpdater.updateProjectFromSCRelease(project, versions, versionFromScRelease); + updateProjectFromScRelease(project, versions, versionFromScRelease, ASSERT_SNAPSHOTS); + } + + private void updateProjectFromScRelease(File project, Projects versions, + ProjectVersion versionFromScRelease, boolean assertSnapshots) { + this.projectPomUpdater.updateProjectFromSCRelease(project, versions, + versionFromScRelease, assertSnapshots); + this.gradleUpdater.updateProjectFromSCRelease(project, versions, + versionFromScRelease, assertSnapshots); ProjectVersion changedVersion = new ProjectVersion(project); log.info("\n\nProject was successfully updated to [{}]", changedVersion); } @@ -82,7 +92,7 @@ public class Releaser { Projects newProjects = new Projects(projects); newProjects.remove(scReleaseVersion.projectName); newProjects.add(new ProjectVersion(originalVersion.projectName, originalVersion.bumpedVersion())); - updateProjectFromScRelease(project, newProjects, originalVersion); + updateProjectFromScRelease(project, newProjects, originalVersion, SKIP_SNAPSHOT_ASSERTION); 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 0675afe1..ad53f36a 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 @@ -11,6 +11,7 @@ import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import java.util.Map; import java.util.Properties; +import java.util.Scanner; import java.util.concurrent.atomic.AtomicReference; import org.slf4j.Logger; @@ -40,16 +41,18 @@ public class GradleUpdater { * @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 + * @param assertSnapshots - should snapshots presence be asserted */ public void updateProjectFromSCRelease(File projectRoot, Projects projects, - ProjectVersion versionFromScRelease) { - processAllGradleProps(projectRoot, projects, versionFromScRelease); + ProjectVersion versionFromScRelease, boolean assertSnapshots) { + processAllGradleProps(projectRoot, projects, versionFromScRelease, assertSnapshots); } private void processAllGradleProps(File projectRoot, Projects projects, - ProjectVersion versionFromScRelease) { + ProjectVersion versionFromScRelease, boolean assertSnapshots) { try { - Files.walkFileTree(projectRoot.toPath(), new GradlePropertiesWalker(this.properties, projects, versionFromScRelease)); + Files.walkFileTree(projectRoot.toPath(), + new GradlePropertiesWalker(this.properties, projects, versionFromScRelease, assertSnapshots)); } catch (IOException e) { throw new IllegalStateException(e); @@ -63,12 +66,16 @@ public class GradleUpdater { private final ReleaserProperties properties; private final Projects projects; private final ProjectVersion versionFromScRelease; + private final boolean snapshotVersion; + private final boolean assertSnapshots; private GradlePropertiesWalker(ReleaserProperties properties, Projects projects, - ProjectVersion versionFromScRelease) { + ProjectVersion versionFromScRelease, boolean assertSnapshots) { this.properties = properties; this.projects = projects; this.versionFromScRelease = versionFromScRelease; + this.snapshotVersion = !assertSnapshots || versionFromScRelease.isSnapshot(); + this.assertSnapshots = assertSnapshots; } @Override @@ -95,10 +102,29 @@ public class GradleUpdater { } }); storeString(path, changedString.get()); + assertNoSnapshotsArePresent(path); } return FileVisitResult.CONTINUE; } + private void assertNoSnapshotsArePresent(Path path) { + if (this.assertSnapshots && !this.snapshotVersion) { + log.debug("Update is a non-snapshot one. Checking if no snapshot versions remained in the gradle prop"); + Scanner scanner = new Scanner(asString(path)); + int lineNumber = 0; + while (scanner.hasNextLine()) { + String line = scanner.nextLine(); + lineNumber++; + boolean containsSnapshot = line.contains("BUILD-SNAPSHOT"); + if (containsSnapshot) { + throw new IllegalStateException("The file [" + path + "] contains a BUILD-SNAPSHOT " + + "version for a non snapshot release in line number [" + lineNumber + "]\n\n" + line); + } + } + log.info("No snapshot versions remained in the pom"); + } + } + private Properties loadProps(File file) { Properties props = new Properties(); try { 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 f9c50c89..c511b657 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 @@ -67,19 +67,20 @@ public class ProjectPomUpdater { * @param projectRoot - root folder with project to update * @param projects - versions of projects used to update poms * @param versionFromScRelease - version for the built project taken from Spring Cloud Release project + * @param assertSnapshots - should snapshots present be asserted */ public void updateProjectFromSCRelease(File projectRoot, Projects projects, - ProjectVersion versionFromScRelease) { + ProjectVersion versionFromScRelease, boolean assertSnapshots) { Versions versions = new Versions(projects); if (!this.pomUpdater.shouldProjectBeUpdated(projectRoot, versions)) { log.info("Skipping project updating"); return; } - updatePoms(projectRoot, projects, versionFromScRelease, Assertion.ASSERT_SNAPSHOTS); + updatePoms(projectRoot, projects, versionFromScRelease, assertSnapshots); } private void updatePoms(File projectRoot, Projects projects, - ProjectVersion versionFromScRelease, Assertion assertSnapshots) { + ProjectVersion versionFromScRelease, boolean assertSnapshots) { File rootPom = new File(projectRoot, "pom.xml"); ModelWrapper rootPomModel = this.pomUpdater.readModel(rootPom); processAllPoms(projectRoot, new PomWalker(rootPomModel, projects, this.pomUpdater, @@ -104,23 +105,17 @@ public class ProjectPomUpdater { private final PomUpdater pomUpdater; private final ReleaserProperties properties; private final boolean snapshotVersion; - private final Assertion assertSnapshots; - private final ProjectVersion versionFromScRelease; - private final Projects projects; + private final boolean assertSnapshots; private PomWalker(ModelWrapper rootPom, Projects projects, PomUpdater pomUpdater, ReleaserProperties properties, ProjectVersion versionFromScRelease, - Assertion assertSnapshots) { + boolean assertSnapshots) { this.rootPom = rootPom; this.versions = new Versions(projects); this.pomUpdater = pomUpdater; this.properties = properties; - this.snapshotVersion = - assertSnapshots != Assertion.ASSERT_SNAPSHOTS || versionFromScRelease - .isSnapshot(); + this.snapshotVersion = !assertSnapshots || versionFromScRelease.isSnapshot(); this.assertSnapshots = assertSnapshots; - this.versionFromScRelease = versionFromScRelease; - this.projects = projects; } @Override @@ -133,7 +128,7 @@ public class ProjectPomUpdater { } ModelWrapper model = this.pomUpdater.updateModel(this.rootPom, file, this.versions); this.pomUpdater.overwritePomIfDirty(model, this.versions, file); - if (this.assertSnapshots == Assertion.ASSERT_SNAPSHOTS && !this.snapshotVersion) { + if (this.assertSnapshots && !this.snapshotVersion) { 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; @@ -154,16 +149,10 @@ public class ProjectPomUpdater { private boolean pathIgnored(File file) { String path = file.getPath(); - return bumpingToRelease() && + return this.snapshotVersion && 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) { try { return new String(Files.readAllBytes(path)); @@ -173,10 +162,6 @@ public class ProjectPomUpdater { } } } - - private enum Assertion { - ASSERT_SNAPSHOTS, IGNORE_ASSERTION - } } 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 05a2d7ea..120e3a3b 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 @@ -46,7 +46,7 @@ public class PomUpdateAcceptanceTests { File project = new File(this.temporaryFolder, "/spring-cloud-sleuth"); projectPomUpdater - .updateProjectFromSCRelease(project, projects, projects.forFile(project)); + .updateProjectFromSCRelease(project, projects, projects.forFile(project), true); then(this.temporaryFolder).exists(); Model rootPom = this.testPomReader.readPom(tmpFile("/spring-cloud-sleuth/pom.xml")); @@ -75,7 +75,7 @@ public class PomUpdateAcceptanceTests { BDDAssertions.thenThrownBy(() -> projectPomUpdater - .updateProjectFromSCRelease(project, projects, projects.forFile(project)) + .updateProjectFromSCRelease(project, projects, projects.forFile(project), true) ).hasMessageContaining("0.6.0.BUILD-SNAPSHOT"); } @@ -90,7 +90,7 @@ public class PomUpdateAcceptanceTests { BDDAssertions.thenThrownBy(() -> projectPomUpdater - .updateProjectFromSCRelease(project, projects, projects.forFile(project)) + .updateProjectFromSCRelease(project, projects, projects.forFile(project), true) ).hasMessageContaining("1.4.2.BUILD-SNAPSHOT"); } @@ -103,7 +103,7 @@ public class PomUpdateAcceptanceTests { File project = tmpFile("/project/"); projectPomUpdater.updateProjectFromSCRelease(project, projects, - new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT")); + new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"), true); 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/gradle/GradleUpdaterTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/gradle/GradleUpdaterTests.java index b1765b44..3439e265 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,6 +1,7 @@ package org.springframework.cloud.release.internal.gradle; import static org.assertj.core.api.BDDAssertions.then; +import static org.assertj.core.api.BDDAssertions.thenThrownBy; import java.io.File; import java.io.IOException; @@ -46,7 +47,7 @@ public class GradleUpdaterTests { ); new GradleUpdater(properties).updateProjectFromSCRelease(projectRoot, - projects, new ProjectVersion("spring-cloud-contract", "1.0.0")); + projects, new ProjectVersion("spring-cloud-contract", "1.0.0"), true); then(asString(tmpFile("gradleproject/gradle.properties"))) .contains("foo=1.0.0"); @@ -54,6 +55,25 @@ public class GradleUpdaterTests { .contains("bar=2.0.0"); } + @Test + public void should_throw_exception_if_snapshots_remain() throws IOException { + File projectRoot = tmpFile("gradleproject"); + ReleaserProperties properties = new ReleaserProperties(); + Map props = new HashMap() {{ + put("foo", "spring-cloud-contract"); + put("bar", "spring-cloud-sleuth"); + }}; + properties.getGradle().setGradlePropsSubstitution(props); + Projects projects = new Projects( + new ProjectVersion("spring-cloud-contract", "1.0.0.BUILD-SNAPSHOT"), + new ProjectVersion("spring-cloud-sleuth", "2.0.0") + ); + + thenThrownBy(() -> new GradleUpdater(properties).updateProjectFromSCRelease(projectRoot, + projects, new ProjectVersion("spring-cloud-contract", "1.0.0"), true)) + .hasMessageContaining("contains a BUILD-SNAPSHOT version for a non snapshot release in line number"); + } + private File file(String relativePath) throws URISyntaxException { return new File(GradleUpdaterTests.class.getResource(relativePath).toURI()); }