diff --git a/docs/src/main/asciidoc/spring-cloud-release-tools.adoc b/docs/src/main/asciidoc/spring-cloud-release-tools.adoc index 3cbe3bbb..f83b2b34 100644 --- a/docs/src/main/asciidoc/spring-cloud-release-tools.adoc +++ b/docs/src/main/asciidoc/spring-cloud-release-tools.adoc @@ -214,6 +214,7 @@ $ java -jar ~/repo/spring-cloud-release-tools/spring-cloud-release-tools-spring/ - `releaser.fixed-versions` - A String to String mapping of manually set versions. E.g. `"spring-cloud-cli" -> "1.0.0.RELEASE"` will set the `spring-cloud-cli.version` to `1.0.0.RELEASE` regardless of what was set in `spring-cloud-release` project. Example `--releaser.fixed-versions[spring-cloud-cli]=1.0.0.RELEASE`. +- `releaser.git.fetch-versions-from-git` - If `true` then should fill the map of versions from Git. If `false` then picks fixed versions - `releaser.git.clone-destination-dir` - Where should the Spring Cloud Release repo get cloned to. If null defaults to a temporary directory - `releaser.git.spring-cloud-release-git-url` - URL to Spring Cloud Release Git repository. Defaults to `https://github.com/spring-cloud/spring-cloud-release` - `releaser.git.oauth-token` - GitHub OAuth token to be used to interact with GitHub repo. 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 429158c2..51320a50 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 @@ -15,6 +15,7 @@ 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.util.Assert; /** * @author Marcin Grzejszczak @@ -119,6 +120,8 @@ public class Releaser { } public void createEmail(ProjectVersion releaseVersion) { + Assert.notNull(releaseVersion, "You must provide a release version for your project"); + Assert.notNull(releaseVersion.version, "You must provide a release version for your project"); if (releaseVersion.isSnapshot()) { log.info("\nWon't create email template for a SNAPSHOT version"); return; diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/ReleaserProperties.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/ReleaserProperties.java index bef61c8c..75d7f472 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/ReleaserProperties.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/ReleaserProperties.java @@ -59,6 +59,11 @@ public class ReleaserProperties { */ private String cloneDestinationDir; + /** + * If {@code true} then should fill the map of versions from Git. If {@code false} then picks fixed versions + */ + private boolean fetchVersionsFromGit = true; + /** * GitHub OAuth token to be used to interact with GitHub repo */ @@ -127,6 +132,14 @@ public class ReleaserProperties { public void setNumberOfCheckedMilestones(Integer numberOfCheckedMilestones) { this.numberOfCheckedMilestones = numberOfCheckedMilestones; } + + public boolean isFetchVersionsFromGit() { + return this.fetchVersionsFromGit; + } + + public void setFetchVersionsFromGit(boolean fetchVersionsFromGit) { + this.fetchVersionsFromGit = fetchVersionsFromGit; + } } public static class Pom { 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 bbe1a7a4..5a62722a 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 @@ -3,6 +3,7 @@ package org.springframework.cloud.release.internal.spring; import java.io.File; import java.lang.invoke.MethodHandles; import java.util.List; +import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,6 +14,7 @@ import org.springframework.cloud.release.internal.options.Options; import org.springframework.cloud.release.internal.options.OptionsBuilder; import org.springframework.cloud.release.internal.pom.ProjectVersion; import org.springframework.cloud.release.internal.pom.Projects; +import org.springframework.cloud.release.internal.sagan.Project; /** * Releaser that gets input from console @@ -48,14 +50,25 @@ public class SpringReleaser { } public void release(Options options) { - printVersionRetrieval(); String workingDir = this.properties.getWorkingDir(); File project = new File(workingDir); ProjectVersion originalVersion = new ProjectVersion(project); - Projects projectsFromScRelease = this.releaser.retrieveVersionsFromSCRelease(); - ProjectVersion versionFromScRelease = projectsFromScRelease.forFile(project); - assertNoSnapshotsForANonSnapshotProject(projectsFromScRelease, versionFromScRelease); - final Args defaultArgs = new Args(this.releaser, project, projectsFromScRelease, + ProjectVersion versionFromScRelease; + Projects projectsToUpdate; + if (this.properties.getGit().isFetchVersionsFromGit()) { + printVersionRetrieval(); + projectsToUpdate = this.releaser.retrieveVersionsFromSCRelease(); + versionFromScRelease = projectsToUpdate.forFile(project); + assertNoSnapshotsForANonSnapshotProject(projectsToUpdate, versionFromScRelease); + } else { + String fixedVersionForProject = this.properties.getFixedVersions().get(originalVersion.projectName); + versionFromScRelease = new ProjectVersion(originalVersion.projectName, fixedVersionForProject); + projectsToUpdate = this.properties.getFixedVersions().entrySet().stream() + .map(entry -> new ProjectVersion(entry.getKey(), entry.getValue())) + .distinct().collect(Collectors.toCollection(Projects::new)); + printSettingVersionFromFixedVersions(projectsToUpdate); + } + final Args defaultArgs = new Args(this.releaser, project, projectsToUpdate, originalVersion, versionFromScRelease, this.properties, options.interactive); this.optionsProcessor.processOptions(options, defaultArgs); } @@ -65,6 +78,11 @@ public class SpringReleaser { + " to retrieve all versions for the branch [{}]", this.properties.getPom().getBranch()); } + private void printSettingVersionFromFixedVersions(Projects projectsToUpdate) { + log.info("\n\n\n=== RETRIEVED VERSIONS ===\n\nWill use the fixed versions" + + " of projects [{}]", projectsToUpdate); + } + private void assertNoSnapshotsForANonSnapshotProject(Projects projects, ProjectVersion versionFromScRelease) { if (!versionFromScRelease.isSnapshot() && projects.containsSnapshots()) { diff --git a/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/spring/AcceptanceTests.java b/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/spring/AcceptanceTests.java index 49c03ab3..e6675c94 100644 --- a/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/spring/AcceptanceTests.java +++ b/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/spring/AcceptanceTests.java @@ -20,6 +20,7 @@ import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.mockito.BDDMockito; import org.mockito.Mockito; +import org.springframework.boot.test.rule.OutputCapture; import org.springframework.cloud.release.internal.Releaser; import org.springframework.cloud.release.internal.ReleaserProperties; import org.springframework.cloud.release.internal.git.GitTestUtils; @@ -49,6 +50,7 @@ public class AcceptanceTests { File temporaryFolder; TestProjectGitHandler gitHandler; SaganClient saganClient = Mockito.mock(SaganClient.class); + ReleaserProperties releaserProperties; @Before public void setup() throws Exception { @@ -92,6 +94,25 @@ public class AcceptanceTests { .hasMessageContaining("there is at least one SNAPSHOT library version in the Spring Cloud Release project"); } + @Test + public void should_not_clone_when_option_not_to_clone_was_switched_on() throws Exception { + File origin = GitTestUtils.clonedProject(this.tmp.newFolder(), this.springCloudConsulProject); + pomVersionIsEqualTo(origin, "1.2.0.BUILD-SNAPSHOT"); + consulPomParentVersionIsEqualTo(origin, "1.2.0.BUILD-SNAPSHOT"); + File project = GitTestUtils.clonedProject(this.tmp.newFolder(), tmpFile("spring-cloud-consul")); + GitTestUtils.setOriginOnProjectToTmp(origin, project); + SpringReleaser releaser = templateOnlyReleaser(project, "spring-cloud-consul", + "vCamden.SR5", "1.1.2.RELEASE"); + this.releaserProperties.getGit().setFetchVersionsFromGit(false); + this.releaserProperties.getFixedVersions().put("spring-cloud-consul", "2.3.4.RELEASE"); + File temporaryDestination = tmp.newFolder(); + this.releaserProperties.getGit().setCloneDestinationDir(temporaryDestination.getAbsolutePath()); + + releaser.release(); + + then(temporaryDestination.list()).isEmpty(); + } + @Test public void should_perform_a_release_of_consul() throws Exception { File origin = GitTestUtils.clonedProject(this.tmp.newFolder(), this.springCloudConsulProject); @@ -384,12 +405,14 @@ public class AcceptanceTests { releaserProperties.getMaven().setBuildCommand("echo build"); releaserProperties.getMaven().setDeployCommand("echo deploy"); releaserProperties.getMaven().setPublishDocsCommands(new String[] { "echo docs"} ); + this.releaserProperties = releaserProperties; return releaserProperties; } private ReleaserProperties snapshotScReleaseReleaserProperties(File project, String branch) throws URISyntaxException { ReleaserProperties releaserProperties = releaserProperties(project, branch); releaserProperties.getGit().setSpringCloudReleaseGitUrl(file("/projects/spring-cloud-release-with-snapshot/").toURI().getPath()); + this.releaserProperties = releaserProperties; return releaserProperties; }