Asserting Gradle snapshots, fixed the way snapshots are asserted after rollback

This commit is contained in:
Marcin Grzejszczak
2017-10-24 12:57:17 +02:00
parent 8e4d0690a0
commit 092a8d545d
5 changed files with 78 additions and 37 deletions

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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
}
}

View File

@@ -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("<spring-cloud-unmatched.version>0.6.0.BUILD-SNAPSHOT</spring-cloud-unmatched.version>");
}
@@ -90,7 +90,7 @@ public class PomUpdateAcceptanceTests {
BDDAssertions.thenThrownBy(() ->
projectPomUpdater
.updateProjectFromSCRelease(project, projects, projects.forFile(project))
.updateProjectFromSCRelease(project, projects, projects.forFile(project), true)
).hasMessageContaining("<version>1.4.2.BUILD-SNAPSHOT</version>");
}
@@ -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");

View File

@@ -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<String, String> props = new HashMap<String, String>() {{
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());
}