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());
}