Asserting Gradle snapshots, fixed the way snapshots are asserted after rollback
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user