Allow bumping of gradle props; fixes #43

This commit is contained in:
Marcin Grzejszczak
2017-10-24 09:29:33 +02:00
parent eccea4e4fd
commit b0ea26366d
10 changed files with 90 additions and 74 deletions

View File

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

View File

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

View File

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

View File

@@ -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<ProjectVersion> {
@SuppressWarnings("unchecked")
public Projects(ProjectVersion... versions) {
addAll(new HashSet<ProjectVersion>(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) {

View File

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

View File

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

View File

@@ -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");

View File

@@ -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<ProjectVersion> 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<ProjectVersion> projectVersions = new HashSet<>();

View File

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

View File

@@ -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",