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 9369741e..6406b996 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 @@ -5,10 +5,11 @@ import java.lang.invoke.MethodHandles; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.cloud.release.internal.project.ProjectBuilder; import org.springframework.cloud.release.internal.git.ProjectGitUpdater; 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; /** * @author Marcin Grzejszczak @@ -27,8 +28,12 @@ public class Releaser { this.projectGitUpdater = projectGitUpdater; } - public ProjectVersion updateProjectFromScRelease(File project) { - this.projectPomUpdater.updateProjectFromSCRelease(project); + public Projects retrieveVersionsFromSCRelease() { + return this.projectPomUpdater.retrieveVersionsFromSCRelease(); + } + + public ProjectVersion updateProjectFromScRelease(File project, Projects versions) { + this.projectPomUpdater.updateProjectFromSCRelease(project, versions); ProjectVersion changedVersion = new ProjectVersion(project); log.info("\n\nProject was successfully updated to [{}]", changedVersion); return changedVersion; 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 4893c739..83d7b671 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 @@ -49,17 +49,27 @@ public class ProjectPomUpdater { } /** - * For the given root folder (typically the working directory) performs the whole - * flow of updating {@code pom.xml} with values from Spring Cloud Release project. - * - * @param projectRoot - root folder with project to update + * For the given root folder (typically the working directory) retrieves list of versions + * for a given release version. */ - public void updateProjectFromSCRelease(File projectRoot) { + public Projects retrieveVersionsFromSCRelease() { File clonedScRelease = this.gitRepo.cloneScReleaseProject(); this.gitRepo.checkout(clonedScRelease, this.properties.getPom().getBranch()); SCReleasePomParser sCReleasePomParser = new SCReleasePomParser(clonedScRelease); Versions versions = sCReleasePomParser.allVersions(); log.info("Retrieved the following versions\n{}", versions); + return versions.toProjectVersions(); + } + + /** + * For the given root folder (typically the working directory) performs the whole + * flow of updating {@code pom.xml} with values from Spring Cloud Release project. + * + * @param projectRoot - root folder with project to update + * @param projects - versions of projects used to update poms + */ + public void updateProjectFromSCRelease(File projectRoot, Projects projects) { + Versions versions = new Versions(projects); if (!this.pomUpdater.shouldProjectBeUpdated(projectRoot, versions)) { log.info("Skipping project updating"); return; diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/Projects.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/Projects.java new file mode 100644 index 00000000..6d2fad52 --- /dev/null +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/Projects.java @@ -0,0 +1,24 @@ +package org.springframework.cloud.release.internal.pom; + +import java.io.File; +import java.util.HashSet; +import java.util.Set; + +/** + * Abstraction over collection of projects + * + * @author Marcin Grzejszczak + */ +public class Projects extends HashSet { + + public Projects(Set versions) { + addAll(versions); + } + + public ProjectVersion forFile(File projectRoot) { + final ProjectVersion thisProject = new ProjectVersion(projectRoot); + return this.stream().filter(projectVersion -> projectVersion.projectName.equals(thisProject.projectName)) + .findFirst() + .orElseThrow(() -> new IllegalStateException("Project with name [" + thisProject.projectName + "] is not present")); + } +} diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/Versions.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/Versions.java index 1816e326..807319ad 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/Versions.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/Versions.java @@ -54,11 +54,23 @@ class Versions { Versions(String bootVersion, String scBuildVersion, Set projects) { this.bootVersion = bootVersion; this.scBuildVersion = scBuildVersion; + this.projects.add(new Project(SPRING_BOOT_PROJECT_NAME, bootVersion)); + this.projects.add(new Project(BOOT_STARTER_ARTIFACT_ID, bootVersion)); this.projects.add(new Project(BUILD_ARTIFACT_ID, scBuildVersion)); this.projects.add(new Project(CLOUD_DEPENDENCIES_ARTIFACT_ID, scBuildVersion)); this.projects.addAll(projects); } + Versions(Set versions) { + this.bootVersion = versions.stream().filter(projectVersion -> SPRING_BOOT_PROJECT_NAME.equals(projectVersion.projectName)) + .findFirst().orElseThrow(() -> new IllegalStateException("Boot Version is Missing")).version; + this.scBuildVersion = versions.stream().filter(projectVersion -> BUILD_ARTIFACT_ID.equals(projectVersion.projectName)) + .findFirst().orElseThrow(() -> new IllegalStateException("Spring Cloud Build Version is Missing")).version; + this.projects = versions.stream() + .map(projectVersion -> new Project(projectVersion.projectName, projectVersion.version)) + .collect(Collectors.toSet()); + } + String versionForProject(String projectName) { return this.projects.stream() .filter(project -> nameMatches(projectName, project)) @@ -77,6 +89,11 @@ class Versions { .anyMatch(project -> properties.containsKey(project.name + ".version")); } + Projects toProjectVersions() { + return new Projects(this.projects.stream().map(project -> new ProjectVersion(project.name, project.version)) + .collect(Collectors.toSet())); + } + private boolean nameMatches(String projectName, Project project) { if (project.name.equals(projectName)) { return true; 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 6ce7c98d..5e1f3f5e 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 @@ -12,6 +12,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.springframework.cloud.release.internal.pom.ProjectPomUpdater; +import org.springframework.cloud.release.internal.pom.Projects; import org.springframework.cloud.release.internal.pom.TestPomReader; import org.springframework.cloud.release.internal.pom.TestUtils; import org.springframework.util.FileSystemUtils; @@ -38,9 +39,10 @@ public class PomUpdateAcceptanceTests { public void should_update_all_versions_for_a_release_train() throws Exception { ReleaserProperties releaserProperties = releaserProperties(); ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties); + Projects projects = projectPomUpdater.retrieveVersionsFromSCRelease(); projectPomUpdater - .updateProjectFromSCRelease(new File(this.temporaryFolder, "/spring-cloud-sleuth")); + .updateProjectFromSCRelease(new File(this.temporaryFolder, "/spring-cloud-sleuth"), projects); then(this.temporaryFolder).exists(); Model rootPom = this.testPomReader.readPom(tmpFile("/spring-cloud-sleuth/pom.xml")); @@ -63,10 +65,11 @@ public class PomUpdateAcceptanceTests { public void should_update_fail_when_after_updating_a_release_version_there_still_is_a_snapshot_version() throws Exception { ReleaserProperties releaserProperties = branchReleaserProperties(); ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties); + Projects projects = projectPomUpdater.retrieveVersionsFromSCRelease(); BDDAssertions.thenThrownBy(() -> projectPomUpdater - .updateProjectFromSCRelease(new File(this.temporaryFolder, "/spring-cloud-sleuth-with-unmatched-property")) + .updateProjectFromSCRelease(new File(this.temporaryFolder, "/spring-cloud-sleuth-with-unmatched-property"), projects) ).hasMessageContaining("0.6.0.BUILD-SNAPSHOT"); } @@ -75,8 +78,9 @@ public class PomUpdateAcceptanceTests { ReleaserProperties releaserProperties = releaserProperties(); ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties); File beforeProcessing = pom("/projects/project/"); + Projects projects = projectPomUpdater.retrieveVersionsFromSCRelease(); - projectPomUpdater.updateProjectFromSCRelease(tmpFile("/project/")); + projectPomUpdater.updateProjectFromSCRelease(tmpFile("/project/"), projects); 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/pom/ProjectsTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/ProjectsTests.java new file mode 100644 index 00000000..33ad8880 --- /dev/null +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/pom/ProjectsTests.java @@ -0,0 +1,49 @@ +package org.springframework.cloud.release.internal.pom; + +import java.io.File; +import java.net.URISyntaxException; +import java.util.HashSet; +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 + */ +public class ProjectsTests { + + File springCloudReleasePom = file("/projects/spring-cloud-release"); + + @Test + public void should_find_a_project_by_name_from_file() { + Set projectVersions = new HashSet<>(); + projectVersions.add(new ProjectVersion("spring-cloud-starter-build", "1.0.0")); + Projects projects = new Projects(projectVersions); + + then(projects.forFile(springCloudReleasePom).version).isEqualTo("1.0.0"); + } + + @Test + public void should_throw_exception_when_project_is_not_present() { + Set projectVersions = new HashSet<>(); + projectVersions.add(new ProjectVersion("foo", "1.0.0")); + Projects projects = new Projects(projectVersions); + + thenThrownBy(() -> projects.forFile(springCloudReleasePom)) + .isInstanceOf(IllegalStateException.class) + .hasMessageContaining("Project with name [spring-cloud-starter-build] is not present"); + } + + private File file(String relativePath) { + try { + return new File(ProjectsTests.class.getResource(relativePath).toURI()); + } + catch (URISyntaxException e) { + throw new RuntimeException(e); + } + } + +} \ No newline at end of file diff --git a/spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/internal/spring/SpringReleaser.java b/spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/internal/spring/SpringReleaser.java index 371594f9..c0855ec5 100644 --- a/spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/internal/spring/SpringReleaser.java +++ b/spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/internal/spring/SpringReleaser.java @@ -8,6 +8,7 @@ import org.slf4j.LoggerFactory; import org.springframework.cloud.release.internal.Releaser; import org.springframework.cloud.release.internal.ReleaserProperties; import org.springframework.cloud.release.internal.pom.ProjectVersion; +import org.springframework.cloud.release.internal.pom.Projects; /** * Releaser that gets input from console @@ -30,15 +31,18 @@ public class SpringReleaser { } public void release() { + log.info("\n\n\n=== RETRIEVING VERSIONS ===\n\nWill clone Spring Cloud Release" + + " to retrieve all versions for the branch [{}]", this.properties.getPom().getBranch()); String workingDir = this.properties.getWorkingDir(); File project = new File(workingDir); + ProjectVersion originalVersion = new ProjectVersion(project); + Projects projects = this.releaser.retrieveVersionsFromSCRelease(); + ProjectVersion changedVersion = projects.forFile(project); log.info("\n\n\n=== UPDATING POMS ===\n\nWill run the application " + "for root folder [{}]. \n\nPress ENTER to continue {}", workingDir, MSG); boolean skipPoms = skipStep(); - ProjectVersion originalVersion = new ProjectVersion(project); - ProjectVersion changedVersion = new ProjectVersion(project); if (!skipPoms) { - changedVersion = this.releaser.updateProjectFromScRelease(project); + changedVersion = this.releaser.updateProjectFromScRelease(project, projects); } log.info("\n\n\n=== BUILD PROJECT ===\n\nPress ENTER to build the project {}", MSG); boolean skipBuild = skipStep();