Upgrade dependencies. Start rewriting tests.

This commit is contained in:
Olga Maciaszek-Sharma
2022-02-15 14:38:12 +01:00
parent 2e7d318f13
commit 435ef0e58a
142 changed files with 1774 additions and 2930 deletions

18
pom.xml
View File

@@ -12,7 +12,7 @@
<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-build</artifactId>
<version>2.2.3.RELEASE</version>
<version>3.1.0</version>
<relativePath/>
<!-- lookup parent from repository -->
</parent>
@@ -30,17 +30,17 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
<spring-cloud-bom.version>Hoxton.SR6</spring-cloud-bom.version>
<jcabi-github.version>1.0</jcabi-github.version>
<spring-cloud-bom.version>2021.0.0</spring-cloud-bom.version>
<jcabi-github.version>1.1.2</jcabi-github.version>
<jsch-agent.version>0.0.9</jsch-agent.version>
<hibernate-validator.version>5.4.1.Final</hibernate-validator.version>
<org.eclipse.jgit-version>5.1.3.201810200350-r</org.eclipse.jgit-version>
<hibernate-validator.version>7.0.2.Final</hibernate-validator.version>
<org.eclipse.jgit-version>6.0.0.202111291000-r</org.eclipse.jgit-version>
<!-- Versions plugin uses this version -->
<maven-model.version>3.6.3</maven-model.version>
<maven-model.version>3.8.4</maven-model.version>
<versions-maven-plugin.version>2.7</versions-maven-plugin.version>
<handlebars.version>4.2.0</handlebars.version>
<initializr-metadata.version>0.10.0-SNAPSHOT</initializr-metadata.version>
<awaitility.version>4.0.3</awaitility.version>
<handlebars.version>4.3.0</handlebars.version>
<initializr-metadata.version>0.12.0</initializr-metadata.version>
<awaitility.version>4.1.1</awaitility.version>
<sagan-site.version>1.0.0.BUILD-SNAPSHOT</sagan-site.version>
<javax.json.version>1.1.4</javax.json.version>
<jopt-simple.version>5.0.4</jopt-simple.version>

View File

@@ -21,7 +21,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import releaser.cloud.SpringCloudReleaserProperties;
import releaser.internal.buildsystem.CustomBomParser;
import releaser.internal.buildsystem.VersionsFromBom;

View File

@@ -22,9 +22,9 @@ import java.net.URISyntaxException;
import java.util.Arrays;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.rules.TemporaryFolder;
import releaser.cloud.SpringCloudReleaserProperties;
import releaser.cloud.docs.TestUtils;
@@ -52,7 +52,7 @@ public class SpringCloudMavenBomParserTests {
ReleaserProperties properties = SpringCloudReleaserProperties.get();
@Before
@BeforeEach
public void setup() throws URISyntaxException, IOException, GitAPIException {
this.tmpFolder = this.tmp.newFolder();
TestUtils.prepareLocalRepo();

View File

@@ -21,7 +21,7 @@ import java.util.Map;
import java.util.stream.Collectors;
import org.assertj.core.api.BDDAssertions;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import releaser.cloud.SpringCloudReleaserProperties;
import releaser.internal.ReleaserProperties;
import releaser.internal.buildsystem.MavenBomParserAccessor;

View File

@@ -26,9 +26,9 @@ import java.util.Collections;
import javax.validation.constraints.NotNull;
import org.assertj.core.api.BDDAssertions;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.rules.TemporaryFolder;
import org.mockito.BDDMockito;
import releaser.cloud.SpringCloudReleaserProperties;
@@ -63,7 +63,7 @@ public class SpringCloudCustomProjectDocumentationUpdaterTests {
ReleaserProperties properties = SpringCloudReleaserProperties.get();
@Before
@BeforeEach
public void setup() throws IOException, URISyntaxException {
this.tmpFolder = this.tmp.newFolder();
this.project = new File(SpringCloudCustomProjectDocumentationUpdater.class

View File

@@ -25,9 +25,9 @@ import com.jcabi.github.Issue;
import com.jcabi.github.Repo;
import com.jcabi.github.Repos;
import com.jcabi.github.mock.MkGithub;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.rules.TemporaryFolder;
import org.mockito.BDDMockito;
import releaser.cloud.SpringCloudReleaserProperties;
@@ -53,7 +53,7 @@ public class SpringCloudGithubIssuesTests {
Repo repo;
@Before
@BeforeEach
public void setup() throws IOException {
this.github = github("spring-guides");
this.properties.getGit().setOauthToken("a");
@@ -81,7 +81,7 @@ public class SpringCloudGithubIssuesTests {
"2.0.0.BUILD-SNAPSHOT")),
new ProjectVersion("sc-release", "Edgware.BUILD-SNAPSHOT"));
BDDMockito.then(github).shouldHaveZeroInteractions();
BDDMockito.then(github).shouldHaveNoInteractions();
}
@Test
@@ -133,7 +133,7 @@ public class SpringCloudGithubIssuesTests {
new ProjectVersion("spring-cloud-build", "2.0.0.RELEASE")),
new ProjectVersion("sc-release", "Edgware.BUILD-SNAPSHOT"));
BDDMockito.then(github).shouldHaveZeroInteractions();
BDDMockito.then(github).shouldHaveNoInteractions();
}
@Test

View File

@@ -19,7 +19,7 @@ package releaser.cloud.spring;
import java.io.File;
import java.util.Arrays;
import org.junit.Before;
import org.junit.jupiter.api.BeforeEach;
import releaser.internal.buildsystem.TestUtils;
import releaser.internal.spring.AbstractSpringAcceptanceTests;
@@ -33,7 +33,7 @@ public class AbstractSpringCloudAcceptanceTests extends AbstractSpringAcceptance
public File springCloudBuildProject;
@Before
@BeforeEach
public void setupCloud() throws Exception {
this.temporaryFolder = this.tmp.newFolder();
this.springCloudConsulProject = new File(AbstractSpringAcceptanceTests.class

View File

@@ -19,7 +19,7 @@ package releaser.cloud.spring.meta;
import java.io.File;
import java.util.Arrays;
import org.junit.Before;
import org.junit.jupiter.api.BeforeEach;
import releaser.internal.spring.meta.AbstractSpringMetaReleaseAcceptanceTests;
import static org.assertj.core.api.BDDAssertions.then;
@@ -31,7 +31,7 @@ public class AbstractSpringCloudMetaAcceptanceTests
public File springCloudBuildProject;
@Before
@BeforeEach
public void setupCloud() throws Exception {
this.springCloudConsulProject = new File(
AbstractSpringCloudMetaAcceptanceTests.class

View File

@@ -21,7 +21,7 @@ import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import org.mockito.BDDMockito;
import releaser.internal.Releaser;
import releaser.internal.ReleaserProperties;

View File

@@ -22,7 +22,7 @@ import java.util.Iterator;
import org.assertj.core.api.BDDAssertions;
import org.eclipse.jgit.revwalk.RevCommit;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import org.mockito.BDDMockito;
import releaser.cloud.spring.AbstractSpringCloudAcceptanceTests;
import releaser.internal.ReleaserProperties;

View File

@@ -48,6 +48,11 @@
<artifactId>jsch.agentproxy.sshagent</artifactId>
<version>${jsch-agent.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit.ssh.jsch</artifactId>
<version>${org.eclipse.jgit-version}</version>
</dependency>
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch.agentproxy.jsch</artifactId>

View File

@@ -69,12 +69,9 @@ public class Releaser {
private ReleaserProperties releaserProperties;
public Releaser(ReleaserProperties releaserProperties,
ProjectPomUpdater projectPomUpdater,
ProjectCommandExecutor projectCommandExecutor,
ProjectGitHandler projectGitHandler,
ProjectGitHubHandler projectGitHubHandler,
TemplateGenerator templateGenerator, GradleUpdater gradleUpdater,
public Releaser(ReleaserProperties releaserProperties, ProjectPomUpdater projectPomUpdater,
ProjectCommandExecutor projectCommandExecutor, ProjectGitHandler projectGitHandler,
ProjectGitHubHandler projectGitHubHandler, TemplateGenerator templateGenerator, GradleUpdater gradleUpdater,
SaganUpdater saganUpdater, DocumentationUpdater documentationUpdater,
PostReleaseActions postReleaseActions) {
this.releaserProperties = releaserProperties;
@@ -101,56 +98,51 @@ public class Releaser {
return this.projectPomUpdater.fixedVersions();
}
public ExecutionResult updateProjectFromBom(File project, Projects versions,
ProjectVersion versionFromBom) {
public ExecutionResult updateProjectFromBom(File project, Projects versions, ProjectVersion versionFromBom) {
return updateProjectFromBom(project, versions, versionFromBom, ASSERT_SNAPSHOTS);
}
private ExecutionResult updateProjectFromBom(File project, Projects versions,
ProjectVersion versionFromBom, boolean assertSnapshots) {
private ExecutionResult updateProjectFromBom(File project, Projects versions, ProjectVersion versionFromBom,
boolean assertSnapshots) {
log.info("Will update the project with versions [{}]", versions);
ReleaserProperties updatedProperties = new ReleaserPropertiesUpdater()
.updateProperties(this.releaserProperties, project);
this.projectPomUpdater.updateProjectFromReleaseTrain(project, versions,
versionFromBom, assertSnapshots);
this.gradleUpdater.updateProjectFromReleaseTrain(updatedProperties, project,
versions, versionFromBom, assertSnapshots);
ReleaserProperties updatedProperties = new ReleaserPropertiesUpdater().updateProperties(this.releaserProperties,
project);
this.projectPomUpdater.updateProjectFromReleaseTrain(project, versions, versionFromBom, assertSnapshots);
this.gradleUpdater.updateProjectFromReleaseTrain(updatedProperties, project, versions, versionFromBom,
assertSnapshots);
ProjectVersion changedVersion = new ProjectVersion(project);
log.info("\n\nProject was successfully updated to [{}]", changedVersion.version);
return ExecutionResult.success();
}
public ExecutionResult buildProject(ReleaserProperties properties,
ProjectVersion originalVersion, ProjectVersion versionFromBom) {
public ExecutionResult buildProject(ReleaserProperties properties, ProjectVersion originalVersion,
ProjectVersion versionFromBom) {
this.projectCommandExecutor.build(properties, originalVersion, versionFromBom);
log.info("\nProject was successfully built");
return ExecutionResult.success();
}
public ExecutionResult commitAndPushTags(File project,
ProjectVersion changedVersion) {
public ExecutionResult commitAndPushTags(File project, ProjectVersion changedVersion) {
this.projectGitHandler.commitAndTagIfApplicable(project, changedVersion);
log.info("\nCommit was made and tag was pushed successfully");
return ExecutionResult.success();
}
public ExecutionResult deploy(ReleaserProperties properties,
ProjectVersion originalVersion, ProjectVersion versionFromBom) {
public ExecutionResult deploy(ReleaserProperties properties, ProjectVersion originalVersion,
ProjectVersion versionFromBom) {
this.projectCommandExecutor.deploy(properties, originalVersion, versionFromBom);
log.info("\nThe artifact was deployed successfully");
return ExecutionResult.success();
}
public ExecutionResult publishDocs(ReleaserProperties properties,
ProjectVersion originalVersion, ProjectVersion changedVersion) {
this.projectCommandExecutor.publishDocs(properties, originalVersion,
changedVersion);
public ExecutionResult publishDocs(ReleaserProperties properties, ProjectVersion originalVersion,
ProjectVersion changedVersion) {
this.projectCommandExecutor.publishDocs(properties, originalVersion, changedVersion);
log.info("\nThe docs were published successfully");
return ExecutionResult.success();
}
public ExecutionResult rollbackReleaseVersion(File project, Projects projects,
ProjectVersion scReleaseVersion) {
public ExecutionResult rollbackReleaseVersion(File project, Projects projects, ProjectVersion scReleaseVersion) {
if (scReleaseVersion.isSnapshot()) {
log.info("\nWon't rollback a snapshot version");
return ExecutionResult.skipped();
@@ -158,34 +150,29 @@ public class Releaser {
this.projectGitHandler.revertChangesIfApplicable(project, scReleaseVersion);
ProjectVersion originalVersion = originalVersion(project);
log.info("Original project version is [{}]", originalVersion);
if ((scReleaseVersion.isRelease() || scReleaseVersion.isServiceRelease())
&& originalVersion.isSnapshot()) {
if ((scReleaseVersion.isRelease() || scReleaseVersion.isServiceRelease()) && originalVersion.isSnapshot()) {
updateBumpedVersions(project, projects, originalVersion);
}
else {
log.info(
"\nSuccessfully reverted the commit and came back to snapshot versions");
log.info("\nSuccessfully reverted the commit and came back to snapshot versions");
}
return ExecutionResult.success();
}
private ExecutionResult updateBumpedVersions(File project, Projects projects,
ProjectVersion originalVersion) {
private ExecutionResult updateBumpedVersions(File project, Projects projects, ProjectVersion originalVersion) {
Projects newProjects = Projects.forRollback(releaserProperties, projects);
ProjectVersion bumpedProject = bumpProject(originalVersion, newProjects);
log.info("Will bump versions \n{}", newProjects);
updateProjectFromBom(project, newProjects, originalVersion,
SKIP_SNAPSHOT_ASSERTION);
updateProjectFromBom(project, newProjects, originalVersion, SKIP_SNAPSHOT_ASSERTION);
this.projectGitHandler.commitAfterBumpingVersions(project, bumpedProject);
log.info("\nSuccessfully reverted the commit and bumped snapshot versions");
return ExecutionResult.success();
}
private ProjectVersion bumpProject(ProjectVersion originalVersion,
Projects newProjects) {
private ProjectVersion bumpProject(ProjectVersion originalVersion, Projects newProjects) {
return newProjects.containsProject(originalVersion.projectName)
? newProjects.forName(originalVersion.projectName) : new ProjectVersion(
originalVersion.projectName, originalVersion.bumpedVersion());
? newProjects.forName(originalVersion.projectName)
: new ProjectVersion(originalVersion.projectName, originalVersion.bumpedVersion());
}
ProjectVersion originalVersion(File project) {
@@ -214,10 +201,8 @@ public class Releaser {
}
public ExecutionResult createEmail(ProjectVersion releaseVersion, Projects projects) {
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");
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 ExecutionResult.skipped();
@@ -229,13 +214,11 @@ public class Releaser {
return ExecutionResult.success();
}
else {
return ExecutionResult.unstable(
new BuildUnstableException("Failed to create an email template"));
return ExecutionResult.unstable(new BuildUnstableException("Failed to create an email template"));
}
}
catch (Exception ex) {
return ExecutionResult.unstable(
new BuildUnstableException("Failed to create an email template", ex));
return ExecutionResult.unstable(new BuildUnstableException("Failed to create an email template", ex));
}
}
@@ -251,53 +234,44 @@ public class Releaser {
return ExecutionResult.success();
}
else {
return ExecutionResult.unstable(
new BuildUnstableException("Failed to create a blog template"));
return ExecutionResult.unstable(new BuildUnstableException("Failed to create a blog template"));
}
}
catch (Exception ex) {
return ExecutionResult.unstable(
new BuildUnstableException("Failed to create a blog template", ex));
return ExecutionResult.unstable(new BuildUnstableException("Failed to create a blog template", ex));
}
}
public ExecutionResult updateSpringGuides(ProjectVersion releaseVersion,
Projects projects, List<ProcessedProject> processedProjects) {
public ExecutionResult updateSpringGuides(ProjectVersion releaseVersion, Projects projects,
List<ProcessedProject> processedProjects) {
if (!(releaseVersion.isRelease() || releaseVersion.isServiceRelease())) {
log.info(
"\nWon't update Spring Guides for a non Release / Service Release version");
log.info("\nWon't update Spring Guides for a non Release / Service Release version");
return ExecutionResult.skipped();
}
Exception springGuidesException = createIssueInSpringGuides(releaseVersion,
projects);
Exception springGuidesException = createIssueInSpringGuides(releaseVersion, projects);
Exception deployGuidesException = deployGuides(processedProjects);
if (springGuidesException != null || deployGuidesException != null) {
return ExecutionResult.unstable(new BuildUnstableException(
"Failed to update Spring Guides. Spring Guides updated successfully ["
+ (springGuidesException != null)
+ "] deployed guides successfully ["
return ExecutionResult.unstable(
new BuildUnstableException("Failed to update Spring Guides. Spring Guides updated successfully ["
+ (springGuidesException != null) + "] deployed guides successfully ["
+ (deployGuidesException != null) + "]"));
}
return ExecutionResult.success();
}
public ExecutionResult updateStartSpringIo(ProjectVersion releaseVersion,
Projects projects) {
public ExecutionResult updateStartSpringIo(ProjectVersion releaseVersion, Projects projects) {
if (!(releaseVersion.isRelease() || releaseVersion.isServiceRelease())) {
log.info(
"\nWon't update start.spring.io for a non Release / Service Release version");
log.info("\nWon't update start.spring.io for a non Release / Service Release version");
return ExecutionResult.skipped();
}
Exception exception = createIssueInStartSpringIo(releaseVersion, projects);
if (exception != null) {
return ExecutionResult.unstable(
new BuildUnstableException("Failed to update start.spring.io"));
return ExecutionResult.unstable(new BuildUnstableException("Failed to update start.spring.io"));
}
return ExecutionResult.success();
}
private Exception createIssueInSpringGuides(ProjectVersion releaseVersion,
Projects projects) {
private Exception createIssueInSpringGuides(ProjectVersion releaseVersion, Projects projects) {
try {
this.projectGitHubHandler.createIssueInSpringGuides(projects, releaseVersion);
log.info("\nSuccessfully created an issue in Spring Guides");
@@ -309,18 +283,15 @@ public class Releaser {
}
}
private Exception createIssueInStartSpringIo(ProjectVersion releaseVersion,
Projects projects) {
private Exception createIssueInStartSpringIo(ProjectVersion releaseVersion, Projects projects) {
try {
this.projectGitHubHandler.createIssueInStartSpringIo(projects,
releaseVersion);
this.projectGitHubHandler.createIssueInStartSpringIo(projects, releaseVersion);
log.info("\nSuccessfully created an issue in start.spring.io");
return null;
}
catch (Exception ex) {
log.error("Failed to update start.spring.io repo", ex);
return new BuildUnstableException("Failed to update start.spring.io repo",
ex);
return new BuildUnstableException("Failed to update start.spring.io repo", ex);
}
}
@@ -348,18 +319,15 @@ public class Releaser {
return ExecutionResult.success();
}
else {
return ExecutionResult.unstable(
new BuildUnstableException("Failed to create a tweet template"));
return ExecutionResult.unstable(new BuildUnstableException("Failed to create a tweet template"));
}
}
catch (Exception ex) {
return ExecutionResult.unstable(
new BuildUnstableException("Failed to create a tweet template", ex));
return ExecutionResult.unstable(new BuildUnstableException("Failed to create a tweet template", ex));
}
}
public ExecutionResult createReleaseNotes(ProjectVersion releaseVersion,
Projects projects) {
public ExecutionResult createReleaseNotes(ProjectVersion releaseVersion, Projects projects) {
if (releaseVersion.isSnapshot()) {
log.info("\nWon't create release notes for a SNAPSHOT version");
return ExecutionResult.skipped();
@@ -370,18 +338,15 @@ public class Releaser {
return ExecutionResult.success();
}
catch (Exception ex) {
return ExecutionResult.unstable(
new BuildUnstableException("Failed to create release notes", ex));
return ExecutionResult.unstable(new BuildUnstableException("Failed to create release notes", ex));
}
}
public ExecutionResult updateSagan(File project, ProjectVersion releaseVersion,
Projects projects) {
public ExecutionResult updateSagan(File project, ProjectVersion releaseVersion, Projects projects) {
String currentBranch = this.projectGitHandler.currentBranch(project);
ProjectVersion originalVersion = new ProjectVersion(project);
try {
return this.saganUpdater.updateSagan(project, currentBranch, originalVersion,
releaseVersion, projects);
return this.saganUpdater.updateSagan(project, currentBranch, originalVersion, releaseVersion, projects);
}
catch (Exception ex) {
return ExecutionResult.unstable(new BuildUnstableException(ex));

View File

@@ -87,8 +87,7 @@ public class ReleaserProperties implements Serializable {
private MetaRelease metaRelease = new MetaRelease();
public String getWorkingDir() {
return StringUtils.hasText(this.workingDir) ? this.workingDir
: System.getProperty("user.dir");
return StringUtils.hasText(this.workingDir) ? this.workingDir : System.getProperty("user.dir");
}
public void setWorkingDir(String workingDir) {
@@ -201,10 +200,9 @@ public class ReleaserProperties implements Serializable {
@Override
public String toString() {
return "ReleaserProperties{" + "workingDir='" + this.workingDir + '\'' + ", git="
+ this.git + ", pom=" + this.pom + ", maven=" + this.maven + ", gradle="
+ this.gradle + ", sagan=" + this.sagan + ", fixedVersions="
+ this.fixedVersions + ", metaRelease=" + this.metaRelease + ", template="
return "ReleaserProperties{" + "workingDir='" + this.workingDir + '\'' + ", git=" + this.git + ", pom="
+ this.pom + ", maven=" + this.maven + ", gradle=" + this.gradle + ", sagan=" + this.sagan
+ ", fixedVersions=" + this.fixedVersions + ", metaRelease=" + this.metaRelease + ", template="
+ this.template + ", versions=" + this.versions + '}';
}
@@ -362,8 +360,7 @@ public class ReleaserProperties implements Serializable {
return this.releaseTrainDependencyNames;
}
public void setReleaseTrainDependencyNames(
List<String> releaseTrainDependencyNames) {
public void setReleaseTrainDependencyNames(List<String> releaseTrainDependencyNames) {
this.releaseTrainDependencyNames = releaseTrainDependencyNames;
}
@@ -401,12 +398,10 @@ public class ReleaserProperties implements Serializable {
@Override
public String toString() {
return "MetaRelease{" + "enabled=" + enabled + ", releaseTrainProjectName='"
+ releaseTrainProjectName + '\'' + ", releaseTrainDependencyNames="
+ releaseTrainDependencyNames + ", gitOrgUrl='" + gitOrgUrl + '\''
+ ", projectsToSkip=" + projectsToSkip + ", releaseGroups="
+ releaseGroups + ", releaseGroupTimeoutInMinutes="
+ releaseGroupTimeoutInMinutes + ", releaseGroupThreadCount="
return "MetaRelease{" + "enabled=" + enabled + ", releaseTrainProjectName='" + releaseTrainProjectName
+ '\'' + ", releaseTrainDependencyNames=" + releaseTrainDependencyNames + ", gitOrgUrl='"
+ gitOrgUrl + '\'' + ", projectsToSkip=" + projectsToSkip + ", releaseGroups=" + releaseGroups
+ ", releaseGroupTimeoutInMinutes=" + releaseGroupTimeoutInMinutes + ", releaseGroupThreadCount="
+ releaseGroupThreadCount + '}';
}
@@ -823,21 +818,16 @@ public class ReleaserProperties implements Serializable {
@Override
public String toString() {
return "Git{" + "releaseTrainBomUrl='" + this.releaseTrainBomUrl + '\''
+ ", documentationUrl='" + this.documentationUrl + '\''
+ ", documentationBranch='" + this.documentationBranch + '\''
+ ", releaseTrainBranch='" + this.releaseTrainBranch + '\''
+ ", releaseTrainWikiUrl='" + this.releaseTrainWikiUrl + '\''
+ ", updateDocumentationRepo=" + this.updateDocumentationRepo
+ ", springProjectUrl=" + this.springProjectUrl
+ ", springProjectBranch=" + this.springProjectBranch
+ ", releaseTrainWikiPagePrefix=" + this.releaseTrainWikiPagePrefix
+ ", cloneDestinationDir='" + this.cloneDestinationDir + '\''
+ ", fetchVersionsFromGit=" + this.fetchVersionsFromGit
+ ", numberOfCheckedMilestones=" + this.numberOfCheckedMilestones
+ ", updateSpringGuides=" + this.updateSpringGuides
+ ", updateSpringProject=" + this.updateSpringProject
+ ", sampleUrlsSize=" + this.allTestSampleUrls.size() + '}';
return "Git{" + "releaseTrainBomUrl='" + this.releaseTrainBomUrl + '\'' + ", documentationUrl='"
+ this.documentationUrl + '\'' + ", documentationBranch='" + this.documentationBranch + '\''
+ ", releaseTrainBranch='" + this.releaseTrainBranch + '\'' + ", releaseTrainWikiUrl='"
+ this.releaseTrainWikiUrl + '\'' + ", updateDocumentationRepo=" + this.updateDocumentationRepo
+ ", springProjectUrl=" + this.springProjectUrl + ", springProjectBranch="
+ this.springProjectBranch + ", releaseTrainWikiPagePrefix=" + this.releaseTrainWikiPagePrefix
+ ", cloneDestinationDir='" + this.cloneDestinationDir + '\'' + ", fetchVersionsFromGit="
+ this.fetchVersionsFromGit + ", numberOfCheckedMilestones=" + this.numberOfCheckedMilestones
+ ", updateSpringGuides=" + this.updateSpringGuides + ", updateSpringProject="
+ this.updateSpringProject + ", sampleUrlsSize=" + this.allTestSampleUrls.size() + '}';
}
}
@@ -918,11 +908,10 @@ public class ReleaserProperties implements Serializable {
@Override
public String toString() {
return "Pom{" + "branch='" + this.branch + '\''
+ ", pomWithBootStarterParent='" + this.pomWithBootStarterParent
+ '\'' + ", thisTrainBom='" + this.thisTrainBom + '\''
+ ", bomVersionPattern='" + this.bomVersionPattern + '\''
+ ", ignoredPomRegex=" + this.ignoredPomRegex + '}';
return "Pom{" + "branch='" + this.branch + '\'' + ", pomWithBootStarterParent='"
+ this.pomWithBootStarterParent + '\'' + ", thisTrainBom='" + this.thisTrainBom + '\''
+ ", bomVersionPattern='" + this.bomVersionPattern + '\'' + ", ignoredPomRegex="
+ this.ignoredPomRegex + '}';
}
}
@@ -1039,8 +1028,7 @@ public class ReleaserProperties implements Serializable {
}
@Override
public void setGenerateReleaseTrainDocsCommand(
String generateReleaseTrainDocsCommand) {
public void setGenerateReleaseTrainDocsCommand(String generateReleaseTrainDocsCommand) {
this.generateReleaseTrainDocsCommand = generateReleaseTrainDocsCommand;
}
@@ -1056,12 +1044,10 @@ public class ReleaserProperties implements Serializable {
@Override
public String toString() {
return "Maven{" + "buildCommand='" + this.buildCommand + '\''
+ ", deployCommand='" + this.deployCommand + '\''
+ ", publishDocsCommand=" + this.publishDocsCommand
+ "generateReleaseTrainDocsCommand='"
+ this.generateReleaseTrainDocsCommand + '\'' + ", waitTimeInMinutes="
+ this.waitTimeInMinutes + '}';
return "Maven{" + "buildCommand='" + this.buildCommand + '\'' + ", deployCommand='" + this.deployCommand
+ '\'' + ", publishDocsCommand=" + this.publishDocsCommand + "generateReleaseTrainDocsCommand='"
+ this.generateReleaseTrainDocsCommand + '\'' + ", waitTimeInMinutes=" + this.waitTimeInMinutes
+ '}';
}
}
@@ -1173,8 +1159,7 @@ public class ReleaserProperties implements Serializable {
}
@Override
public void setGenerateReleaseTrainDocsCommand(
String generateReleaseTrainDocsCommand) {
public void setGenerateReleaseTrainDocsCommand(String generateReleaseTrainDocsCommand) {
this.generateReleaseTrainDocsCommand = generateReleaseTrainDocsCommand;
}
@@ -1190,12 +1175,10 @@ public class ReleaserProperties implements Serializable {
@Override
public String toString() {
return "Bash{" + "buildCommand='" + this.buildCommand + '\''
+ ", deployCommand='" + this.deployCommand + '\''
+ ", publishDocsCommand=" + this.publishDocsCommand
+ "generateReleaseTrainDocsCommand='"
+ this.generateReleaseTrainDocsCommand + '\'' + ", waitTimeInMinutes="
+ this.waitTimeInMinutes + '}';
return "Bash{" + "buildCommand='" + this.buildCommand + '\'' + ", deployCommand='" + this.deployCommand
+ '\'' + ", publishDocsCommand=" + this.publishDocsCommand + "generateReleaseTrainDocsCommand='"
+ this.generateReleaseTrainDocsCommand + '\'' + ", waitTimeInMinutes=" + this.waitTimeInMinutes
+ '}';
}
}
@@ -1328,8 +1311,7 @@ public class ReleaserProperties implements Serializable {
}
@Override
public void setGenerateReleaseTrainDocsCommand(
String generateReleaseTrainDocsCommand) {
public void setGenerateReleaseTrainDocsCommand(String generateReleaseTrainDocsCommand) {
this.generateReleaseTrainDocsCommand = generateReleaseTrainDocsCommand;
}
@@ -1347,8 +1329,7 @@ public class ReleaserProperties implements Serializable {
return this.gradlePropsSubstitution;
}
public void setGradlePropsSubstitution(
Map<String, String> gradlePropsSubstitution) {
public void setGradlePropsSubstitution(Map<String, String> gradlePropsSubstitution) {
this.gradlePropsSubstitution = gradlePropsSubstitution;
}
@@ -1364,15 +1345,13 @@ public class ReleaserProperties implements Serializable {
public String toString() {
return new StringJoiner(", ", Gradle.class.getSimpleName() + "[", "]")
.add("gradlePropsSubstitution=" + gradlePropsSubstitution)
.add("ignoredGradleRegex=" + ignoredGradleRegex)
.add("buildCommand='" + buildCommand + "'")
.add("ignoredGradleRegex=" + ignoredGradleRegex).add("buildCommand='" + buildCommand + "'")
.add("deployCommand='" + deployCommand + "'")
.add("deployGuidesCommand='" + deployGuidesCommand + "'")
.add("publishDocsCommand=" + publishDocsCommand)
.add("generateReleaseTrainDocsCommand='"
+ generateReleaseTrainDocsCommand + "'")
.add("systemProperties='" + systemProperties + "'")
.add("waitTimeInMinutes=" + waitTimeInMinutes).toString();
.add("generateReleaseTrainDocsCommand='" + generateReleaseTrainDocsCommand + "'")
.add("systemProperties='" + systemProperties + "'").add("waitTimeInMinutes=" + waitTimeInMinutes)
.toString();
}
}
@@ -1519,8 +1498,8 @@ public class ReleaserProperties implements Serializable {
@Override
public String toString() {
return "Versions{" + "allVersionsFileUrl='" + this.allVersionsFileUrl + '\''
+ ", bomName='" + this.bomName + '\'' + '}';
return "Versions{" + "allVersionsFileUrl='" + this.allVersionsFileUrl + '\'' + ", bomName='" + this.bomName
+ '\'' + '}';
}
}

View File

@@ -41,13 +41,11 @@ import org.springframework.util.StringUtils;
*/
public class ReleaserPropertiesUpdater implements Closeable {
private static final Logger log = LoggerFactory
.getLogger(ReleaserPropertiesUpdater.class);
private static final Logger log = LoggerFactory.getLogger(ReleaserPropertiesUpdater.class);
private static final Map<File, ReleaserProperties> CACHE = new ConcurrentHashMap<>();
public ReleaserProperties updateProperties(ReleaserProperties properties,
File clonedProjectFromOrg) {
public ReleaserProperties updateProperties(ReleaserProperties properties, File clonedProjectFromOrg) {
return CACHE.computeIfAbsent(clonedProjectFromOrg, file -> {
ReleaserProperties props = updatePropertiesFromFile(properties.copy(), file);
props.setWorkingDir(clonedProjectFromOrg.getAbsolutePath());
@@ -56,8 +54,7 @@ public class ReleaserPropertiesUpdater implements Closeable {
});
}
private ReleaserProperties updatePropertiesFromFile(ReleaserProperties copy,
File clonedProjectFromOrg) {
private ReleaserProperties updatePropertiesFromFile(ReleaserProperties copy, File clonedProjectFromOrg) {
File releaserConfig = releaserConfig(clonedProjectFromOrg);
if (releaserConfig.exists()) {
try {
@@ -66,11 +63,8 @@ public class ReleaserPropertiesUpdater implements Closeable {
Properties properties = yamlProcessor.getObject();
ReleaserProperties releaserProperties = new Binder(
new MapConfigurationPropertySource(properties.entrySet().stream()
.collect(Collectors.toMap(e -> e.getKey().toString(),
e -> e.getValue().toString()))))
.bind("releaser",
ReleaserProperties.class)
.get();
.collect(Collectors.toMap(e -> e.getKey().toString(), e -> e.getValue().toString()))))
.bind("releaser", ReleaserProperties.class).get();
log.info("config/releaser.yml found. Will update the current properties");
overrideProperties(releaserProperties, copy);
}
@@ -79,17 +73,14 @@ public class ReleaserPropertiesUpdater implements Closeable {
}
}
else {
log.info(
"No config/releaser.yml found. Will NOT update the current properties");
log.info("No config/releaser.yml found. Will NOT update the current properties");
}
log.info("Updating working directory to [{}]",
clonedProjectFromOrg.getAbsolutePath());
log.info("Updating working directory to [{}]", clonedProjectFromOrg.getAbsolutePath());
copy.setWorkingDir(clonedProjectFromOrg.getAbsolutePath());
return copy;
}
private void overrideProperties(ReleaserProperties fromProject,
ReleaserProperties copy) {
private void overrideProperties(ReleaserProperties fromProject, ReleaserProperties copy) {
overrideCommandIfPresent(fromProject.getMaven(), copy.getMaven());
overrideCommandIfPresent(fromProject.getGradle(), copy.getGradle());
overrideMapIfPresent(() -> fromProject.getGradle().getGradlePropsSubstitution(),
@@ -101,45 +92,36 @@ public class ReleaserPropertiesUpdater implements Closeable {
private void overrideCommandIfPresent(ReleaserProperties.Command fromProject,
ReleaserProperties.Command commandCopy) {
overrideStringIfPresent(fromProject::getBuildCommand,
commandCopy::setBuildCommand);
overrideStringIfPresent(fromProject::getDeployCommand,
commandCopy::setDeployCommand);
overrideStringIfPresent(fromProject::getBuildCommand, commandCopy::setBuildCommand);
overrideStringIfPresent(fromProject::getDeployCommand, commandCopy::setDeployCommand);
overrideStringIfPresent(fromProject::getGenerateReleaseTrainDocsCommand,
commandCopy::setGenerateReleaseTrainDocsCommand);
overrideStringIfPresent(fromProject::getPublishDocsCommand,
commandCopy::setPublishDocsCommand);
overrideStringIfPresent(fromProject::getDeployGuidesCommand,
commandCopy::setDeployGuidesCommand);
overrideStringIfPresent(fromProject::getSystemProperties,
commandCopy::setSystemProperties);
overrideStringIfPresent(fromProject::getPublishDocsCommand, commandCopy::setPublishDocsCommand);
overrideStringIfPresent(fromProject::getDeployGuidesCommand, commandCopy::setDeployGuidesCommand);
overrideStringIfPresent(fromProject::getSystemProperties, commandCopy::setSystemProperties);
}
private void overrideStringIfPresent(Supplier<String> predicate,
Consumer<String> consumer) {
private void overrideStringIfPresent(Supplier<String> predicate, Consumer<String> consumer) {
if (StringUtils.hasText(predicate.get())) {
consumer.accept(predicate.get());
}
}
private void overrideArrayIfPresent(Supplier<String[]> predicate,
Consumer<String[]> consumer) {
private void overrideArrayIfPresent(Supplier<String[]> predicate, Consumer<String[]> consumer) {
String[] strings = predicate.get();
if (strings.length > 0) {
consumer.accept(strings);
}
}
private void overrideMapIfPresent(Supplier<Map<String, String>> predicate,
Consumer<Map<String, String>> consumer) {
private void overrideMapIfPresent(Supplier<Map<String, String>> predicate, Consumer<Map<String, String>> consumer) {
Map<String, String> strings = predicate.get();
if (!strings.isEmpty()) {
consumer.accept(strings);
}
}
private void overrideListIfPresent(Supplier<List<String>> predicate,
Consumer<List<String>> consumer) {
private void overrideListIfPresent(Supplier<List<String>> predicate, Consumer<List<String>> consumer) {
List<String> strings = predicate.get();
if (!strings.isEmpty()) {
consumer.accept(strings);

View File

@@ -39,15 +39,13 @@ class CompositeBomParser implements BomParser {
}
private BomParser firstMatching(File thisProjectRoot) {
return this.parsers.stream().filter(b -> b.isApplicable(thisProjectRoot))
.findFirst().orElseThrow(
() -> new IllegalStateException("Can't find a matching parser"));
return this.parsers.stream().filter(b -> b.isApplicable(thisProjectRoot)).findFirst()
.orElseThrow(() -> new IllegalStateException("Can't find a matching parser"));
}
@Override
public List<CustomBomParser> customBomParsers() {
return this.parsers.stream().flatMap(b -> b.customBomParsers().stream())
.collect(Collectors.toList());
return this.parsers.stream().flatMap(b -> b.customBomParsers().stream()).collect(Collectors.toList());
}
}

View File

@@ -28,8 +28,7 @@ import releaser.internal.project.Project;
*/
public interface CustomBomParser {
CustomBomParser NO_OP = (thisProjectRoot,
properties) -> VersionsFromBom.EMPTY_VERSION;
CustomBomParser NO_OP = (thisProjectRoot, properties) -> VersionsFromBom.EMPTY_VERSION;
/**
* When parsing a part of the BOM pom, one can add custom logic to perform project
@@ -48,8 +47,7 @@ public interface CustomBomParser {
* @param version - version of the project
* @return - a new collection with the modified versions from bom
*/
default Set<Project> setVersion(Set<Project> projects, String projectName,
String version) {
default Set<Project> setVersion(Set<Project> projects, String projectName, String version) {
return new LinkedHashSet<>(projects);
}

View File

@@ -33,8 +33,7 @@ class GradleBomParser implements BomParser {
private final GradleProjectNameExtractor extractor = new GradleProjectNameExtractor();
GradleBomParser(ReleaserProperties releaserProperties,
List<CustomBomParser> customParsers) {
GradleBomParser(ReleaserProperties releaserProperties, List<CustomBomParser> customParsers) {
this.properties = releaserProperties;
this.customParsers = customParsers;
}
@@ -55,11 +54,9 @@ class GradleBomParser implements BomParser {
return VersionsFromBom.EMPTY_VERSION;
}
Properties properties = loadProps(gradleProperties);
final Map<String, String> substitution = this.properties.getGradle()
.getGradlePropsSubstitution();
VersionsFromBom versionsFromBom = new VersionsFromBomBuilder()
.thisProjectRoot(thisProjectRoot).releaserProperties(this.properties)
.parsers(this.customParsers).retrieveFromBom();
final Map<String, String> substitution = this.properties.getGradle().getGradlePropsSubstitution();
VersionsFromBom versionsFromBom = new VersionsFromBomBuilder().thisProjectRoot(thisProjectRoot)
.releaserProperties(this.properties).parsers(this.customParsers).retrieveFromBom();
properties.forEach((key, value) -> {
String projectName = this.extractor.projectName(substitution, key);
versionsFromBom.setVersion(projectName, value.toString());

View File

@@ -22,8 +22,7 @@ import java.util.regex.Pattern;
class GradleProjectNameExtractor {
private static final Pattern VERSION_PATTERN = Pattern
.compile("^([a-zA-Z0-9]+)Version$");
private static final Pattern VERSION_PATTERN = Pattern.compile("^([a-zA-Z0-9]+)Version$");
String projectName(Map<String, String> substitution, Object key) {
String projectName = key.toString();

View File

@@ -55,18 +55,16 @@ public class GradleUpdater {
* @param versionFromBom - version for the project from Spring Cloud Release
* @param assertVersions - should snapshots / milestone / rc presence be asserted
*/
public void updateProjectFromReleaseTrain(ReleaserProperties properties,
File projectRoot, Projects projects, ProjectVersion versionFromBom,
boolean assertVersions) {
processAllGradleProps(properties, projectRoot, projects, versionFromBom,
assertVersions);
public void updateProjectFromReleaseTrain(ReleaserProperties properties, File projectRoot, Projects projects,
ProjectVersion versionFromBom, boolean assertVersions) {
processAllGradleProps(properties, projectRoot, projects, versionFromBom, assertVersions);
}
private void processAllGradleProps(ReleaserProperties properties, File projectRoot,
Projects projects, ProjectVersion versionFromBom, boolean assertVersions) {
private void processAllGradleProps(ReleaserProperties properties, File projectRoot, Projects projects,
ProjectVersion versionFromBom, boolean assertVersions) {
try {
Files.walkFileTree(projectRoot.toPath(), new GradlePropertiesWalker(
properties, projects, versionFromBom, assertVersions));
Files.walkFileTree(projectRoot.toPath(),
new GradlePropertiesWalker(properties, projects, versionFromBom, assertVersions));
}
catch (IOException e) {
throw new IllegalStateException(e);
@@ -89,15 +87,13 @@ public class GradleUpdater {
private final GradleProjectNameExtractor extractor = new GradleProjectNameExtractor();
private GradlePropertiesWalker(ReleaserProperties properties, Projects projects,
ProjectVersion versionFromBom, boolean assertVersions) {
private GradlePropertiesWalker(ReleaserProperties properties, Projects projects, ProjectVersion versionFromBom,
boolean assertVersions) {
this.properties = properties;
this.projects = projects;
List<Pattern> unacceptableVersionPatterns = versionFromBom
.unacceptableVersionPatterns();
List<Pattern> unacceptableVersionPatterns = versionFromBom.unacceptableVersionPatterns();
this.unacceptableVersionPatterns = unacceptableVersionPatterns;
this.skipVersionAssert = !assertVersions
|| unacceptableVersionPatterns.isEmpty();
this.skipVersionAssert = !assertVersions || unacceptableVersionPatterns.isEmpty();
this.assertVersions = assertVersions;
}
@@ -106,20 +102,15 @@ public class GradleUpdater {
File file = path.toFile();
if (GRADLE_PROPERTIES.equals(file.getName())) {
if (pathIgnored(file)) {
log.debug(
"Ignoring file [{}] since it's on a list of patterns to ignore",
file);
log.debug("Ignoring file [{}] since it's on a list of patterns to ignore", file);
return FileVisitResult.CONTINUE;
}
String parentName = file.getParentFile().getName();
log.info("Will process the file [{}] and update its gradle properties",
file);
log.info("Will process the file [{}] and update its gradle properties", file);
final String fileContents = asString(path);
final AtomicReference<String> changedString = new AtomicReference<>(
fileContents);
final AtomicReference<String> changedString = new AtomicReference<>(fileContents);
Properties props = loadProps(file);
final Map<String, String> substitution = this.properties.getGradle()
.getGradlePropsSubstitution();
final Map<String, String> substitution = this.properties.getGradle().getGradlePropsSubstitution();
props.forEach((key, value1) -> {
String projectName = projectName(parentName, substitution, key);
if (!this.projects.containsProject(projectName)) {
@@ -130,10 +121,8 @@ public class GradleUpdater {
}
ProjectVersion value = this.projects.forName(projectName);
if (!value.version.equalsIgnoreCase(value1.toString())) {
log.info("Replacing [{}->{}] with [{}->{}]", key, value1, key,
value);
changedString.set(changedString.get().replace(key + "=" + value1,
key + "=" + value));
log.info("Replacing [{}->{}] with [{}->{}]", key, value1, key, value);
changedString.set(changedString.get().replace(key + "=" + value1, key + "=" + value));
}
});
storeString(path, changedString.get());
@@ -142,8 +131,7 @@ public class GradleUpdater {
return FileVisitResult.CONTINUE;
}
private String projectName(String parentName, Map<String, String> substitution,
Object key) {
private String projectName(String parentName, Map<String, String> substitution, Object key) {
// version -> current project version
if (key.equals("version")) {
return parentName;
@@ -155,21 +143,18 @@ public class GradleUpdater {
if (this.assertVersions && !this.skipVersionAssert) {
log.debug(
"Update should check if no wrong versions remained in the gradle prop. List of wrong patterns: {}",
this.unacceptableVersionPatterns.stream().map(Pattern::pattern)
.collect(Collectors.toList()));
this.unacceptableVersionPatterns.stream().map(Pattern::pattern).collect(Collectors.toList()));
Scanner scanner = new Scanner(asString(path));
int lineNumber = 0;
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
lineNumber++;
Pattern matchingPattern = this.unacceptableVersionPatterns.stream()
.filter(pattern -> pattern.matcher(line).matches())
.findFirst().orElse(null);
.filter(pattern -> pattern.matcher(line).matches()).findFirst().orElse(null);
if (matchingPattern != null) {
throw new IllegalStateException("The file [" + path
+ "] matches the [ " + matchingPattern.pattern()
+ "] pattern in line number [" + lineNumber + "]\n\n"
+ line);
throw new IllegalStateException(
"The file [" + path + "] matches the [ " + matchingPattern.pattern()
+ "] pattern in line number [" + lineNumber + "]\n\n" + line);
}
}
log.info("No invalid versions remained in the gradle properties");
@@ -178,8 +163,8 @@ public class GradleUpdater {
private boolean pathIgnored(File file) {
String path = file.getPath();
return this.assertVersions && this.properties.getGradle()
.getIgnoredGradleRegex().stream().anyMatch(path::matches);
return this.assertVersions
&& this.properties.getGradle().getIgnoredGradleRegex().stream().anyMatch(path::matches);
}
private Properties loadProps(File file) {

View File

@@ -50,10 +50,8 @@ class MavenBomParser implements BomParser {
MavenBomParser(ReleaserProperties properties, List<CustomBomParser> customParsers) {
this.thisTrainBomLocation = properties.getPom().getThisTrainBom();
this.versionPattern = StringUtils
.hasText(properties.getPom().getBomVersionPattern())
? Pattern.compile(properties.getPom().getBomVersionPattern())
: Pattern.compile(".*");
this.versionPattern = StringUtils.hasText(properties.getPom().getBomVersionPattern())
? Pattern.compile(properties.getPom().getBomVersionPattern()) : Pattern.compile(".*");
this.properties = properties;
this.customParsers = customParsers;
}
@@ -71,13 +69,11 @@ class MavenBomParser implements BomParser {
if (model == null) {
return VersionsFromBom.EMPTY_VERSION;
}
Set<Project> projects = model.getProperties().entrySet().stream()
.filter(propertyMatchesVersionPattern()).map(toProject())
.collect(Collectors.toSet());
Set<Project> projects = model.getProperties().entrySet().stream().filter(propertyMatchesVersionPattern())
.map(toProject()).collect(Collectors.toSet());
String releaseTrainProjectVersion = model.getVersion();
projects.add(
new Project(this.properties.getMetaRelease().getReleaseTrainProjectName(),
releaseTrainProjectVersion));
new Project(this.properties.getMetaRelease().getReleaseTrainProjectName(), releaseTrainProjectVersion));
// @formatter:off
return new VersionsFromBomBuilder()
.thisProjectRoot(thisProjectRoot)

View File

@@ -75,13 +75,10 @@ class PomUpdater {
}
String artifactId = artifactId(model);
if (!versionsFromBom.shouldBeUpdated(artifactId)) {
log.info(
"Skipping project [{}] since it's not on the list of projects to update",
model.getArtifactId());
log.info("Skipping project [{}] since it's not on the list of projects to update", model.getArtifactId());
return false;
}
log.info("Project [{}] will have its dependencies updated",
model.getArtifactId());
log.info("Project [{}] will have its dependencies updated", model.getArtifactId());
return true;
}
@@ -95,8 +92,7 @@ class PomUpdater {
return false;
}
boolean plugins = model.getBuild().getPlugins().stream()
.filter(plugin -> "maven-deploy-plugin"
.equalsIgnoreCase(plugin.getArtifactId()))
.filter(plugin -> "maven-deploy-plugin".equalsIgnoreCase(plugin.getArtifactId()))
.map(this::skipFromConfiguration).findFirst().orElse(false);
if (plugins) {
return true;
@@ -105,8 +101,7 @@ class PomUpdater {
return false;
}
return model.getBuild().getPluginManagement().getPlugins().stream()
.filter(plugin -> "maven-deploy-plugin"
.equalsIgnoreCase(plugin.getArtifactId()))
.filter(plugin -> "maven-deploy-plugin".equalsIgnoreCase(plugin.getArtifactId()))
.map(this::skipFromConfiguration).findFirst().orElse(false);
}
@@ -131,8 +126,7 @@ class PomUpdater {
if (!parent) {
return model.getArtifactId();
}
return model.getArtifactId().substring(0,
model.getArtifactId().indexOf("-parent"));
return model.getArtifactId().substring(0, model.getArtifactId().indexOf("-parent"));
}
ModelWrapper readModel(File pom) {
@@ -146,14 +140,11 @@ class PomUpdater {
* @param versionsFromBom - versions to update
* @return updated model
*/
ModelWrapper updateModel(ModelWrapper rootPom, File pom,
VersionsFromBom versionsFromBom) {
ModelWrapper updateModel(ModelWrapper rootPom, File pom, VersionsFromBom versionsFromBom) {
Model model = PomReader.readPom(pom);
List<VersionChange> sourceChanges = new ArrayList<>();
sourceChanges = updateParentIfPossible(rootPom, versionsFromBom, model,
sourceChanges);
sourceChanges = updateVersionIfPossible(rootPom, versionsFromBom, model,
sourceChanges);
sourceChanges = updateParentIfPossible(rootPom, versionsFromBom, model, sourceChanges);
sourceChanges = updateVersionIfPossible(rootPom, versionsFromBom, model, sourceChanges);
return new ModelWrapper(model, sourceChanges, versionsFromBom, pom);
}
@@ -162,8 +153,7 @@ class PomUpdater {
* changes in the model.
* @return - the pom file
*/
File overwritePomIfDirty(ModelWrapper updatedPomModel,
VersionsFromBom versionsFromBom, File pom) {
File overwritePomIfDirty(ModelWrapper updatedPomModel, VersionsFromBom versionsFromBom, File pom) {
if (updatedPomModel.isDirty()) {
log.debug("There were changes in the pom so file will be overridden");
this.pomWriter.write(updatedPomModel, versionsFromBom, pom);
@@ -172,9 +162,8 @@ class PomUpdater {
return pom;
}
private List<VersionChange> updateParentIfPossible(ModelWrapper wrapper,
VersionsFromBom versionsFromBom, Model model,
List<VersionChange> sourceChanges) {
private List<VersionChange> updateParentIfPossible(ModelWrapper wrapper, VersionsFromBom versionsFromBom,
Model model, List<VersionChange> sourceChanges) {
String rootProjectName = wrapper.projectName();
List<VersionChange> changes = new ArrayList<>(sourceChanges);
if (model.getParent() == null || isEmpty(model.getParent().getVersion())) {
@@ -183,8 +172,7 @@ class PomUpdater {
}
String parentGroupId = model.getParent().getGroupId();
String parentArtifactId = model.getParent().getArtifactId();
log.debug("Searching for a version of parent [{}:{}]", parentGroupId,
parentArtifactId);
log.debug("Searching for a version of parent [{}:{}]", parentGroupId, parentArtifactId);
String oldVersion = model.getParent().getVersion();
String version = versionsFromBom.versionForProject(parentArtifactId);
log.debug("Found version is [{}]", version);
@@ -193,38 +181,32 @@ class PomUpdater {
version = versionsFromBom.versionForProject(rootProjectName);
}
else {
log.warn("There is no info on the [{}:{}] version", parentGroupId,
parentArtifactId);
log.warn("There is no info on the [{}:{}] version", parentGroupId, parentArtifactId);
return changes;
}
}
if (oldVersion.equals(version)) {
log.debug(
"Won't update the version of parent [{}:{}] since you're already using the proper one",
log.debug("Won't update the version of parent [{}:{}] since you're already using the proper one",
parentGroupId, parentArtifactId);
return changes;
}
log.info("Setting version of parent [{}] to [{}] for module [{}]",
parentArtifactId, version, model.getArtifactId());
log.info("Setting version of parent [{}] to [{}] for module [{}]", parentArtifactId, version,
model.getArtifactId());
if (hasText(version)) {
changes.add(new VersionChange(parentGroupId, parentArtifactId, oldVersion,
version));
changes.add(new VersionChange(parentGroupId, parentArtifactId, oldVersion, version));
}
return changes;
}
private List<VersionChange> updateVersionIfPossible(ModelWrapper wrapper,
VersionsFromBom versionsFromBom, Model model,
List<VersionChange> sourceChanges) {
private List<VersionChange> updateVersionIfPossible(ModelWrapper wrapper, VersionsFromBom versionsFromBom,
Model model, List<VersionChange> sourceChanges) {
String rootProjectName = wrapper.projectName();
String rootProjectGroupId = wrapper.groupId();
List<VersionChange> changes = new ArrayList<>(sourceChanges);
String groupId = groupId(model);
String artifactId = model.getArtifactId();
if (model.getGroupId() != null
&& !model.getGroupId().equals(rootProjectGroupId)) {
log.info(
"Will not update project [{}] since its group id [{}] is not equal the parent group id [{}]",
if (model.getGroupId() != null && !model.getGroupId().equals(rootProjectGroupId)) {
log.info("Will not update project [{}] since its group id [{}] is not equal the parent group id [{}]",
model.getArtifactId(), model.getGroupId(), rootProjectGroupId);
return changes;
}
@@ -233,15 +215,13 @@ class PomUpdater {
String version = versionsFromBom.versionForProject(rootProjectName);
log.debug("Found version is [{}]", version);
if (isEmpty(version) || isEmpty(model.getVersion())) {
log.debug(
"There was no version set for project [{}], skipping version setting for module [{}]",
log.debug("There was no version set for project [{}], skipping version setting for module [{}]",
rootProjectName, model.getArtifactId());
return changes;
}
if (oldVersion.equals(version)) {
log.debug(
"Won't update the version of module [{}]:[{}] since you're already using the proper one",
groupId, artifactId);
log.debug("Won't update the version of module [{}]:[{}] since you're already using the proper one", groupId,
artifactId);
return changes;
}
log.info("Setting [{}] version to [{}]", artifactId, version);
@@ -271,8 +251,7 @@ class ModelWrapper {
final File rootFile;
ModelWrapper(Model model, List<VersionChange> sourceChanges,
VersionsFromBom versionsFromBom, File rootFile) {
ModelWrapper(Model model, List<VersionChange> sourceChanges, VersionsFromBom versionsFromBom, File rootFile) {
this.model = model;
this.versionsFromBom = versionsFromBom;
this.sourceChanges.addAll(sourceChanges);
@@ -303,8 +282,7 @@ class ModelWrapper {
}
boolean isDirty() {
return !this.sourceChanges.isEmpty()
|| this.versionsFromBom.shouldSetProperty(this.model.getProperties());
return !this.sourceChanges.isEmpty() || this.versionsFromBom.shouldSetProperty(this.model.getProperties());
}
}
@@ -322,17 +300,13 @@ class PomWriter {
LoggerToMavenLog loggerToMavenLog = new LoggerToMavenLog(PomWriter.log);
versionChangerFactory.setLog(loggerToMavenLog);
versionChangerFactory.setModel(wrapper.model);
log.info(
"Applying version / parent / plugin / project changes to the pom [{}]",
pom);
VersionChanger changer = versionChangerFactory.newVersionChanger(true, true,
true, true);
log.info("Applying version / parent / plugin / project changes to the pom [{}]", pom);
VersionChanger changer = versionChangerFactory.newVersionChanger(true, true, true, true);
for (VersionChange versionChange : wrapper.sourceChanges) {
changer.apply(versionChange);
}
log.debug("Applying properties changes to the pom [{}]", pom);
new PropertyVersionChanger(wrapper, versionsFromBom, parsedPom,
loggerToMavenLog).apply(null);
new PropertyVersionChanger(wrapper, versionsFromBom, parsedPom, loggerToMavenLog).apply(null);
try (BufferedWriter bw = new BufferedWriter(new FileWriter(pom))) {
bw.write(input.toString());
}
@@ -370,15 +344,15 @@ class PropertyVersionChanger extends AbstractVersionChanger {
private final PropertyStorer propertyStorer;
PropertyVersionChanger(ModelWrapper wrapper, VersionsFromBom versionsFromBom,
ModifiedPomXMLEventReader pom, Log log) {
PropertyVersionChanger(ModelWrapper wrapper, VersionsFromBom versionsFromBom, ModifiedPomXMLEventReader pom,
Log log) {
super(wrapper.model, pom, log);
this.versionsFromBom = versionsFromBom;
this.propertyStorer = new PropertyStorer(log, pom);
}
PropertyVersionChanger(ModelWrapper wrapper, VersionsFromBom versionsFromBom,
ModifiedPomXMLEventReader pom, Log log, PropertyStorer propertyStorer) {
PropertyVersionChanger(ModelWrapper wrapper, VersionsFromBom versionsFromBom, ModifiedPomXMLEventReader pom,
Log log, PropertyStorer propertyStorer) {
super(wrapper.model, pom, log);
this.versionsFromBom = versionsFromBom;
this.propertyStorer = propertyStorer;
@@ -417,8 +391,7 @@ class PropertyStorer {
void setPropertyVersionIfApplicable(Project project) {
String propertyName = propertyName(project);
if (setPropertyVersion(propertyName, project.version)) {
this.log.info("Updating property [" + propertyName + "] to version ["
+ project.version + "]");
this.log.info("Updating property [" + propertyName + "] to version [" + project.version + "]");
}
}
@@ -429,8 +402,7 @@ class PropertyStorer {
private boolean setPropertyVersion(String propertyName, String version) {
try {
if (StringUtils.isEmpty(version)) {
this.log.warn(
"Version for [" + propertyName + "] is empty. Will not set it");
this.log.warn("Version for [" + propertyName + "] is empty. Will not set it");
return false;
}
return PomHelper.setPropertyVersion(this.pom, null, propertyName, version);

View File

@@ -46,8 +46,7 @@ import releaser.internal.project.Projects;
*/
public class ProjectPomUpdater implements Closeable {
private static final List<String> IGNORED_SNAPSHOT_LINE_PATTERNS = Arrays.asList(
"^.*replace=.*$",
private static final List<String> IGNORED_SNAPSHOT_LINE_PATTERNS = Arrays.asList("^.*replace=.*$",
// issue [#80]
"^[\\s]*<!--.*-->.*$");
@@ -79,8 +78,7 @@ public class ProjectPomUpdater implements Closeable {
* @return projects retrieved from the release train bom
*/
public Projects retrieveVersionsFromReleaseTrainBom() {
return retrieveVersionsFromReleaseTrainBom(this.properties.getPom().getBranch(),
UPDATE_FIXED_VERSIONS);
return retrieveVersionsFromReleaseTrainBom(this.properties.getPom().getBranch(), UPDATE_FIXED_VERSIONS);
}
/**
@@ -92,12 +90,10 @@ public class ProjectPomUpdater implements Closeable {
* @return projects retrieved from the release train bom
*/
// TODO: I don't like this flag but don't have a better idea
public Projects retrieveVersionsFromReleaseTrainBom(String branch,
boolean updateFixedVersions) {
public Projects retrieveVersionsFromReleaseTrainBom(String branch, boolean updateFixedVersions) {
VersionsFromBom versionsFromBom = cachedVersionFromBom(branch);
if (updateFixedVersions) {
log.info("Will update the following versions manually [{}]",
this.properties.getFixedVersions());
log.info("Will update the following versions manually [{}]", this.properties.getFixedVersions());
this.properties.getFixedVersions().forEach(versionsFromBom::setVersion);
}
log.info("Retrieved the following versions\n{}", versionsFromBom);
@@ -121,14 +117,12 @@ public class ProjectPomUpdater implements Closeable {
*/
public Projects fixedVersions() {
Set<Project> projects = this.properties.getFixedVersions().entrySet().stream()
.map(entry -> new Project(entry.getKey(), entry.getValue()))
.collect(Collectors.toSet());
.map(entry -> new Project(entry.getKey(), entry.getValue())).collect(Collectors.toSet());
if (log.isDebugEnabled()) {
log.debug("Will apply the following fixed versions {}", projects);
}
return new VersionsFromBomBuilder().releaserProperties(this.properties)
.parsers(compositeBomParser().customBomParsers()).projects(projects)
.merged().toProjectVersions();
.parsers(compositeBomParser().customBomParsers()).projects(projects).merged().toProjectVersions();
}
/**
@@ -143,9 +137,8 @@ public class ProjectPomUpdater implements Closeable {
*/
public void updateProjectFromReleaseTrain(File projectRoot, Projects projects,
ProjectVersion versionFromReleaseTrain, boolean assertVersions) {
VersionsFromBom versionsFromBom = new VersionsFromBomBuilder()
.thisProjectRoot(projectRoot).releaserProperties(this.properties)
.projects(projects.asProjects()).merged();
VersionsFromBom versionsFromBom = new VersionsFromBomBuilder().thisProjectRoot(projectRoot)
.releaserProperties(this.properties).projects(projects.asProjects()).merged();
if (!this.pomUpdater.shouldProjectBeUpdated(projectRoot, versionsFromBom)) {
log.debug("Skipping project updating");
return;
@@ -153,16 +146,16 @@ public class ProjectPomUpdater implements Closeable {
updatePoms(projectRoot, versionsFromBom, versionFromReleaseTrain, assertVersions);
}
private void updatePoms(File projectRoot, VersionsFromBom projects,
ProjectVersion versionFromScRelease, boolean assertVersions) {
private void updatePoms(File projectRoot, VersionsFromBom projects, ProjectVersion versionFromScRelease,
boolean assertVersions) {
File rootPom = new File(projectRoot, "pom.xml");
if (!rootPom.exists()) {
log.info("No pom.xml present, skipping!");
return;
}
ModelWrapper rootPomModel = this.pomUpdater.readModel(rootPom);
processAllPoms(projectRoot, new PomWalker(rootPomModel, projects, this.pomUpdater,
this.properties, versionFromScRelease, assertVersions));
processAllPoms(projectRoot, new PomWalker(rootPomModel, projects, this.pomUpdater, this.properties,
versionFromScRelease, assertVersions));
}
private void processAllPoms(File projectRoot, PomWalker pomWalker) {
@@ -197,18 +190,15 @@ public class ProjectPomUpdater implements Closeable {
private final List<Pattern> unacceptableVersionPatterns;
private PomWalker(ModelWrapper rootPom, VersionsFromBom projects,
PomUpdater pomUpdater, ReleaserProperties properties,
ProjectVersion versionFromScRelease, boolean assertVersions) {
private PomWalker(ModelWrapper rootPom, VersionsFromBom projects, PomUpdater pomUpdater,
ReleaserProperties properties, ProjectVersion versionFromScRelease, boolean assertVersions) {
this.rootPom = rootPom;
this.versionsFromBom = projects;
this.pomUpdater = pomUpdater;
this.properties = properties;
List<Pattern> unacceptableVersionPatterns = versionFromScRelease
.unacceptableVersionPatterns();
List<Pattern> unacceptableVersionPatterns = versionFromScRelease.unacceptableVersionPatterns();
this.unacceptableVersionPatterns = unacceptableVersionPatterns;
this.skipVersionAssert = !assertVersions
|| unacceptableVersionPatterns.isEmpty();
this.skipVersionAssert = !assertVersions || unacceptableVersionPatterns.isEmpty();
this.assertVersions = assertVersions;
}
@@ -217,28 +207,21 @@ public class ProjectPomUpdater implements Closeable {
File file = path.toFile();
if (POM_XML.equals(file.getName())) {
if (pathIgnored(file)) {
log.debug(
"Ignoring file [{}] since it's on a list of patterns to ignore",
file);
log.debug("Ignoring file [{}] since it's on a list of patterns to ignore", file);
return FileVisitResult.CONTINUE;
}
ModelWrapper model = this.pomUpdater.updateModel(this.rootPom, file,
this.versionsFromBom);
ModelWrapper model = this.pomUpdater.updateModel(this.rootPom, file, this.versionsFromBom);
this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, file);
if (this.assertVersions && !this.skipVersionAssert
&& !this.pomUpdater.hasSkipDeployment(model.model)) {
log.debug(
"Update is a non-snapshot one. Checking if no snapshot versions remained in the pom");
if (this.assertVersions && !this.skipVersionAssert && !this.pomUpdater.hasSkipDeployment(model.model)) {
log.debug("Update is a non-snapshot one. Checking if no snapshot versions remained in the pom");
String text = asString(path);
Scanner scanner = new Scanner(text);
int lineNumber = 0;
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
lineNumber++;
Pattern matchingPattern = this.unacceptableVersionPatterns
.stream()
.filter(pattern -> IGNORED_SNAPSHOT_LINE_PATTERNS.stream()
.noneMatch(line::matches)
Pattern matchingPattern = this.unacceptableVersionPatterns.stream()
.filter(pattern -> IGNORED_SNAPSHOT_LINE_PATTERNS.stream().noneMatch(line::matches)
&& !line.contains(SPECIAL_LINE_IGNORING_COMMENT)
&& pattern.matcher(line).lookingAt())
.findFirst().orElse(null);
@@ -246,10 +229,9 @@ public class ProjectPomUpdater implements Closeable {
if (log.isDebugEnabled()) {
log.debug("File text \n" + text);
}
throw new IllegalStateException("The file [" + path
+ "] matches the [ " + matchingPattern.pattern()
+ "] pattern in line number [" + lineNumber + "]\n\n"
+ line);
throw new IllegalStateException(
"The file [" + path + "] matches the [ " + matchingPattern.pattern()
+ "] pattern in line number [" + lineNumber + "]\n\n" + line);
}
}
log.info("No invalid versions remained in the pom");
@@ -260,8 +242,8 @@ public class ProjectPomUpdater implements Closeable {
private boolean pathIgnored(File file) {
String path = file.getPath();
return this.assertVersions && this.properties.getPom().getIgnoredPomRegex()
.stream().anyMatch(path::matches);
return this.assertVersions
&& this.properties.getPom().getIgnoredPomRegex().stream().anyMatch(path::matches);
}
private String asString(Path path) {

View File

@@ -56,15 +56,13 @@ public class VersionsFromBom {
this.parser = parser;
}
VersionsFromBom(ReleaserProperties releaserProperties, CustomBomParser parser,
Set<Project> projects) {
VersionsFromBom(ReleaserProperties releaserProperties, CustomBomParser parser, Set<Project> projects) {
this.properties = releaserProperties;
this.parser = parser;
projects.forEach(project -> setVersion(project.name, project.version));
}
VersionsFromBom(ReleaserProperties releaserProperties, CustomBomParser parser,
VersionsFromBom... projects) {
VersionsFromBom(ReleaserProperties releaserProperties, CustomBomParser parser, VersionsFromBom... projects) {
this.properties = releaserProperties;
this.parser = parser;
Arrays.stream(projects).forEach(p -> this.projects.addAll(p.projects));
@@ -84,23 +82,20 @@ public class VersionsFromBom {
}
public String versionForProject(String projectName) {
return this.projects.stream().filter(project -> nameMatches(projectName, project))
.findFirst().orElse(Project.EMPTY_PROJECT).version;
return this.projects.stream().filter(project -> nameMatches(projectName, project)).findFirst()
.orElse(Project.EMPTY_PROJECT).version;
}
public boolean shouldBeUpdated(String projectName) {
return this.projects.stream()
.anyMatch(project -> nameMatches(projectName, project));
return this.projects.stream().anyMatch(project -> nameMatches(projectName, project));
}
public boolean shouldSetProperty(Properties properties) {
return this.projects.stream()
.anyMatch(project -> properties.containsKey(project.name + ".version"));
return this.projects.stream().anyMatch(project -> properties.containsKey(project.name + ".version"));
}
public Projects toProjectVersions() {
return this.projects.stream()
.map(project -> new ProjectVersion(project.name, project.version))
return this.projects.stream().map(project -> new ProjectVersion(project.name, project.version))
.collect(Collectors.toCollection(Projects::new));
}
@@ -114,23 +109,18 @@ public class VersionsFromBom {
}
boolean parent = matchesNameWithSuffix(projectName, "-parent", project);
boolean bomArtifactId = comparisonOfBomArtifactAndParent(projectName, project);
return !bomArtifactId && (parent
|| matchesNameWithSuffix(projectName, "-dependencies", project));
return !bomArtifactId && (parent || matchesNameWithSuffix(projectName, "-dependencies", project));
}
private boolean comparisonOfBomArtifactAndParent(String projectName,
Project project) {
return artifactOrParent(projectName, project.name)
|| artifactOrParent(project.name, projectName);
private boolean comparisonOfBomArtifactAndParent(String projectName, Project project) {
return artifactOrParent(projectName, project.name) || artifactOrParent(project.name, projectName);
}
private boolean artifactOrParent(String projectName, String otherProjectName) {
return projectName.equals(dependenciesArtifactId())
&& otherProjectName.equals(dependenciesParentArtifactId());
return projectName.equals(dependenciesArtifactId()) && otherProjectName.equals(dependenciesParentArtifactId());
}
private boolean matchesNameWithSuffix(String projectName, String suffix,
Project project) {
private boolean matchesNameWithSuffix(String projectName, String suffix, Project project) {
boolean containsSuffix = projectName.endsWith(suffix);
if (!containsSuffix) {
return false;
@@ -157,8 +147,7 @@ public class VersionsFromBom {
}
private List<String> bomVersionProjectNames() {
List<String> names = new ArrayList<>(
this.properties.getMetaRelease().getReleaseTrainDependencyNames());
List<String> names = new ArrayList<>(this.properties.getMetaRelease().getReleaseTrainDependencyNames());
names.add(this.properties.getMetaRelease().getReleaseTrainProjectName());
return names;
}
@@ -184,8 +173,7 @@ public class VersionsFromBom {
@Override
public String toString() {
return "Projects=\n\t" + this.projects.stream().map(Object::toString)
.collect(Collectors.joining("\n\t"));
return "Projects=\n\t" + this.projects.stream().map(Object::toString).collect(Collectors.joining("\n\t"));
}
}

View File

@@ -42,8 +42,7 @@ public class VersionsFromBomBuilder {
return this;
}
public VersionsFromBomBuilder releaserProperties(
ReleaserProperties releaserProperties) {
public VersionsFromBomBuilder releaserProperties(ReleaserProperties releaserProperties) {
this.releaserProperties = releaserProperties;
return this;
}
@@ -68,8 +67,7 @@ public class VersionsFromBomBuilder {
if (!this.projects.isEmpty()) {
return new VersionsFromBom(this.releaserProperties, bomParser, this.projects);
}
return new VersionsFromBom(this.releaserProperties, bomParser,
this.versionsFromBom);
return new VersionsFromBom(this.releaserProperties, bomParser, this.versionsFromBom);
}
public VersionsFromBom retrieveFromBom() {
@@ -77,13 +75,11 @@ public class VersionsFromBomBuilder {
CustomBomParser bomParser = parser();
VersionsFromBom versionsFromBom = versionsFromBom(bomParser);
VersionsFromBom customParsing = customParsing(thisProjectRoot);
return new VersionsFromBom(this.releaserProperties, bomParser, versionsFromBom,
customParsing);
return new VersionsFromBom(this.releaserProperties, bomParser, versionsFromBom, customParsing);
}
private File thisProjectRoot() {
return this.thisProjectRoot != null ? this.thisProjectRoot
: new File(this.releaserProperties.getWorkingDir());
return this.thisProjectRoot != null ? this.thisProjectRoot : new File(this.releaserProperties.getWorkingDir());
}
private CustomBomParser parser() {
@@ -95,20 +91,16 @@ public class VersionsFromBomBuilder {
return new VersionsFromBom(this.releaserProperties, bomParser, this.projects);
}
else if (this.versionsFromBom.length != 0) {
return new VersionsFromBom(this.releaserProperties, bomParser,
this.versionsFromBom);
return new VersionsFromBom(this.releaserProperties, bomParser, this.versionsFromBom);
}
return new VersionsFromBom(this.releaserProperties, bomParser);
}
private VersionsFromBom customParsing(File thisProjectRoot) {
return this.parsers.stream()
.map(p -> p.parseBom(thisProjectRoot, this.releaserProperties))
.reduce((versionsFromBom,
versionsFromBom2) -> new VersionsFromBomBuilder()
.parsers(this.parsers).thisProjectRoot(thisProjectRoot)
.releaserProperties(this.releaserProperties)
.projects(versionsFromBom, versionsFromBom2).merged())
return this.parsers.stream().map(p -> p.parseBom(thisProjectRoot, this.releaserProperties))
.reduce((versionsFromBom, versionsFromBom2) -> new VersionsFromBomBuilder().parsers(this.parsers)
.thisProjectRoot(thisProjectRoot).releaserProperties(this.releaserProperties)
.projects(versionsFromBom, versionsFromBom2).merged())
.orElse(VersionsFromBom.EMPTY_VERSION);
}

View File

@@ -32,14 +32,14 @@ public interface CustomProjectDocumentationUpdater {
CustomProjectDocumentationUpdater NO_OP = new CustomProjectDocumentationUpdater() {
@Override
public File updateDocsRepoForReleaseTrain(File clonedDocumentationProject,
ProjectVersion currentProject, Projects projects, String bomBranch) {
public File updateDocsRepoForReleaseTrain(File clonedDocumentationProject, ProjectVersion currentProject,
Projects projects, String bomBranch) {
return clonedDocumentationProject;
}
@Override
public File updateDocsRepoForSingleProject(File clonedDocumentationProject,
ProjectVersion currentProject, Projects projects) {
public File updateDocsRepoForSingleProject(File clonedDocumentationProject, ProjectVersion currentProject,
Projects projects) {
return clonedDocumentationProject;
}
};
@@ -53,8 +53,8 @@ public interface CustomProjectDocumentationUpdater {
* @return {@link File cloned temporary directory} - {@code null} if wrong version is
* used
*/
File updateDocsRepoForReleaseTrain(File clonedDocumentationProject,
ProjectVersion currentProject, Projects projects, String bomBranch);
File updateDocsRepoForReleaseTrain(File clonedDocumentationProject, ProjectVersion currentProject,
Projects projects, String bomBranch);
/**
* Updates the documentation repository for a single project.
@@ -64,7 +64,7 @@ public interface CustomProjectDocumentationUpdater {
* @return {@link File cloned temporary directory} - {@code null} if wrong version is
* used
*/
File updateDocsRepoForSingleProject(File clonedDocumentationProject,
ProjectVersion currentProject, Projects projects);
File updateDocsRepoForSingleProject(File clonedDocumentationProject, ProjectVersion currentProject,
Projects projects);
}

View File

@@ -33,17 +33,13 @@ public class DocumentationUpdater {
private final ReleaseTrainContentsUpdater releaseTrainContentsUpdater;
public DocumentationUpdater(ProjectGitHandler gitHandler,
ReleaserProperties properties, TemplateGenerator templateGenerator,
List<CustomProjectDocumentationUpdater> updaters) {
this.projectDocumentationUpdater = new ProjectDocumentationUpdater(properties,
gitHandler, updaters);
this.releaseTrainContentsUpdater = new ReleaseTrainContentsUpdater(properties,
gitHandler, templateGenerator);
public DocumentationUpdater(ProjectGitHandler gitHandler, ReleaserProperties properties,
TemplateGenerator templateGenerator, List<CustomProjectDocumentationUpdater> updaters) {
this.projectDocumentationUpdater = new ProjectDocumentationUpdater(properties, gitHandler, updaters);
this.releaseTrainContentsUpdater = new ReleaseTrainContentsUpdater(properties, gitHandler, templateGenerator);
}
DocumentationUpdater(ProjectDocumentationUpdater updater,
ReleaseTrainContentsUpdater contentsUpdater) {
DocumentationUpdater(ProjectDocumentationUpdater updater, ReleaseTrainContentsUpdater contentsUpdater) {
this.projectDocumentationUpdater = updater;
this.releaseTrainContentsUpdater = contentsUpdater;
}

View File

@@ -31,8 +31,7 @@ import releaser.internal.project.Projects;
*/
class ProjectDocumentationUpdater {
private static final Logger log = LoggerFactory
.getLogger(ProjectDocumentationUpdater.class);
private static final Logger log = LoggerFactory.getLogger(ProjectDocumentationUpdater.class);
private final ProjectGitHandler gitHandler;
@@ -40,8 +39,7 @@ class ProjectDocumentationUpdater {
private final ReleaserProperties properties;
ProjectDocumentationUpdater(ReleaserProperties properties,
ProjectGitHandler gitHandler,
ProjectDocumentationUpdater(ReleaserProperties properties, ProjectGitHandler gitHandler,
List<CustomProjectDocumentationUpdater> updaters) {
this.gitHandler = gitHandler;
this.properties = properties;
@@ -50,44 +48,38 @@ class ProjectDocumentationUpdater {
// Not needed any more cause all projects publish to docs.spring.io
@Deprecated
public File updateDocsRepo(Projects projects, ProjectVersion currentProject,
String bomBranch) {
public File updateDocsRepo(Projects projects, ProjectVersion currentProject, String bomBranch) {
if (!shouldUpdate(currentProject)) {
return null;
}
File documentationProject = this.gitHandler.cloneDocumentationProject();
log.debug("Cloning the doc project to [{}]", documentationProject);
CustomProjectDocumentationUpdater updater = this.updaters.isEmpty()
? CustomProjectDocumentationUpdater.NO_OP : this.updaters.get(0);
return updater.updateDocsRepoForReleaseTrain(documentationProject, currentProject,
projects, bomBranch);
CustomProjectDocumentationUpdater updater = this.updaters.isEmpty() ? CustomProjectDocumentationUpdater.NO_OP
: this.updaters.get(0);
return updater.updateDocsRepoForReleaseTrain(documentationProject, currentProject, projects, bomBranch);
}
// Not needed any more cause all projects publish to docs.spring.io
@Deprecated
public File updateDocsRepoForSingleProject(Projects projects,
ProjectVersion currentProject) {
public File updateDocsRepoForSingleProject(Projects projects, ProjectVersion currentProject) {
if (!shouldUpdate(currentProject)) {
return null;
}
File documentationProject = this.gitHandler.cloneDocumentationProject();
log.debug("Cloning the doc project to [{}]", documentationProject);
CustomProjectDocumentationUpdater updater = this.updaters.isEmpty()
? CustomProjectDocumentationUpdater.NO_OP : this.updaters.get(0);
return updater.updateDocsRepoForSingleProject(documentationProject,
currentProject, projects);
CustomProjectDocumentationUpdater updater = this.updaters.isEmpty() ? CustomProjectDocumentationUpdater.NO_OP
: this.updaters.get(0);
return updater.updateDocsRepoForSingleProject(documentationProject, currentProject, projects);
}
private boolean shouldUpdate(ProjectVersion currentProject) {
if (!this.properties.getGit().isUpdateDocumentationRepo()) {
log.info(
"Will not update documentation repository, since the switch to do so "
+ "is off. Set [releaser.git.update-documentation-repo] to [true] to change that");
log.info("Will not update documentation repository, since the switch to do so "
+ "is off. Set [releaser.git.update-documentation-repo] to [true] to change that");
return false;
}
if (!currentProject.isReleaseOrServiceRelease()) {
log.info(
"Will not update documentation repository for non release or service release [{}]",
log.info("Will not update documentation repository for non release or service release [{}]",
currentProject.version);
return false;
}

View File

@@ -39,8 +39,7 @@ public class ReleaseTrainContents {
return false;
}
ReleaseTrainContents contents = (ReleaseTrainContents) o;
return Objects.equals(this.title, contents.title)
&& Objects.equals(this.rows, contents.rows);
return Objects.equals(this.title, contents.title) && Objects.equals(this.rows, contents.rows);
}
@Override

View File

@@ -39,8 +39,7 @@ import org.springframework.util.StringUtils;
// TODO: [SPRING-CLOUD]
class ReleaseTrainContentsUpdater {
private static final Logger log = LoggerFactory
.getLogger(ReleaseTrainContentsUpdater.class);
private static final Logger log = LoggerFactory.getLogger(ReleaseTrainContentsUpdater.class);
private final ReleaseTrainContentsGitHandler handler;
@@ -63,45 +62,33 @@ class ReleaseTrainContentsUpdater {
* @param projects - set of project with versions to assert against
*/
File updateReleaseTrainWiki(Projects projects) {
if (!this.properties.getGit().isUpdateReleaseTrainWiki()
|| !this.properties.getMetaRelease().isEnabled()) {
log.info(
"Will not clone and update the release train wiki, since the switch to do so "
+ "is off or it's not a meta-release. Set [releaser.git.update-release-train-wiki] to [true] to change that");
if (!this.properties.getGit().isUpdateReleaseTrainWiki() || !this.properties.getMetaRelease().isEnabled()) {
log.info("Will not clone and update the release train wiki, since the switch to do so "
+ "is off or it's not a meta-release. Set [releaser.git.update-release-train-wiki] to [true] to change that");
return null;
}
File releaseTrainWiki = this.handler.cloneReleaseTrainWiki();
ProjectVersion releaseTrain = projects.releaseTrain(this.properties);
// When using calver this need to be a major plus minor (ie if the release is
// 2020.0.1, the name of the wiki page is 2020.0)
String releaseTrainName = releaseTrain.isCalver() ? releaseTrain.majorAndMinor()
: releaseTrain.major();
String releaseTrainName = releaseTrain.isCalver() ? releaseTrain.majorAndMinor() : releaseTrain.major();
String wikiPagePrefix = this.properties.getGit().getReleaseTrainWikiPagePrefix();
String releaseTrainDocFileName = releaseTrainDocFileName(releaseTrainName,
wikiPagePrefix);
log.info("Reading the file [{}] for the current release train",
releaseTrainDocFileName);
File releaseTrainDocFile = releaseTrainDocFile(releaseTrainWiki,
releaseTrainDocFileName);
String releaseVersionFromCurrentFile = this.parser
.latestReleaseTrainFromWiki(releaseTrainDocFile);
log.info("Latest release train version in the file is [{}]",
releaseVersionFromCurrentFile);
if (!isThisReleaseTrainVersionNewer(releaseTrain,
releaseVersionFromCurrentFile)) {
log.info(
"Current release train version [{}] is not "
+ "newer than the version taken from the wiki [{}]",
String releaseTrainDocFileName = releaseTrainDocFileName(releaseTrainName, wikiPagePrefix);
log.info("Reading the file [{}] for the current release train", releaseTrainDocFileName);
File releaseTrainDocFile = releaseTrainDocFile(releaseTrainWiki, releaseTrainDocFileName);
String releaseVersionFromCurrentFile = this.parser.latestReleaseTrainFromWiki(releaseTrainDocFile);
log.info("Latest release train version in the file is [{}]", releaseVersionFromCurrentFile);
if (!isThisReleaseTrainVersionNewer(releaseTrain, releaseVersionFromCurrentFile)) {
log.info("Current release train version [{}] is not " + "newer than the version taken from the wiki [{}]",
releaseTrain.version, releaseVersionFromCurrentFile);
return releaseTrainWiki;
}
return generateNewWikiEntry(projects, releaseTrainWiki, releaseTrain,
releaseTrainName, releaseTrainDocFile, releaseVersionFromCurrentFile);
return generateNewWikiEntry(projects, releaseTrainWiki, releaseTrain, releaseTrainName, releaseTrainDocFile,
releaseVersionFromCurrentFile);
}
private File generateNewWikiEntry(Projects projects, File releaseTrainWiki,
ProjectVersion releaseTrain, String releaseTrainName,
File releaseTrainDocFile, String releaseVersionFromCurrentFile) {
private File generateNewWikiEntry(Projects projects, File releaseTrainWiki, ProjectVersion releaseTrain,
String releaseTrainName, File releaseTrainDocFile, String releaseVersionFromCurrentFile) {
File releaseNotes = this.templateGenerator.releaseNotes(projects);
try {
List<String> lines = Files.readAllLines(releaseTrainDocFile.toPath());
@@ -111,53 +98,43 @@ class ReleaseTrainContentsUpdater {
break;
}
}
return insertNewWikiContentBeforeTheLatestRelease(releaseTrainWiki,
releaseTrain, releaseTrainName, releaseTrainDocFile, releaseNotes,
lines, lineIndex);
return insertNewWikiContentBeforeTheLatestRelease(releaseTrainWiki, releaseTrain, releaseTrainName,
releaseTrainDocFile, releaseNotes, lines, lineIndex);
}
catch (IOException ex) {
throw new IllegalStateException(ex);
}
}
private File insertNewWikiContentBeforeTheLatestRelease(File releaseTrainWiki,
ProjectVersion releaseTrain, String releaseTrainName,
File releaseTrainDocFile, File releaseNotes, List<String> lines,
int lineIndex) throws IOException {
String newContent = new StringJoiner("\n")
.add(String.join("\n", lines.subList(0, lineIndex))).add("\n")
private File insertNewWikiContentBeforeTheLatestRelease(File releaseTrainWiki, ProjectVersion releaseTrain,
String releaseTrainName, File releaseTrainDocFile, File releaseNotes, List<String> lines, int lineIndex)
throws IOException {
String newContent = new StringJoiner("\n").add(String.join("\n", lines.subList(0, lineIndex))).add("\n")
.add(new String(Files.readAllBytes(releaseNotes.toPath())))
.add(String.join("\n", lines.subList(lineIndex, lines.size())))
.toString();
.add(String.join("\n", lines.subList(lineIndex, lines.size()))).toString();
Files.write(releaseTrainDocFile.toPath(), newContent.getBytes());
log.info("Successfully stored new wiki contents for release train [{}]",
releaseTrainName);
log.info("Successfully stored new wiki contents for release train [{}]", releaseTrainName);
this.handler.commitAndPushChanges(releaseTrainWiki, releaseTrain);
return releaseTrainWiki;
}
private String releaseTrainDocFileName(String releaseTrainName,
String wikiPagePrefix) {
return new StringJoiner("-").add(wikiPagePrefix).add(releaseTrainName)
.add("Release-Notes.md").toString();
private String releaseTrainDocFileName(String releaseTrainName, String wikiPagePrefix) {
return new StringJoiner("-").add(wikiPagePrefix).add(releaseTrainName).add("Release-Notes.md").toString();
}
private boolean isThisReleaseTrainVersionNewer(ProjectVersion releaseTrain,
String releaseVersionFromCurrentFile) {
private boolean isThisReleaseTrainVersionNewer(ProjectVersion releaseTrain, String releaseVersionFromCurrentFile) {
if (StringUtils.hasText(releaseVersionFromCurrentFile)) {
return releaseTrain.compareToReleaseTrain(releaseVersionFromCurrentFile) > 0;
}
return true;
}
private File releaseTrainDocFile(File releaseTrainWiki,
String releaseTrainDocFileName) {
private File releaseTrainDocFile(File releaseTrainWiki, String releaseTrainDocFileName) {
File releaseTrainDocFile = new File(releaseTrainWiki, releaseTrainDocFileName);
if (!releaseTrainDocFile.exists()) {
try {
if (!releaseTrainDocFile.createNewFile()) {
throw new IllegalStateException(
"Failed to create releae train doc file");
throw new IllegalStateException("Failed to create releae train doc file");
}
}
catch (IOException e) {
@@ -171,8 +148,7 @@ class ReleaseTrainContentsUpdater {
class ReleaseTrainContentsGitHandler {
private static final Logger log = LoggerFactory
.getLogger(ReleaseTrainContentsGitHandler.class);
private static final Logger log = LoggerFactory.getLogger(ReleaseTrainContentsGitHandler.class);
private static final String PROJECT_PAGE_UPDATED_COMMIT_MSG = "Updating project page to release train [%s]";
@@ -188,8 +164,7 @@ class ReleaseTrainContentsGitHandler {
void commitAndPushChanges(File repo, ProjectVersion releaseTrain) {
log.debug("Committing and pushing changes");
this.handler.commit(repo,
String.format(PROJECT_PAGE_UPDATED_COMMIT_MSG, releaseTrain.version));
this.handler.commit(repo, String.format(PROJECT_PAGE_UPDATED_COMMIT_MSG, releaseTrain.version));
this.handler.pushCurrentBranch(repo);
}
@@ -197,8 +172,7 @@ class ReleaseTrainContentsGitHandler {
class ReleaseTrainContentsParser {
private static final Logger log = LoggerFactory
.getLogger(ReleaseTrainContentsParser.class);
private static final Logger log = LoggerFactory.getLogger(ReleaseTrainContentsParser.class);
ReleaseTrainContents parseProjectPage(File rawHtml) {
try {
@@ -230,9 +204,8 @@ class ReleaseTrainContentsParser {
return Files.readAllLines(rawMd.toPath()).stream()
// We want to find only headers like # Finchley.RELEASE and not any
// custom headers
.filter(s -> s.trim().startsWith("#") && s.contains("."))
.map(s -> s.substring(1).trim()).filter(ProjectVersion::isValid)
.findFirst().orElse("");
.filter(s -> s.trim().startsWith("#") && s.contains(".")).map(s -> s.substring(1).trim())
.filter(ProjectVersion::isValid).findFirst().orElse("");
}
catch (IOException e) {
throw new IllegalStateException(e);

View File

@@ -45,8 +45,7 @@ public class Row {
this.currentSnapshotVersion = row[initialIndex + 3].trim();
}
Row(String componentName, String lastGaVersion, String currentGaVersion,
String currentSnapshotVersion) {
Row(String componentName, String lastGaVersion, String currentGaVersion, String currentSnapshotVersion) {
this.componentName = componentName.trim();
this.lastGaVersion = lastGaVersion.trim();
this.currentGaVersion = currentGaVersion.trim();
@@ -56,8 +55,7 @@ public class Row {
static List<Row> fromProjects(Projects projects, boolean lastGa) {
return projects.stream()
.map(v -> new Row(v.projectName, lastGa ? versionOrEmptyForGa(v) : "",
!lastGa ? versionOrEmptyForGa(v) : "",
v.isSnapshot() ? v.version : ""))
!lastGa ? versionOrEmptyForGa(v) : "", v.isSnapshot() ? v.version : ""))
.collect(Collectors.toCollection(LinkedList::new));
}
@@ -76,14 +74,13 @@ public class Row {
Row row = (Row) o;
return Objects.equals(this.componentName, row.componentName)
&& Objects.equals(this.lastGaVersion, row.lastGaVersion)
&& Objects.equals(this.currentGaVersion, row.currentGaVersion) && Objects
.equals(this.currentSnapshotVersion, row.currentSnapshotVersion);
&& Objects.equals(this.currentGaVersion, row.currentGaVersion)
&& Objects.equals(this.currentSnapshotVersion, row.currentSnapshotVersion);
}
@Override
public int hashCode() {
return Objects.hash(this.componentName, this.lastGaVersion, this.currentGaVersion,
this.currentSnapshotVersion);
return Objects.hash(this.componentName, this.lastGaVersion, this.currentGaVersion, this.currentSnapshotVersion);
}
public String getComponentName() {

View File

@@ -36,8 +36,7 @@ public class Title {
this.currentSnapshotTrainName = row[initialIndex + 2].trim();
}
Title(String lastGaTrainName, String currentGaTrainName,
String currentSnapshotTrainName) {
Title(String lastGaTrainName, String currentGaTrainName, String currentSnapshotTrainName) {
this.lastGaTrainName = lastGaTrainName.trim();
this.currentGaTrainName = currentGaTrainName.trim();
this.currentSnapshotTrainName = currentSnapshotTrainName.trim();
@@ -54,14 +53,12 @@ public class Title {
Title title = (Title) o;
return Objects.equals(this.lastGaTrainName, title.lastGaTrainName)
&& Objects.equals(this.currentGaTrainName, title.currentGaTrainName)
&& Objects.equals(this.currentSnapshotTrainName,
title.currentSnapshotTrainName);
&& Objects.equals(this.currentSnapshotTrainName, title.currentSnapshotTrainName);
}
@Override
public int hashCode() {
return Objects.hash(this.lastGaTrainName, this.currentGaTrainName,
this.currentSnapshotTrainName);
return Objects.hash(this.lastGaTrainName, this.currentGaTrainName, this.currentSnapshotTrainName);
}
public String getLastGaTrainName() {

View File

@@ -56,12 +56,12 @@ import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.transport.CredentialsProvider;
import org.eclipse.jgit.transport.FetchResult;
import org.eclipse.jgit.transport.JschConfigSessionFactory;
import org.eclipse.jgit.transport.OpenSshConfig;
import org.eclipse.jgit.transport.RefSpec;
import org.eclipse.jgit.transport.SshTransport;
import org.eclipse.jgit.transport.URIish;
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
import org.eclipse.jgit.transport.ssh.jsch.JschConfigSessionFactory;
import org.eclipse.jgit.transport.ssh.jsch.OpenSshConfig;
import org.eclipse.jgit.util.FS;
import org.eclipse.jgit.util.FileUtils;
import org.slf4j.Logger;
@@ -109,8 +109,7 @@ class GitRepo {
*/
File cloneProject(URIish projectUri) {
try {
log.info("Cloning repo from [{}] to [{}]", projectUri,
humanishDestination(projectUri, this.basedir));
log.info("Cloning repo from [{}] to [{}]", projectUri, humanishDestination(projectUri, this.basedir));
Git git = cloneToBasedir(projectUri, this.basedir);
if (git != null) {
git.close();
@@ -190,9 +189,8 @@ class GitRepo {
*/
Optional<ObjectId> findTagIdByName(String tagName, boolean unpeel) {
try (Git git = this.gitFactory.open(file(this.basedir))) {
return git.tagList().call().stream()
.filter(ref -> ref.getName().equals("refs/tags/" + tagName))
.findFirst().map(ref -> {
return git.tagList().call().stream().filter(ref -> ref.getName().equals("refs/tags/" + tagName)).findFirst()
.map(ref -> {
if (ref.isPeeled() && unpeel) {
return ref.getPeeledObjectId();
}
@@ -200,8 +198,7 @@ class GitRepo {
});
}
catch (Exception e) {
throw new IllegalStateException(
"Unable to fetch git tag id for refs/tags/" + tagName, e);
throw new IllegalStateException("Unable to fetch git tag id for refs/tags/" + tagName, e);
}
}
@@ -212,8 +209,7 @@ class GitRepo {
*/
List<RevCommit> log(String from, String to) {
try (Git git = this.gitFactory.open(file(this.basedir))) {
final Optional<Ref> fromRevisionOptional = findTagOrBranchHeadRevision(git,
from);
final Optional<Ref> fromRevisionOptional = findTagOrBranchHeadRevision(git, from);
final Optional<Ref> toRevisionOptional = findTagOrBranchHeadRevision(git, to);
ObjectId fromRevision;
@@ -249,8 +245,7 @@ class GitRepo {
return commits;
}
catch (Exception e) {
throw new IllegalStateException(
"Unable to fetch git log for " + from + ".." + to, e);
throw new IllegalStateException("Unable to fetch git log for " + from + ".." + to, e);
}
}
@@ -279,8 +274,7 @@ class GitRepo {
}
return d2.compareTo(d1); // more recent first
});
return allTagsNewestFirst.stream()
.map(ref -> Repository.shortenRefName(ref.getName()));
return allTagsNewestFirst.stream().map(ref -> Repository.shortenRefName(ref.getName()));
}
catch (Exception e) {
throw new IllegalStateException("Unable to fetch git tags", e);
@@ -290,29 +284,24 @@ class GitRepo {
/**
* Look for a tag with the given name, and if not found looks for a branch.
*/
private Optional<Ref> findTagOrBranchHeadRevision(Git git, String tagOrBranch)
throws GitAPIException, IOException {
private Optional<Ref> findTagOrBranchHeadRevision(Git git, String tagOrBranch) throws GitAPIException, IOException {
if (tagOrBranch.equals("HEAD")) {
return Optional.of(git.getRepository().exactRef(Constants.HEAD).getTarget());
}
final Optional<Ref> tag = git.tagList().call().stream()
.filter(ref -> ref.getName().equals("refs/tags/" + tagOrBranch))
.findFirst();
.filter(ref -> ref.getName().equals("refs/tags/" + tagOrBranch)).findFirst();
if (tag.isPresent()) {
return tag;
}
return git.branchList().setListMode(ListBranchCommand.ListMode.ALL).call()
.stream().filter(ref -> ref.getName().equals("refs/heads/" + tagOrBranch))
.findFirst();
return git.branchList().setListMode(ListBranchCommand.ListMode.ALL).call().stream()
.filter(ref -> ref.getName().equals("refs/heads/" + tagOrBranch)).findFirst();
}
boolean hasBranch(String branch) {
try (Git git = this.gitFactory.open(file(this.basedir))) {
List<Ref> refs = git.branchList().setListMode(ListBranchCommand.ListMode.ALL)
.call();
boolean present = refs.stream()
.anyMatch(ref -> branch.equals(nameOfBranch(ref.getName())));
List<Ref> refs = git.branchList().setListMode(ListBranchCommand.ListMode.ALL).call();
boolean present = refs.stream().anyMatch(ref -> branch.equals(nameOfBranch(ref.getName())));
if (log.isDebugEnabled()) {
log.debug("Branch [{}] is present [{}]", branch, present);
}
@@ -335,8 +324,7 @@ class GitRepo {
log.info("Printing [{}] last commits for branch [{}]", maxCount, currentBranch);
Iterable<RevCommit> commits = git.log().setMaxCount(maxCount).call();
for (RevCommit commit : commits) {
log.info("Name [{}], msg [{}]", commit.getId().name(),
commit.getShortMessage());
log.info("Name [{}], msg [{}]", commit.getId().name(), commit.getShortMessage());
}
}
@@ -402,9 +390,8 @@ class GitRepo {
String id = commit.getId().getName();
if (!shortMessage.contains("Update SNAPSHOT to ")) {
throw new IllegalStateException(
"Won't revert the commit with id [" + id + "] " + "and message ["
+ shortMessage + "]. Only commit that updated "
+ "snapshot to another version can be reverted");
"Won't revert the commit with id [" + id + "] " + "and message [" + shortMessage
+ "]. Only commit that updated " + "snapshot to another version can be reverted");
}
log.debug("The commit to be reverted is [{}]", commit);
git.revert().include(commit).call();
@@ -429,10 +416,8 @@ class GitRepo {
return ResourceUtils.getFile(project.toURI()).getAbsoluteFile();
}
private Git cloneToBasedir(URIish projectUrl, File destinationFolder)
throws GitAPIException {
CloneCommand command = this.gitFactory.getCloneCommandByCloneRepository()
.setURI(projectUrl.toString() + ".git")
private Git cloneToBasedir(URIish projectUrl, File destinationFolder) throws GitAPIException {
CloneCommand command = this.gitFactory.getCloneCommandByCloneRepository().setURI(projectUrl.toString() + ".git")
.setDirectory(humanishDestination(projectUrl, destinationFolder));
try {
return command.call();
@@ -500,8 +485,7 @@ class GitRepo {
}
private void trackBranch(CheckoutCommand checkout, String label) {
checkout.setCreateBranch(true).setName(label)
.setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.TRACK)
checkout.setCreateBranch(true).setName(label).setUpstreamMode(CreateBranchCommand.SetupUpstreamMode.TRACK)
.setStartPoint("origin/" + label);
}
@@ -513,8 +497,7 @@ class GitRepo {
return containsBranch(git, label, null);
}
private boolean containsBranch(Git git, String label,
ListBranchCommand.ListMode listMode) throws GitAPIException {
private boolean containsBranch(Git git, String label, ListBranchCommand.ListMode listMode) throws GitAPIException {
ListBranchCommand command = git.branchList();
if (listMode != null) {
command.setListMode(listMode);
@@ -564,17 +547,14 @@ class GitRepo {
log.info("Successfully connected to an agent");
}
catch (AgentProxyException e) {
log.error(
"Exception occurred while trying to connect to agent. Will create"
+ "the default JSch connection",
e);
log.error("Exception occurred while trying to connect to agent. Will create"
+ "the default JSch connection", e);
return super.createDefaultJSch(fs);
}
final JSch jsch = super.createDefaultJSch(fs);
if (connector != null) {
JSch.setConfig("PreferredAuthentications", "publickey,password");
IdentityRepository identityRepository = new RemoteIdentityRepository(
connector);
IdentityRepository identityRepository = new RemoteIdentityRepository(connector);
jsch.setIdentityRepository(identityRepository);
}
return jsch;
@@ -592,8 +572,7 @@ class GitRepo {
JGitFactory(ReleaserProperties releaserProperties) {
if (StringUtils.hasText(releaserProperties.getGit().getUsername())) {
log.info(
"Passed username and password - will set a custom credentials provider");
log.info("Passed username and password - will set a custom credentials provider");
this.provider = credentialsProvider(releaserProperties);
}
else {
@@ -608,8 +587,8 @@ class GitRepo {
}
CredentialsProvider credentialsProvider(ReleaserProperties properties) {
return new UsernamePasswordCredentialsProvider(
properties.getGit().getUsername(), properties.getGit().getPassword());
return new UsernamePasswordCredentialsProvider(properties.getGit().getUsername(),
properties.getGit().getPassword());
}
CloneCommand getCloneCommandByCloneRepository() {
@@ -618,8 +597,7 @@ class GitRepo {
}
PushCommand push(Git git) {
return git.push().setCredentialsProvider(this.provider)
.setTransportConfigCallback(this.callback);
return git.push().setCredentialsProvider(this.provider).setTransportConfigCallback(this.callback);
}
Git open(File file) {

View File

@@ -70,13 +70,11 @@ public class ProjectGitHandler implements Closeable {
public void commitAndTagIfApplicable(File project, ProjectVersion version) {
GitRepo gitRepo = gitRepo(project);
if (version.isSnapshot()) {
log.info("Snapshot version [{}] found. Will only commit the changed poms",
version);
log.info("Snapshot version [{}] found. Will only commit the changed poms", version);
gitRepo.commit(MSG);
}
else {
log.info(
"NON-snapshot version [{}] found. Will commit the changed poms, tag the version and push the tag",
log.info("NON-snapshot version [{}] found. Will commit the changed poms, tag the version and push the tag",
version);
gitRepo.commit(String.format(PRE_RELEASE_MSG, version.version));
String tagName = "v" + version.version;
@@ -87,8 +85,7 @@ public class ProjectGitHandler implements Closeable {
public void commitAfterBumpingVersions(File project, ProjectVersion bumpedVersion) {
if (bumpedVersion.isSnapshot()) {
log.info("Snapshot version [{}] found. Will only commit the changed poms",
bumpedVersion);
log.info("Snapshot version [{}] found. Will only commit the changed poms", bumpedVersion);
commit(project, String.format(POST_RELEASE_BUMP_MSG, bumpedVersion));
}
else {
@@ -120,8 +117,7 @@ public class ProjectGitHandler implements Closeable {
}
public File cloneReleaseTrainDocumentationProject(String branch) {
return cloneAndCheckOut(this.properties.getGit().getReleaseTrainDocsUrl(),
branch);
return cloneAndCheckOut(this.properties.getGit().getReleaseTrainDocsUrl(), branch);
}
public File cloneDocumentationProject() {
@@ -134,8 +130,7 @@ public class ProjectGitHandler implements Closeable {
this.properties.getGit().getSpringProjectBranch());
}
private File cloneAndCheckOut(String springProjectUrl,
String springProjectUrlBranch) {
private File cloneAndCheckOut(String springProjectUrl, String springProjectUrlBranch) {
File clonedProject = cloneProject(springProjectUrl);
checkout(clonedProject, springProjectUrlBranch);
return clonedProject;
@@ -160,8 +155,7 @@ public class ProjectGitHandler implements Closeable {
String releaseTrainBranch = this.properties.getGit().getReleaseTrainBranch();
if (!StringUtils.isEmpty(releaseTrainBranch)) {
if (log.isDebugEnabled()) {
log.debug("Checking out configured release train branch {}",
releaseTrainBranch);
log.debug("Checking out configured release train branch {}", releaseTrainBranch);
}
if (gitRepo(clonedProject).hasBranch(releaseTrainBranch)) {
log.info("Branch [{}] exists. Will check it out", releaseTrainBranch);
@@ -171,8 +165,7 @@ public class ProjectGitHandler implements Closeable {
}
String version = this.properties.getFixedVersions().get(projectName);
if (StringUtils.isEmpty(version)) {
throw new IllegalStateException(
"You haven't provided a version for project [" + projectName + "]");
throw new IllegalStateException("You haven't provided a version for project [" + projectName + "]");
}
return findAndCheckOutBranchForVersion(clonedProject, new String[] { version });
}
@@ -200,11 +193,10 @@ public class ProjectGitHandler implements Closeable {
log.debug("Checking versions {} for project [{}]", versions, clonedProject);
}
String branchToCheckout = Arrays.stream(versions).map(this::branchFromVersion)
.map(version -> gitRepo(clonedProject).hasBranch(version) ? version : "")
.filter(StringUtils::hasText).findFirst().orElse("main");
.map(version -> gitRepo(clonedProject).hasBranch(version) ? version : "").filter(StringUtils::hasText)
.findFirst().orElse("main");
if ("main".equals(branchToCheckout)) {
log.info(
"None of the versions {} matches a branch. Assuming that should work with main branch",
log.info("None of the versions {} matches a branch. Assuming that should work with main branch",
(Object) versions);
return clonedProject;
}
@@ -221,10 +213,8 @@ public class ProjectGitHandler implements Closeable {
* @param toRef the ref to go to (tag, branch or sha1)
* @return the list of revisions between these two references
*/
public List<SimpleCommit> commitsBetween(File clonedProject, String fromRef,
String toRef) {
return gitRepo(clonedProject).log(fromRef, toRef).stream().map(SimpleCommit::new)
.collect(Collectors.toList());
public List<SimpleCommit> commitsBetween(File clonedProject, String fromRef, String toRef) {
return gitRepo(clonedProject).log(fromRef, toRef).stream().map(SimpleCommit::new).collect(Collectors.toList());
}
/**
@@ -234,8 +224,7 @@ public class ProjectGitHandler implements Closeable {
* @return an {@link Optional} that is valued with the sha1, if found
*/
public Optional<String> findTagSha1(File clonedProject, String tagName) {
return gitRepo(clonedProject).findTagIdByName(tagName, false)
.map(AnyObjectId::getName);
return gitRepo(clonedProject).findTagIdByName(tagName, false).map(AnyObjectId::getName);
}
private String suffixNonHttpRepo(String orgUrl) {
@@ -248,8 +237,7 @@ public class ProjectGitHandler implements Closeable {
// retrieve from cache
// reset any changes and fetch the latest data
File destinationDir = destinationDir();
File clonedProject = CACHE.computeIfAbsent(urIish,
urIish1 -> gitRepo(destinationDir).cloneProject(urIish));
File clonedProject = CACHE.computeIfAbsent(urIish, urIish1 -> gitRepo(destinationDir).cloneProject(urIish));
if (clonedProject.exists()) {
log.info(
"Project has already been cloned. Will try to reset the current branch and fetch the latest changes.");
@@ -309,8 +297,7 @@ public class ProjectGitHandler implements Closeable {
// [Camden] -> [Camden.x]
return splitVersion[0];
}
throw new IllegalStateException(
"Wrong version [" + version + "]. Can't extract semver pieces of it");
throw new IllegalStateException("Wrong version [" + version + "]. Can't extract semver pieces of it");
}
@@ -347,8 +334,7 @@ public class ProjectGitHandler implements Closeable {
* @return a {@link Stream} of the tags whose name match the given {@link Pattern}
*/
public Stream<String> findTagNamesMatching(File clonedProject, Pattern tagPattern) {
return gitRepo(clonedProject).listTags()
.filter(tagName -> tagPattern.matcher(tagName).matches());
return gitRepo(clonedProject).listTags().filter(tagName -> tagPattern.matcher(tagName).matches());
}
}

View File

@@ -71,12 +71,9 @@ public class SimpleCommit {
public final boolean isMergeCommit;
SimpleCommit(RevCommit revCommit) {
this(revCommit.abbreviate(8).name(), revCommit.name(),
revCommit.getShortMessage(), revCommit.getFullMessage(),
revCommit.getAuthorIdent().getName(),
revCommit.getAuthorIdent().getEmailAddress(),
revCommit.getCommitterIdent().getName(),
revCommit.getCommitterIdent().getEmailAddress(),
this(revCommit.abbreviate(8).name(), revCommit.name(), revCommit.getShortMessage(), revCommit.getFullMessage(),
revCommit.getAuthorIdent().getName(), revCommit.getAuthorIdent().getEmailAddress(),
revCommit.getCommitterIdent().getName(), revCommit.getCommitterIdent().getEmailAddress(),
revCommit.getParentCount() > 1);
}
@@ -92,9 +89,8 @@ public class SimpleCommit {
* @param committerEmail the email of the commit's committer
* @param isMergeCommit is the commit a merge commit (with 2 parents)
*/
public SimpleCommit(String abbreviatedSha1, String fullSha1, String title,
String fullMessage, String authorName, String authorEmail,
String committerName, String committerEmail, boolean isMergeCommit) {
public SimpleCommit(String abbreviatedSha1, String fullSha1, String title, String fullMessage, String authorName,
String authorEmail, String committerName, String committerEmail, boolean isMergeCommit) {
this.abbreviatedSha1 = abbreviatedSha1;
this.fullSha1 = fullSha1;
this.title = title;

View File

@@ -167,8 +167,7 @@ class CachingRepos implements Repos, Closeable {
@Override
public Repo get(Coordinates coordinates) {
return CACHE.computeIfAbsent(coordinates,
o -> new CachingRepo(this.delegate.get(coordinates)));
return CACHE.computeIfAbsent(coordinates, o -> new CachingRepo(this.delegate.get(coordinates)));
}
@Override
@@ -181,6 +180,11 @@ class CachingRepos implements Repos, Closeable {
return this.delegate.iterate(s);
}
@Override
public boolean exists(Coordinates coordinates) throws IOException {
return delegate.exists(coordinates);
}
@Override
public boolean equals(Object o) {
return this.delegate.equals(o);
@@ -216,47 +220,40 @@ class CachingRepo implements Repo, Closeable {
@Override
public Coordinates coordinates() {
return (Coordinates) CACHE.computeIfAbsent(
new RepoKey(this.delegate, "coordinates"),
return (Coordinates) CACHE.computeIfAbsent(new RepoKey(this.delegate, "coordinates"),
s -> this.delegate.coordinates());
}
@Override
public Issues issues() {
return (Issues) CACHE.computeIfAbsent(new RepoKey(this.delegate, "issues"),
s -> this.delegate.issues());
return (Issues) CACHE.computeIfAbsent(new RepoKey(this.delegate, "issues"), s -> this.delegate.issues());
}
@Override
public Milestones milestones() {
return (Milestones) CACHE.computeIfAbsent(
new RepoKey(this.delegate, "milestones"),
return (Milestones) CACHE.computeIfAbsent(new RepoKey(this.delegate, "milestones"),
s -> this.delegate.milestones());
}
@Override
public Pulls pulls() {
return (Pulls) CACHE.computeIfAbsent(new RepoKey(this.delegate, "pulls"),
s -> this.delegate.pulls());
return (Pulls) CACHE.computeIfAbsent(new RepoKey(this.delegate, "pulls"), s -> this.delegate.pulls());
}
@Override
public Hooks hooks() {
return (Hooks) CACHE.computeIfAbsent(new RepoKey(this.delegate, "hooks"),
s -> this.delegate.hooks());
return (Hooks) CACHE.computeIfAbsent(new RepoKey(this.delegate, "hooks"), s -> this.delegate.hooks());
}
@Override
public IssueEvents issueEvents() {
return (IssueEvents) CACHE.computeIfAbsent(
new RepoKey(this.delegate, "issueEvents"),
return (IssueEvents) CACHE.computeIfAbsent(new RepoKey(this.delegate, "issueEvents"),
s -> this.delegate.issueEvents());
}
@Override
public Labels labels() {
return (Labels) CACHE.computeIfAbsent(new RepoKey(this.delegate, "labels"),
s -> this.delegate.labels());
return (Labels) CACHE.computeIfAbsent(new RepoKey(this.delegate, "labels"), s -> this.delegate.labels());
}
@Override
@@ -267,63 +264,54 @@ class CachingRepo implements Repo, Closeable {
@Override
public Releases releases() {
return (Releases) CACHE.computeIfAbsent(new RepoKey(this.delegate, "releases"),
s -> this.delegate.releases());
return (Releases) CACHE.computeIfAbsent(new RepoKey(this.delegate, "releases"), s -> this.delegate.releases());
}
@Override
public DeployKeys keys() {
return (DeployKeys) CACHE.computeIfAbsent(new RepoKey(this.delegate, "keys"),
s -> this.delegate.keys());
return (DeployKeys) CACHE.computeIfAbsent(new RepoKey(this.delegate, "keys"), s -> this.delegate.keys());
}
@Override
public Forks forks() {
return (Forks) CACHE.computeIfAbsent(new RepoKey(this.delegate, "forks"),
s -> this.delegate.forks());
return (Forks) CACHE.computeIfAbsent(new RepoKey(this.delegate, "forks"), s -> this.delegate.forks());
}
@Override
public RepoCommits commits() {
return (RepoCommits) CACHE.computeIfAbsent(
new RepoKey(this.delegate, "repoCommits"), s -> this.delegate.commits());
return (RepoCommits) CACHE.computeIfAbsent(new RepoKey(this.delegate, "repoCommits"),
s -> this.delegate.commits());
}
@Override
public Branches branches() {
return (Branches) CACHE.computeIfAbsent(new RepoKey(this.delegate, "branches"),
s -> this.delegate.branches());
return (Branches) CACHE.computeIfAbsent(new RepoKey(this.delegate, "branches"), s -> this.delegate.branches());
}
@Override
public Contents contents() {
return (Contents) CACHE.computeIfAbsent(new RepoKey(this.delegate, "contents"),
s -> this.delegate.contents());
return (Contents) CACHE.computeIfAbsent(new RepoKey(this.delegate, "contents"), s -> this.delegate.contents());
}
@Override
public Collaborators collaborators() {
return (Collaborators) CACHE.computeIfAbsent(
new RepoKey(this.delegate, "collaborators"),
return (Collaborators) CACHE.computeIfAbsent(new RepoKey(this.delegate, "collaborators"),
s -> this.delegate.collaborators());
}
@Override
public Git git() {
return (Git) CACHE.computeIfAbsent(new RepoKey(this.delegate, "git"),
s -> this.delegate.git());
return (Git) CACHE.computeIfAbsent(new RepoKey(this.delegate, "git"), s -> this.delegate.git());
}
@Override
public Stars stars() {
return (Stars) CACHE.computeIfAbsent(new RepoKey(this.delegate, "stars"),
s -> this.delegate.stars());
return (Stars) CACHE.computeIfAbsent(new RepoKey(this.delegate, "stars"), s -> this.delegate.stars());
}
@Override
public Notifications notifications() {
return (Notifications) CACHE.computeIfAbsent(
new RepoKey(this.delegate, "notifications"),
return (Notifications) CACHE.computeIfAbsent(new RepoKey(this.delegate, "notifications"),
s -> this.delegate.notifications());
}
@@ -334,15 +322,14 @@ class CachingRepo implements Repo, Closeable {
@Override
public JsonObject json() throws IOException {
return (JsonObject) CACHE.computeIfAbsent(new RepoKey(this.delegate, "json"),
s -> {
try {
return this.delegate.json();
}
catch (IOException ex) {
throw new IllegalStateException(ex);
}
});
return (JsonObject) CACHE.computeIfAbsent(new RepoKey(this.delegate, "json"), s -> {
try {
return this.delegate.json();
}
catch (IOException ex) {
throw new IllegalStateException(ex);
}
});
}
@Override
@@ -382,8 +369,7 @@ class RepoKey {
return false;
}
RepoKey repoKey = (RepoKey) o;
return Objects.equals(this.repo, repoKey.repo)
&& Objects.equals(this.key, repoKey.key);
return Objects.equals(this.repo, repoKey.repo) && Objects.equals(this.key, repoKey.key);
}
@Override

View File

@@ -47,8 +47,8 @@ public class GithubIssueFiler {
private final ReleaserProperties properties;
public GithubIssueFiler(ReleaserProperties properties) {
this(new RtGithub(new RtGithub(properties.getGit().getOauthToken()).entry()
.through(RetryWire.class)), properties);
this(new RtGithub(new RtGithub(properties.getGit().getOauthToken()).entry().through(RetryWire.class)),
properties);
}
public GithubIssueFiler(Github github, ReleaserProperties properties) {
@@ -56,22 +56,20 @@ public class GithubIssueFiler {
this.properties = properties;
}
public void fileAGitHubIssue(String user, String repo, ProjectVersion version,
String issueTitle, String issueText) {
public void fileAGitHubIssue(String user, String repo, ProjectVersion version, String issueTitle,
String issueText) {
Assert.hasText(this.properties.getGit().getOauthToken(),
"You have to pass Github OAuth token for milestone closing to be operational");
// do this only for RELEASE & SR
if (version.isSnapshot()) {
log.info(
"Github issue creation will occur only for non snapshot versions. Your version is [{}]",
log.info("Github issue creation will occur only for non snapshot versions. Your version is [{}]",
parsedVersion());
return;
}
fileAGithubIssue(user, repo, issueTitle, issueText);
}
private void fileAGithubIssue(String user, String repo, String issueTitle,
String issueText) {
private void fileAGithubIssue(String user, String repo, String issueTitle, String issueText) {
Repo ghRepo = this.github.repos().get(new Coordinates.Simple(user, repo));
// check if the issue is not already there
boolean issueAlreadyFiled = issueAlreadyFiled(ghRepo, issueTitle);
@@ -81,9 +79,7 @@ public class GithubIssueFiler {
}
try {
int number = ghRepo.issues().create(issueTitle, issueText).number();
log.info(
"Successfully created an issue with "
+ "title [{}] for the [{}/{}] GitHub repository" + number,
log.info("Successfully created an issue with " + "title [{}] for the [{}/{}] GitHub repository" + number,
issueTitle, user, repo);
}
catch (IOException e) {

View File

@@ -33,8 +33,7 @@ class GithubIssues {
}
private CustomGithubIssues customGithubIssues() {
return this.customGithubIssues.isEmpty() ? CustomGithubIssues.NO_OP
: this.customGithubIssues.get(0);
return this.customGithubIssues.isEmpty() ? CustomGithubIssues.NO_OP : this.customGithubIssues.get(0);
}
void fileIssueInSpringGuides(Projects projects, ProjectVersion version) {

View File

@@ -51,8 +51,8 @@ class GithubMilestones {
private final ReleaserProperties properties;
GithubMilestones(ReleaserProperties properties) {
this(new RtGithub(new RtGithub(properties.getGit().getOauthToken()).entry()
.through(RetryWire.class)), properties);
this(new RtGithub(new RtGithub(properties.getGit().getOauthToken()).entry().through(RetryWire.class)),
properties);
}
GithubMilestones(Github github, ReleaserProperties properties) {
@@ -95,8 +95,7 @@ class GithubMilestones {
try {
int counter = 0;
for (Milestone milestone : milestones) {
if (counter++ >= this.properties.getGit()
.getNumberOfCheckedMilestones()) {
if (counter++ >= this.properties.getGit().getNumberOfCheckedMilestones()) {
log.warn(
"No matching milestones were found within the provided threshold [{}] of checked milestones",
this.properties.getGit().getNumberOfCheckedMilestones());
@@ -104,8 +103,7 @@ class GithubMilestones {
}
Milestone.Smart smartMilestone = new Milestone.Smart(milestone);
String title = milestoneTitle(smartMilestone);
if (tagVersion.equals(title)
|| numericVersion(tagVersion).equals(title)) {
if (tagVersion.equals(title) || numericVersion(tagVersion).equals(title)) {
log.info("Found a matching milestone [{}]", smartMilestone.number());
return smartMilestone;
}
@@ -127,15 +125,13 @@ class GithubMilestones {
Assert.hasText(this.properties.getGit().getOauthToken(),
"You have to pass Github OAuth token for milestone closing to be operational");
String tagVersion = version.version;
Milestone.Smart foundMilestone = matchingMilestone(tagVersion,
closedMilestones(version));
Milestone.Smart foundMilestone = matchingMilestone(tagVersion, closedMilestones(version));
String foundUrl = "";
if (foundMilestone != null) {
try {
URL url = foundMilestoneUrl(foundMilestone);
log.info("Found a matching milestone with issues URL [{}]", url);
foundUrl = url.toString()
.replace("https://api.github.com/repos", "https://github.com")
foundUrl = url.toString().replace("https://api.github.com/repos", "https://github.com")
.replace("milestones", "milestone") + "?closed=1";
}
catch (IOException e) {
@@ -150,8 +146,7 @@ class GithubMilestones {
}
private String numericVersion(String version) {
return version.contains("RELEASE")
? version.substring(0, version.lastIndexOf(".")) : "";
return version.contains("RELEASE") ? version.substring(0, version.lastIndexOf(".")) : "";
}
String milestoneTitle(Milestone.Smart milestone) throws IOException {
@@ -162,11 +157,9 @@ class GithubMilestones {
return milestone.url();
}
private Iterable<Milestone> getMilestones(ProjectVersion version,
Map<String, String> map) {
private Iterable<Milestone> getMilestones(ProjectVersion version, Map<String, String> map) {
try {
return this.github.repos()
.get(new Coordinates.Simple(org(), version.projectName)).milestones()
return this.github.repos().get(new Coordinates.Simple(org(), version.projectName)).milestones()
.iterate(map);
}
catch (AssertionError e) {

View File

@@ -40,8 +40,7 @@ public class ProjectGitHubHandler {
private final ReleaserProperties properties;
public ProjectGitHubHandler(ReleaserProperties properties,
List<CustomGithubIssues> customGithubIssues) {
public ProjectGitHubHandler(ReleaserProperties properties, List<CustomGithubIssues> customGithubIssues) {
this.properties = properties;
this.githubMilestones = new GithubMilestones(properties);
this.githubIssues = new GithubIssues(customGithubIssues);
@@ -54,9 +53,8 @@ public class ProjectGitHubHandler {
public void closeMilestone(ProjectVersion releaseVersion) {
if (!this.properties.getGit().isUpdateGithubMilestones()) {
log.info(
"Will not update the release train documentation, since the switch to do so "
+ "is off. Set [releaser.git.update-github-milestones] to [true] to change that");
log.info("Will not update the release train documentation, since the switch to do so "
+ "is off. Set [releaser.git.update-github-milestones] to [true] to change that");
return;
}
this.githubMilestones.closeMilestone(releaseVersion);
@@ -64,9 +62,8 @@ public class ProjectGitHubHandler {
public void createIssueInSpringGuides(Projects projects, ProjectVersion version) {
if (!this.properties.getGit().isUpdateSpringGuides()) {
log.info(
"Will not update the release train documentation, since the switch to do so "
+ "is off. Set [releaser.git.update-spring-guides] to [true] to change that");
log.info("Will not update the release train documentation, since the switch to do so "
+ "is off. Set [releaser.git.update-spring-guides] to [true] to change that");
return;
}
this.githubIssues.fileIssueInSpringGuides(projects, version);
@@ -74,9 +71,8 @@ public class ProjectGitHubHandler {
public void createIssueInStartSpringIo(Projects projects, ProjectVersion version) {
if (!this.properties.getGit().isUpdateStartSpringIo()) {
log.info(
"Will not update the release train documentation, since the switch to do so "
+ "is off. Set [releaser.git.update-start-spring-io] to [true] to change that");
log.info("Will not update the release train documentation, since the switch to do so "
+ "is off. Set [releaser.git.update-start-spring-io] to [true] to change that");
return;
}
this.githubIssues.fileIssueInStartSpringIo(projects, version);

View File

@@ -68,11 +68,9 @@ public class PostReleaseActions implements Closeable {
private final ReleaserPropertiesUpdater releaserPropertiesUpdater;
public PostReleaseActions(ProjectGitHandler projectGitHandler,
ProjectPomUpdater projectPomUpdater, GradleUpdater gradleUpdater,
ProjectCommandExecutor projectCommandExecutor, ReleaserProperties properties,
VersionsFetcher versionsFetcher,
ReleaserPropertiesUpdater releaserPropertiesUpdater) {
public PostReleaseActions(ProjectGitHandler projectGitHandler, ProjectPomUpdater projectPomUpdater,
GradleUpdater gradleUpdater, ProjectCommandExecutor projectCommandExecutor, ReleaserProperties properties,
VersionsFetcher versionsFetcher, ReleaserPropertiesUpdater releaserPropertiesUpdater) {
this.projectGitHandler = projectGitHandler;
this.projectPomUpdater = projectPomUpdater;
this.gradleUpdater = gradleUpdater;
@@ -90,19 +88,15 @@ public class PostReleaseActions implements Closeable {
*/
public ExecutionResult deployGuides(List<ProcessedProject> processedProjects) {
if (!this.properties.getGit().isUpdateSpringGuides()) {
log.info(
"Will not build and deploy latest Spring Guides, since the switch to do so "
+ "is off. Set [releaser.git.update-spring-guides] to [true] to change that");
log.info("Will not build and deploy latest Spring Guides, since the switch to do so "
+ "is off. Set [releaser.git.update-spring-guides] to [true] to change that");
return ExecutionResult.skipped();
}
List<ProcessedProject> latestGaProcessedProjects = processedProjects.stream()
.filter(processedProject -> this.versionsFetcher
.isLatestGa(processedProject.newProjectVersion))
.filter(processedProject -> this.versionsFetcher.isLatestGa(processedProject.newProjectVersion))
.collect(Collectors.toList());
log.info("Found the following latest ga processed projects "
+ latestGaProcessedProjects);
List<ProjectUrlAndException> projectUrlAndExceptions = runDeployGuides(
latestGaProcessedProjects);
log.info("Found the following latest ga processed projects " + latestGaProcessedProjects);
List<ProjectUrlAndException> projectUrlAndExceptions = runDeployGuides(latestGaProcessedProjects);
log.info("Deployed all guides!");
assertExceptions(projectUrlAndExceptions);
return ExecutionResult.success();
@@ -114,8 +108,7 @@ public class PostReleaseActions implements Closeable {
* @return result of the execution
*/
public ExecutionResult runUpdatedTests(Projects projects) {
if (!this.properties.getGit().isRunUpdatedSamples()
|| !this.properties.getMetaRelease().isEnabled()) {
if (!this.properties.getGit().isRunUpdatedSamples() || !this.properties.getMetaRelease().isEnabled()) {
log.info("Will not update and run test samples, since the switch to do so "
+ "is off. Set [releaser.git.run-updated-samples] to [true] to change that");
return ExecutionResult.skipped();
@@ -124,11 +117,9 @@ public class PostReleaseActions implements Closeable {
ReleaserProperties projectProps = projectProps(file);
ProjectVersion projectVersion = newProjectVersion(file);
String releaseTrainVersion = projects.releaseTrain(projectProps).version;
Projects newProjects = addVersionForTestsProject(projects, projectVersion,
releaseTrainVersion);
Projects newProjects = addVersionForTestsProject(projects, projectVersion, releaseTrainVersion);
updateWithVersions(file, newProjects);
this.projectCommandExecutor.build(projectProps, projectVersion, projectVersion,
file.getAbsolutePath());
this.projectCommandExecutor.build(projectProps, projectVersion, projectVersion, file.getAbsolutePath());
return ExecutionResult.success();
}
@@ -144,15 +135,13 @@ public class PostReleaseActions implements Closeable {
* @return result of the execution
*/
public ExecutionResult updateAllTestSamples(Projects projects) {
if (!this.properties.getGit().isUpdateAllTestSamples()
|| !this.properties.getMetaRelease().isEnabled()) {
if (!this.properties.getGit().isUpdateAllTestSamples() || !this.properties.getMetaRelease().isEnabled()) {
log.info("Will not update all test samples, since the switch to do so "
+ "is off. Set [releaser.git.update-all-test-samples] to [true] to change that");
return ExecutionResult.skipped();
}
List<ProjectUrlAndException> projectUrlAndExceptions = this.properties.getGit()
.getAllTestSampleUrls().entrySet().stream()
.map(e -> updateAllProjects(projects, e)).map(this::getResult)
List<ProjectUrlAndException> projectUrlAndExceptions = this.properties.getGit().getAllTestSampleUrls()
.entrySet().stream().map(e -> updateAllProjects(projects, e)).map(this::getResult)
.flatMap(Collection::stream).collect(Collectors.toList());
log.info("Updated all samples!");
assertExceptions(projectUrlAndExceptions);
@@ -160,41 +149,30 @@ public class PostReleaseActions implements Closeable {
}
private void assertExceptions(List<ProjectUrlAndException> projectUrlAndExceptions) {
String exceptionMessages = projectUrlAndExceptions.stream()
.filter(ProjectUrlAndException::hasException)
.map(e -> "Project [" + e.key + "] for url [" + e.url + "] "
+ "has exception [\n\n"
+ Arrays.stream(NestedExceptionUtils.getMostSpecificCause(e.ex)
.getStackTrace()).map(StackTraceElement::toString)
.collect(Collectors.joining("\n"))
String exceptionMessages = projectUrlAndExceptions.stream().filter(ProjectUrlAndException::hasException)
.map(e -> "Project [" + e.key + "] for url [" + e.url + "] " + "has exception [\n\n"
+ Arrays.stream(NestedExceptionUtils.getMostSpecificCause(e.ex).getStackTrace())
.map(StackTraceElement::toString).collect(Collectors.joining("\n"))
+ "]")
.collect(Collectors.joining("\n"));
if (StringUtils.hasText(exceptionMessages)) {
throw new IllegalStateException(
"Exceptions were found while running post release tasks\n"
+ exceptionMessages);
"Exceptions were found while running post release tasks\n" + exceptionMessages);
}
else {
log.info("No exceptions were found while running post release tasks");
}
}
private List<ProjectUrlAndException> runDeployGuides(
List<ProcessedProject> latestGaProcessedProjects) {
private List<ProjectUrlAndException> runDeployGuides(List<ProcessedProject> latestGaProcessedProjects) {
return latestGaProcessedProjects.stream()
.map(processedProject -> run(processedProject.projectName(), "",
() -> SERVICE.submit(() -> {
String tagName = processedProject.newProjectVersion
.releaseTagName();
File clonedProject = this.projectGitHandler
.cloneProjectFromOrg(processedProject.projectName());
this.projectGitHandler.checkout(clonedProject, tagName);
projectBuilder(processedProject).deployGuides(
processedProject.propertiesForProject,
processedProject.originalProjectVersion,
processedProject.newProjectVersion);
})))
.map(this::getSingleResult).collect(Collectors.toList());
.map(processedProject -> run(processedProject.projectName(), "", () -> SERVICE.submit(() -> {
String tagName = processedProject.newProjectVersion.releaseTagName();
File clonedProject = this.projectGitHandler.cloneProjectFromOrg(processedProject.projectName());
this.projectGitHandler.checkout(clonedProject, tagName);
projectBuilder(processedProject).deployGuides(processedProject.propertiesForProject,
processedProject.originalProjectVersion, processedProject.newProjectVersion);
}))).map(this::getSingleResult).collect(Collectors.toList());
}
ProjectCommandExecutor projectBuilder(ProcessedProject processedProject) {
@@ -206,45 +184,37 @@ public class PostReleaseActions implements Closeable {
return SERVICE.submit(() -> {
String key = e.getKey();
List<String> value = e.getValue();
log.info("Running version update for project [{}] and samples {}", key,
value);
log.info("Running version update for project [{}] and samples {}", key, value);
ProjectVersion projectVersionForReleaseTrain = projects.forName(key);
Projects postRelease = getPostReleaseProjects(projects);
log.info("Versions to update the samples with \n" + postRelease.stream()
.map(v -> "[" + v.projectName + " => " + v.version + "]")
.collect(Collectors.joining("\n")));
.map(v -> "[" + v.projectName + " => " + v.version + "]").collect(Collectors.joining("\n")));
return value.stream()
.map(url -> run(key, url,
() -> commitUpdatedProject(projects, key,
projectVersionForReleaseTrain, postRelease, url)))
() -> commitUpdatedProject(projects, key, projectVersionForReleaseTrain, postRelease, url)))
.map(this::getSingleResult).collect(Collectors.toList());
});
}
Projects getPostReleaseProjects(Projects projects) {
return projects.postReleaseSnapshotVersion(
this.properties.getMetaRelease().getProjectsToSkip());
return projects.postReleaseSnapshotVersion(this.properties.getMetaRelease().getProjectsToSkip());
}
private void commitUpdatedProject(Projects projects, String key,
ProjectVersion projectVersionForReleaseTrain, Projects postRelease,
String url) {
private void commitUpdatedProject(Projects projects, String key, ProjectVersion projectVersionForReleaseTrain,
Projects postRelease, String url) {
String releaseTrainVersion = projects.releaseTrain(this.properties).version;
String projectVersion = projects.forName(key).version;
log.info(
"Running version update for project [{}], url [{}], "
+ "release train version [{}] and project version [{}]",
key, url, releaseTrainVersion, projectVersion);
File file = this.projectGitHandler.cloneAndGuessBranch(url, releaseTrainVersion,
projectVersion);
File file = this.projectGitHandler.cloneAndGuessBranch(url, releaseTrainVersion, projectVersion);
Projects newPostRelease = new Projects(postRelease);
ProjectVersion newProjectVersion = newProjectVersion(file);
newPostRelease.add(newProjectVersion);
updateWithVersions(file, newPostRelease);
this.projectGitHandler.commit(file,
"Updated versions after [" + releaseTrainVersion + "] "
+ "release train and [" + projectVersionForReleaseTrain.version
+ "] [" + key + "] project release");
this.projectGitHandler.commit(file, "Updated versions after [" + releaseTrainVersion + "] "
+ "release train and [" + projectVersionForReleaseTrain.version + "] [" + key + "] project release");
this.projectGitHandler.pushCurrentBranch(file);
}
@@ -261,20 +231,17 @@ public class PostReleaseActions implements Closeable {
ProjectVersion projectVersion = ProjectVersion.notMavenProject(file);
String name = projectVersion.projectName;
String version = projectVersion.version;
log.warn(
"Exception occurred while trying to read the pom file. Will assume that the project name is ["
+ name + "] and version [" + version + "]",
ex);
log.warn("Exception occurred while trying to read the pom file. Will assume that the project name is ["
+ name + "] and version [" + version + "]", ex);
return projectVersion;
}
}
private void updateWithVersions(File file, Projects newPostRelease) {
ReleaserProperties updatedProperties = updatedProperties(file);
this.projectPomUpdater.updateProjectFromReleaseTrain(file, newPostRelease,
this.projectPomUpdater.updateProjectFromReleaseTrain(file, newPostRelease, newProjectVersion(file), false);
this.gradleUpdater.updateProjectFromReleaseTrain(updatedProperties, file, newPostRelease,
newProjectVersion(file), false);
this.gradleUpdater.updateProjectFromReleaseTrain(updatedProperties, file,
newPostRelease, newProjectVersion(file), false);
}
private ProjectAndFuture run(String key, String url, Runnable runnable) {
@@ -293,8 +260,7 @@ public class PostReleaseActions implements Closeable {
return new ProjectUrlAndException(projectAndFuture.key, projectAndFuture.url, e);
}
private List<ProjectUrlAndException> getResult(
Future<List<ProjectUrlAndException>> future) {
private List<ProjectUrlAndException> getResult(Future<List<ProjectUrlAndException>> future) {
try {
return future.get(10, TimeUnit.MINUTES);
}
@@ -309,11 +275,9 @@ public class PostReleaseActions implements Closeable {
* @return result of the execution
*/
public ExecutionResult generateReleaseTrainDocumentation(Projects projects) {
if (!this.properties.getGit().isUpdateReleaseTrainDocs()
|| !this.properties.getMetaRelease().isEnabled()) {
log.info(
"Will not update the release train documentation, since the switch to do so "
+ "is off. Set [releaser.git.update-release-train-docs] to [true] to change that");
if (!this.properties.getGit().isUpdateReleaseTrainDocs() || !this.properties.getMetaRelease().isEnabled()) {
log.info("Will not update the release train documentation, since the switch to do so "
+ "is off. Set [releaser.git.update-release-train-docs] to [true] to change that");
return ExecutionResult.skipped();
}
ProjectVersion releaseTrain = projects.releaseTrain(this.properties);
@@ -328,16 +292,14 @@ public class PostReleaseActions implements Closeable {
}
ReleaserProperties projectProps = projectProps(file);
String releaseTrainVersion = releaseTrain.version;
this.projectCommandExecutor.generateReleaseTrainDocs(projectProps,
releaseTrainVersion, file.getAbsolutePath());
this.projectCommandExecutor.generateReleaseTrainDocs(projectProps, releaseTrainVersion, file.getAbsolutePath());
return ExecutionResult.success();
}
private Projects addVersionForTestsProject(Projects projects,
ProjectVersion projectVersion, String releaseTrainVersion) {
private Projects addVersionForTestsProject(Projects projects, ProjectVersion projectVersion,
String releaseTrainVersion) {
Projects newProjects = new Projects(projects);
newProjects
.add(new ProjectVersion(projectVersion.projectName, releaseTrainVersion));
newProjects.add(new ProjectVersion(projectVersion.projectName, releaseTrainVersion));
return newProjects;
}

View File

@@ -44,8 +44,8 @@ public class ProcessedProject implements Serializable {
*/
public final ProjectVersion originalProjectVersion;
public ProcessedProject(ReleaserProperties propertiesForProject,
ProjectVersion newProjectVersion, ProjectVersion originalProjectVersion) {
public ProcessedProject(ReleaserProperties propertiesForProject, ProjectVersion newProjectVersion,
ProjectVersion originalProjectVersion) {
this.propertiesForProject = propertiesForProject;
this.newProjectVersion = newProjectVersion;
this.originalProjectVersion = originalProjectVersion;
@@ -53,9 +53,8 @@ public class ProcessedProject implements Serializable {
@Override
public String toString() {
return "ProcessedProject{" + "name=" + this.newProjectVersion.projectName
+ ",version=" + this.newProjectVersion.version + '}'
+ ",originalProjectVersion=" + this.originalProjectVersion + '}';
return "ProcessedProject{" + "name=" + this.newProjectVersion.projectName + ",version="
+ this.newProjectVersion.version + '}' + ",originalProjectVersion=" + this.originalProjectVersion + '}';
}
public String projectName() {

View File

@@ -55,8 +55,7 @@ public class Project {
if (this.name != null ? !this.name.equals(project.name) : project.name != null) {
return false;
}
return this.version != null ? this.version.equals(project.version)
: project.version == null;
return this.version != null ? this.version.equals(project.version) : project.version == null;
}
@Override

View File

@@ -48,8 +48,7 @@ import org.springframework.util.StringUtils;
*/
public class ProjectCommandExecutor {
private static final Logger log = LoggerFactory
.getLogger(ProjectCommandExecutor.class);
private static final Logger log = LoggerFactory.getLogger(ProjectCommandExecutor.class);
private static final String VERSION_MUSTACHE = "{{version}}";
@@ -59,8 +58,7 @@ public class ProjectCommandExecutor {
public void build(ReleaserProperties properties, ProjectVersion originalVersion,
ProjectVersion versionFromReleaseTrain) {
build(properties, originalVersion, versionFromReleaseTrain,
properties.getWorkingDir());
build(properties, originalVersion, versionFromReleaseTrain, properties.getWorkingDir());
}
public String version(ReleaserProperties properties) {
@@ -73,8 +71,7 @@ public class ProjectCommandExecutor {
new CommandPicker(properties, properties.getWorkingDir()).groupId());
}
private String executeCommandWithOutput(ReleaserProperties properties,
String command) {
private String executeCommandWithOutput(ReleaserProperties properties, String command) {
try {
String projectRoot = properties.getWorkingDir();
String[] commands = command.split(" ");
@@ -91,27 +88,22 @@ public class ProjectCommandExecutor {
public void build(ReleaserProperties properties, ProjectVersion originalVersion,
ProjectVersion versionFromReleaseTrain, String projectRoot) {
try {
String command = new CommandPicker(properties, projectRoot)
.buildCommand(versionFromReleaseTrain);
String[] commands = replaceAllPlaceHolders(originalVersion,
versionFromReleaseTrain, command).split(" ");
String command = new CommandPicker(properties, projectRoot).buildCommand(versionFromReleaseTrain);
String[] commands = replaceAllPlaceHolders(originalVersion, versionFromReleaseTrain, command).split(" ");
runCommand(properties, projectRoot, commands);
assertNoHtmlFilesInDocsContainUnresolvedTags(projectRoot);
log.info("No HTML files from docs contain unresolved tags");
}
catch (Exception e) {
String message = properties + "\n" + originalVersion + "\n"
+ versionFromReleaseTrain + "\n" + projectRoot;
String message = properties + "\n" + originalVersion + "\n" + versionFromReleaseTrain + "\n" + projectRoot;
throw new IllegalStateException(message, e);
}
}
public void generateReleaseTrainDocs(ReleaserProperties properties, String version,
String projectRoot) {
public void generateReleaseTrainDocs(ReleaserProperties properties, String version, String projectRoot) {
try {
String updatedCommand = new CommandPicker(properties, projectRoot)
.generateReleaseTrainDocsCommand(
new ProjectVersion(new File(projectRoot)))
.generateReleaseTrainDocsCommand(new ProjectVersion(new File(projectRoot)))
.replace(VERSION_MUSTACHE, version);
runCommand(properties, projectRoot, updatedCommand.split(" "));
assertNoHtmlFilesInDocsContainUnresolvedTags(properties.getWorkingDir());
@@ -135,25 +127,20 @@ public class ProjectCommandExecutor {
}
}
public void deploy(ReleaserProperties properties, ProjectVersion originalVersion,
ProjectVersion version) {
public void deploy(ReleaserProperties properties, ProjectVersion originalVersion, ProjectVersion version) {
doDeploy(properties, originalVersion, version,
new CommandPicker(properties, properties.getWorkingDir())
.deployCommand(version));
new CommandPicker(properties, properties.getWorkingDir()).deployCommand(version));
}
public void deployGuides(ReleaserProperties properties,
ProjectVersion originalVersion, ProjectVersion version) {
public void deployGuides(ReleaserProperties properties, ProjectVersion originalVersion, ProjectVersion version) {
doDeploy(properties, originalVersion, version,
new CommandPicker(properties, properties.getWorkingDir())
.deployGuidesCommand(version));
new CommandPicker(properties, properties.getWorkingDir()).deployGuidesCommand(version));
}
private void doDeploy(ReleaserProperties properties, ProjectVersion originalVersion,
ProjectVersion changedVersion, String command) {
private void doDeploy(ReleaserProperties properties, ProjectVersion originalVersion, ProjectVersion changedVersion,
String command) {
try {
String replacedCommand = replaceAllPlaceHolders(originalVersion,
changedVersion, command);
String replacedCommand = replaceAllPlaceHolders(originalVersion, changedVersion, command);
String[] commands = replacedCommand.split(" ");
runCommand(properties, commands);
log.info("The project has successfully been deployed");
@@ -167,21 +154,16 @@ public class ProjectCommandExecutor {
runCommand(properties, properties.getWorkingDir(), commands);
}
private void runCommand(ReleaserProperties properties, String projectRoot,
String[] commands) {
private void runCommand(ReleaserProperties properties, String projectRoot, String[] commands) {
String[] substitutedCommands = substituteSystemProps(properties, commands);
long waitTimeInMinutes = new CommandPicker(properties, projectRoot)
.waitTimeInMinutes();
long waitTimeInMinutes = new CommandPicker(properties, projectRoot).waitTimeInMinutes();
executor(projectRoot).runCommand(substitutedCommands, waitTimeInMinutes);
}
private String captureCommandOutput(ReleaserProperties properties, String projectRoot,
String[] commands) {
private String captureCommandOutput(ReleaserProperties properties, String projectRoot, String[] commands) {
String[] substitutedCommands = substituteSystemProps(properties, commands);
long waitTimeInMinutes = new CommandPicker(properties, projectRoot)
.waitTimeInMinutes();
return executor(projectRoot).runCommandWithOutput(substitutedCommands,
waitTimeInMinutes);
long waitTimeInMinutes = new CommandPicker(properties, projectRoot).waitTimeInMinutes();
return executor(projectRoot).runCommandWithOutput(substitutedCommands, waitTimeInMinutes);
}
ReleaserProcessExecutor executor(String workDir) {
@@ -191,15 +173,11 @@ public class ProjectCommandExecutor {
public void publishDocs(ReleaserProperties properties, ProjectVersion originalVersion,
ProjectVersion changedVersion) {
try {
String providedCommand = new CommandPicker(properties)
.publishDocsCommand(changedVersion);
log.info("Executing command(s) for publishing docs " + providedCommand + " / "
+ properties);
String[] providedCommands = StringUtils
.delimitedListToStringArray(providedCommand, "&&");
String providedCommand = new CommandPicker(properties).publishDocsCommand(changedVersion);
log.info("Executing command(s) for publishing docs " + providedCommand + " / " + properties);
String[] providedCommands = StringUtils.delimitedListToStringArray(providedCommand, "&&");
for (String command : providedCommands) {
command = replaceAllPlaceHolders(originalVersion, changedVersion,
command.trim());
command = replaceAllPlaceHolders(originalVersion, changedVersion, command.trim());
String[] commands = command.split(" ");
runCommand(properties, commands);
}
@@ -210,8 +188,8 @@ public class ProjectCommandExecutor {
}
}
private String replaceAllPlaceHolders(ProjectVersion originalVersion,
ProjectVersion changedVersion, String command) {
private String replaceAllPlaceHolders(ProjectVersion originalVersion, ProjectVersion changedVersion,
String command) {
return command.replace(VERSION_MUSTACHE, changedVersion.version)
.replace(NEXT_VERSION_MUSTACHE, changedVersion.bumpedVersion())
.replace(OLD_VERSION_MUSTACHE, originalVersion.version);
@@ -221,24 +199,18 @@ public class ProjectCommandExecutor {
* We need to insert the system properties as a list of -Dkey=value entries instead of
* just pasting the String that contains these values.
*/
private String[] substituteSystemProps(ReleaserProperties properties,
String... commands) {
private String[] substituteSystemProps(ReleaserProperties properties, String... commands) {
String systemProperties = new CommandPicker(properties).systemProperties();
String systemPropertiesPlaceholder = new CommandPicker(properties)
.systemPropertiesPlaceholder();
String systemPropertiesPlaceholder = new CommandPicker(properties).systemPropertiesPlaceholder();
boolean containsSystemProps = systemProperties.contains("-D");
String[] splitSystemProps = StringUtils
.delimitedListToStringArray(systemProperties, "-D");
String[] splitSystemProps = StringUtils.delimitedListToStringArray(systemProperties, "-D");
// first element might be empty even though the second one contains values
if (splitSystemProps.length > 1) {
splitSystemProps = StringUtils.isEmpty(splitSystemProps[0])
? Arrays.copyOfRange(splitSystemProps, 1, splitSystemProps.length)
: splitSystemProps;
? Arrays.copyOfRange(splitSystemProps, 1, splitSystemProps.length) : splitSystemProps;
}
String[] systemPropsWithPrefix = containsSystemProps ? Arrays
.stream(splitSystemProps).map(s -> "-D" + s.trim())
.collect(Collectors.toList()).toArray(new String[splitSystemProps.length])
: splitSystemProps;
String[] systemPropsWithPrefix = containsSystemProps ? Arrays.stream(splitSystemProps).map(s -> "-D" + s.trim())
.collect(Collectors.toList()).toArray(new String[splitSystemProps.length]) : splitSystemProps;
final AtomicInteger index = new AtomicInteger(-1);
for (int i = 0; i < commands.length; i++) {
if (commands[i].contains(systemPropertiesPlaceholder)) {
@@ -249,8 +221,7 @@ public class ProjectCommandExecutor {
return toCommandList(systemPropsWithPrefix, index, commands);
}
private String[] toCommandList(String[] systemPropsWithPrefix, AtomicInteger index,
String[] commands) {
private String[] toCommandList(String[] systemPropsWithPrefix, AtomicInteger index, String[] commands) {
List<String> commandsList = new ArrayList<>(Arrays.asList(commands));
List<String> systemPropsList = Arrays.asList(systemPropsWithPrefix);
if (index.get() != -1) {
@@ -273,8 +244,7 @@ public class ProjectCommandExecutor {
class ReleaserProcessExecutor {
private static final Logger log = LoggerFactory
.getLogger(ReleaserProcessExecutor.class);
private static final Logger log = LoggerFactory.getLogger(ReleaserProcessExecutor.class);
private static String[] OS_OPERATORS = { "|", "<", ">", "||", "&&" };
@@ -294,17 +264,15 @@ class ReleaserProcessExecutor {
private ProcessResult doRunCommand(String[] commands, long waitTimeInMinutes) {
String workingDir = this.workingDir;
log.info("Will run the command from [{}] and wait for result for [{}] minutes",
workingDir, waitTimeInMinutes);
log.info("Will run the command from [{}] and wait for result for [{}] minutes", workingDir, waitTimeInMinutes);
try {
ProcessExecutor processExecutor = processExecutor(commands, workingDir)
.timeout(waitTimeInMinutes, TimeUnit.MINUTES);
ProcessExecutor processExecutor = processExecutor(commands, workingDir).timeout(waitTimeInMinutes,
TimeUnit.MINUTES);
final ProcessResult processResult = doExecute(processExecutor);
int processExitValue = processResult.getExitValue();
if (processExitValue != 0) {
throw new IllegalStateException("The process has exited with exit code ["
+ processExitValue + "]");
throw new IllegalStateException("The process has exited with exit code [" + processExitValue + "]");
}
return processResult;
}
@@ -312,10 +280,8 @@ class ReleaserProcessExecutor {
throw new IllegalStateException("Process execution failed", e);
}
catch (TimeoutException e) {
log.error("The command hasn't managed to finish in [{}] minutes",
waitTimeInMinutes);
throw new IllegalStateException("Process waiting time of ["
+ waitTimeInMinutes + "] minutes exceeded", e);
log.error("The command hasn't managed to finish in [{}] minutes", waitTimeInMinutes);
throw new IllegalStateException("Process waiting time of [" + waitTimeInMinutes + "] minutes exceeded", e);
}
}
@@ -331,15 +297,13 @@ class ReleaserProcessExecutor {
commandsToRun = commandToExecute(lastArg);
}
log.info("Will run the command [{}]", Arrays.toString(commandsToRun));
return new ProcessExecutor().command(commandsToRun).destroyOnExit()
.readOutput(true)
return new ProcessExecutor().command(commandsToRun).destroyOnExit().readOutput(true)
// releaser.commands logger should be configured to redirect
// only to a file (with additivity=false). ideally the root logger should
// append to same file on top of whatever root appender, so that file
// contains the most output
.redirectOutputAlsoTo(Slf4jStream.of("releaser.commands").asInfo())
.redirectErrorAlsoTo(Slf4jStream.of("releaser.commands").asWarn())
.directory(new File(workingDir));
.redirectErrorAlsoTo(Slf4jStream.of("releaser.commands").asWarn()).directory(new File(workingDir));
}
String[] commandToExecute(String lastArg) {
@@ -389,12 +353,10 @@ class CommandPicker {
public String publishDocsCommand(ProjectVersion version) {
if (projectType == ProjectType.GRADLE) {
return mavenCommandWithSystemProps(
releaserProperties.getGradle().getPublishDocsCommand(), version);
return mavenCommandWithSystemProps(releaserProperties.getGradle().getPublishDocsCommand(), version);
}
else if (projectType == ProjectType.MAVEN) {
return mavenCommandWithSystemProps(
releaserProperties.getMaven().getPublishDocsCommand(), version);
return mavenCommandWithSystemProps(releaserProperties.getMaven().getPublishDocsCommand(), version);
}
return releaserProperties.getBash().getPublishDocsCommand();
}
@@ -411,12 +373,10 @@ class CommandPicker {
String buildCommand(ProjectVersion version) {
if (projectType == ProjectType.GRADLE) {
return gradleCommandWithSystemProps(
releaserProperties.getGradle().getBuildCommand());
return gradleCommandWithSystemProps(releaserProperties.getGradle().getBuildCommand());
}
else if (projectType == ProjectType.MAVEN) {
return mavenCommandWithSystemProps(
releaserProperties.getMaven().getBuildCommand(), version);
return mavenCommandWithSystemProps(releaserProperties.getMaven().getBuildCommand(), version);
}
return bashCommandWithSystemProps(releaserProperties.getBash().getBuildCommand());
}
@@ -426,9 +386,8 @@ class CommandPicker {
if (projectType == ProjectType.GRADLE) {
return "./gradlew properties | grep version: | awk '{print $2}'";
}
return "./mvnw -q" + " -Dexec.executable=\"echo\""
+ " -Dexec.args=\"\\${project.version}\"" + " --non-recursive"
+ " org.codehaus.mojo:exec-maven-plugin:1.3.1:exec | tail -1";
return "./mvnw -q" + " -Dexec.executable=\"echo\"" + " -Dexec.args=\"\\${project.version}\""
+ " --non-recursive" + " org.codehaus.mojo:exec-maven-plugin:1.3.1:exec | tail -1";
}
String groupId() {
@@ -436,50 +395,40 @@ class CommandPicker {
if (projectType == ProjectType.GRADLE) {
return "./gradlew groupId -q | tail -1";
}
return "./mvnw -q" + " -Dexec.executable=\"echo\""
+ " -Dexec.args=\"\\${project.groupId}\"" + " --non-recursive"
+ " org.codehaus.mojo:exec-maven-plugin:1.3.1:exec | tail -1";
return "./mvnw -q" + " -Dexec.executable=\"echo\"" + " -Dexec.args=\"\\${project.groupId}\""
+ " --non-recursive" + " org.codehaus.mojo:exec-maven-plugin:1.3.1:exec | tail -1";
}
String generateReleaseTrainDocsCommand(ProjectVersion version) {
if (projectType == ProjectType.GRADLE) {
return gradleCommandWithSystemProps(
releaserProperties.getGradle().getGenerateReleaseTrainDocsCommand());
return gradleCommandWithSystemProps(releaserProperties.getGradle().getGenerateReleaseTrainDocsCommand());
}
else if (projectType == ProjectType.MAVEN) {
return mavenCommandWithSystemProps(
releaserProperties.getMaven().getGenerateReleaseTrainDocsCommand(),
return mavenCommandWithSystemProps(releaserProperties.getMaven().getGenerateReleaseTrainDocsCommand(),
version);
}
return bashCommandWithSystemProps(
releaserProperties.getBash().getGenerateReleaseTrainDocsCommand());
return bashCommandWithSystemProps(releaserProperties.getBash().getGenerateReleaseTrainDocsCommand());
}
String deployCommand(ProjectVersion version) {
if (projectType == ProjectType.GRADLE) {
return gradleCommandWithSystemProps(
releaserProperties.getGradle().getDeployCommand());
return gradleCommandWithSystemProps(releaserProperties.getGradle().getDeployCommand());
}
else if (projectType == ProjectType.MAVEN) {
return mavenCommandWithSystemProps(
releaserProperties.getMaven().getDeployCommand(), version);
return mavenCommandWithSystemProps(releaserProperties.getMaven().getDeployCommand(), version);
}
return bashCommandWithSystemProps(
releaserProperties.getBash().getDeployCommand());
return bashCommandWithSystemProps(releaserProperties.getBash().getDeployCommand());
}
String deployGuidesCommand(ProjectVersion version) {
if (projectType == ProjectType.GRADLE) {
return gradleCommandWithSystemProps(
releaserProperties.getGradle().getDeployGuidesCommand());
return gradleCommandWithSystemProps(releaserProperties.getGradle().getDeployGuidesCommand());
}
else if (projectType == ProjectType.MAVEN) {
return mavenCommandWithSystemProps(
releaserProperties.getMaven().getDeployGuidesCommand(), version,
return mavenCommandWithSystemProps(releaserProperties.getMaven().getDeployGuidesCommand(), version,
MavenProfile.GUIDES, MavenProfile.INTEGRATION);
}
return bashCommandWithSystemProps(
releaserProperties.getBash().getDeployGuidesCommand());
return bashCommandWithSystemProps(releaserProperties.getBash().getDeployGuidesCommand());
}
long waitTimeInMinutes() {
@@ -499,13 +448,11 @@ class CommandPicker {
return command + " " + ReleaserProperties.Gradle.SYSTEM_PROPS_PLACEHOLDER;
}
private String mavenCommandWithSystemProps(String command, ProjectVersion version,
MavenProfile... profiles) {
private String mavenCommandWithSystemProps(String command, ProjectVersion version, MavenProfile... profiles) {
if (command.contains(ReleaserProperties.Maven.SYSTEM_PROPS_PLACEHOLDER)) {
return appendMavenProfile(command, version, profiles);
}
return appendMavenProfile(command, version, profiles) + " "
+ ReleaserProperties.Maven.SYSTEM_PROPS_PLACEHOLDER;
return appendMavenProfile(command, version, profiles) + " " + ReleaserProperties.Maven.SYSTEM_PROPS_PLACEHOLDER;
}
private String bashCommandWithSystemProps(String command) {
@@ -515,22 +462,18 @@ class CommandPicker {
return command + " " + ReleaserProperties.Maven.SYSTEM_PROPS_PLACEHOLDER;
}
private String appendMavenProfile(String command, ProjectVersion version,
MavenProfile... profiles) {
private String appendMavenProfile(String command, ProjectVersion version, MavenProfile... profiles) {
String trimmedCommand = command.trim();
if (version.isMilestone() || version.isRc()) {
log.info("Adding the milestone profile to the Maven build");
return withProfile(trimmedCommand, MavenProfile.MILESTONE.asMavenProfile(),
profiles);
return withProfile(trimmedCommand, MavenProfile.MILESTONE.asMavenProfile(), profiles);
}
else if (version.isRelease() || version.isServiceRelease()) {
log.info("Adding the central profile to the Maven build");
return withProfile(trimmedCommand, MavenProfile.CENTRAL.asMavenProfile(),
profiles);
return withProfile(trimmedCommand, MavenProfile.CENTRAL.asMavenProfile(), profiles);
}
else {
log.info("The version [" + version.toString()
+ "] is a snapshot one - will not add any profiles");
log.info("The version [" + version.toString() + "] is a snapshot one - will not add any profiles");
}
return trimmedCommand;
}
@@ -548,8 +491,7 @@ class CommandPicker {
}
private String profilesToString(MavenProfile... profiles) {
return Arrays.stream(profiles).map(profile -> "-P" + profile)
.collect(Collectors.joining(" "));
return Arrays.stream(profiles).map(profile -> "-P" + profile).collect(Collectors.joining(" "));
}
private enum ProjectType {
@@ -602,10 +544,8 @@ class HtmlFileWalker extends SimpleFileVisitor<Path> {
@Override
public FileVisitResult visitFile(Path path, BasicFileAttributes attr) {
File file = path.toFile();
if (file.getName().endsWith(HTML_EXTENSION)
&& asString(file).contains("Unresolved")) {
throw new IllegalStateException(
"File [" + file + "] contains a tag that wasn't resolved properly");
if (file.getName().endsWith(HTML_EXTENSION) && asString(file).contains("Unresolved")) {
throw new IllegalStateException("File [" + file + "] contains a tag that wasn't resolved properly");
}
return FileVisitResult.CONTINUE;
}

View File

@@ -51,8 +51,7 @@ public class ProjectVersion implements Comparable<ProjectVersion>, Serializable
private static final Logger log = LoggerFactory.getLogger(ProjectVersion.class);
private static final Pattern SNAPSHOT_PATTERN = Pattern
.compile("^.*[\\.|\\-](BUILD-)?SNAPSHOT.*$");
private static final Pattern SNAPSHOT_PATTERN = Pattern.compile("^.*[\\.|\\-](BUILD-)?SNAPSHOT.*$");
private static final String MILESTONE_REGEX = "^.*[\\.|\\-]M[0-9]+.*$";
@@ -62,12 +61,11 @@ public class ProjectVersion implements Comparable<ProjectVersion>, Serializable
private static final String SR_REGEX = "^.*[\\.|\\-]SR[0-9]+.*$";
private static final Pattern SEMVER_PATTERN = Pattern
.compile("(\\d+)\\.(\\d+)\\.(\\d+)");
private static final Pattern SEMVER_PATTERN = Pattern.compile("(\\d+)\\.(\\d+)\\.(\\d+)");
private static final List<Pattern> VALID_PATTERNS = Arrays.asList(SNAPSHOT_PATTERN,
Pattern.compile(MILESTONE_REGEX), Pattern.compile(RC_REGEX),
Pattern.compile(RELEASE_REGEX), Pattern.compile(SR_REGEX));
Pattern.compile(MILESTONE_REGEX), Pattern.compile(RC_REGEX), Pattern.compile(RELEASE_REGEX),
Pattern.compile(SR_REGEX));
/**
* Name of the project.
@@ -164,8 +162,7 @@ public class ProjectVersion implements Comparable<ProjectVersion>, Serializable
if (StringUtils.hasText(model.getGroupId())) {
return model.getGroupId();
}
if (model.getParent() != null
&& StringUtils.hasText(model.getParent().getGroupId())) {
if (model.getParent() != null && StringUtils.hasText(model.getParent().getGroupId())) {
return model.getParent().getGroupId();
}
return "";
@@ -222,8 +219,7 @@ public class ProjectVersion implements Comparable<ProjectVersion>, Serializable
int indexOfFirstHyphen = version.indexOf("-");
boolean buildSnapshot = version.endsWith("BUILD-SNAPSHOT");
if (numberOfHyphens == 1 && !buildSnapshot
|| (numberOfHyphens > 1 && buildSnapshot)) {
if (numberOfHyphens == 1 && !buildSnapshot || (numberOfHyphens > 1 && buildSnapshot)) {
// Dysprosium or 1.0.0
String versionName = version.substring(0, indexOfFirstHyphen);
boolean hasDots = versionName.contains(".");
@@ -243,8 +239,7 @@ public class ProjectVersion implements Comparable<ProjectVersion>, Serializable
return SplitVersion.hyphen(newArray);
}
else {
throw new UnsupportedOperationException(
"Unknown version [" + version + "]");
throw new UnsupportedOperationException("Unknown version [" + version + "]");
}
}
return null;
@@ -319,8 +314,7 @@ public class ProjectVersion implements Comparable<ProjectVersion>, Serializable
}
public String majorAndMinor() {
return this.assertVersion().major + this.assertVersion().delimiter
+ this.assertVersion().minor;
return this.assertVersion().major + this.assertVersion().delimiter + this.assertVersion().minor;
}
/**
@@ -345,15 +339,14 @@ public class ProjectVersion implements Comparable<ProjectVersion>, Serializable
patch = Integer.parseInt(splitVersion.patch);
}
catch (NumberFormatException nfe) {
throw new IllegalArgumentException("Version " + this.version
+ " doesn't contain a numerical PATCH number", nfe);
throw new IllegalArgumentException("Version " + this.version + " doesn't contain a numerical PATCH number",
nfe);
}
if (patch == 0) {
return Optional.empty();
}
return Optional.of(prefix + splitVersion.major + splitVersion.delimiter
+ splitVersion.minor + splitVersion.delimiter + (patch - 1)
+ splitVersion.delimiter + suffix);
return Optional.of(prefix + splitVersion.major + splitVersion.delimiter + splitVersion.minor
+ splitVersion.delimiter + (patch - 1) + splitVersion.delimiter + suffix);
}
/**
@@ -368,8 +361,7 @@ public class ProjectVersion implements Comparable<ProjectVersion>, Serializable
* previous MAJOR.MINOR, or empty if current MINOR is 0
* @see #computePreviousMajorTagPattern(String, String)
*/
public Optional<Pattern> computePreviousMinorTagPattern(String prefix,
String suffix) {
public Optional<Pattern> computePreviousMinorTagPattern(String prefix, String suffix) {
SplitVersion splitVersion = this.assertVersion();
if (suffix.isEmpty()) {
suffix = splitVersion.suffix;
@@ -380,17 +372,15 @@ public class ProjectVersion implements Comparable<ProjectVersion>, Serializable
minor = Integer.parseInt(splitVersion.minor);
}
catch (NumberFormatException nfe) {
throw new IllegalArgumentException("Version " + this.version
+ " doesn't contain a numerical MINOR number", nfe);
throw new IllegalArgumentException("Version " + this.version + " doesn't contain a numerical MINOR number",
nfe);
}
if (minor == 0) {
return Optional.empty();
}
Pattern p = Pattern
.compile(Pattern
.quote(prefix + splitVersion.major + splitVersion.delimiter
+ (minor - 1) + splitVersion.delimiter)
+ "\\d+" + quotedSuffix);
Pattern p = Pattern.compile(Pattern
.quote(prefix + splitVersion.major + splitVersion.delimiter + (minor - 1) + splitVersion.delimiter)
+ "\\d+" + quotedSuffix);
return Optional.of(p);
}
@@ -414,16 +404,14 @@ public class ProjectVersion implements Comparable<ProjectVersion>, Serializable
major = Integer.parseInt(splitVersion.major);
}
catch (NumberFormatException nfe) {
throw new IllegalArgumentException("Version " + this.version
+ " doesn't contain a numerical MAJOR number", nfe);
throw new IllegalArgumentException("Version " + this.version + " doesn't contain a numerical MAJOR number",
nfe);
}
if (major == 0) {
throw new IllegalArgumentException(
"Cannot compute previous MAJOR pattern with MAJOR of 0");
throw new IllegalArgumentException("Cannot compute previous MAJOR pattern with MAJOR of 0");
}
return Pattern.compile(
Pattern.quote(prefix + (major - 1) + splitVersion.delimiter) + "\\d+"
+ Pattern.quote(splitVersion.delimiter) + "\\d+" + quotedSuffix);
return Pattern.compile(Pattern.quote(prefix + (major - 1) + splitVersion.delimiter) + "\\d+"
+ Pattern.quote(splitVersion.delimiter) + "\\d+" + quotedSuffix);
}
public boolean isSnapshot() {
@@ -511,8 +499,7 @@ public class ProjectVersion implements Comparable<ProjectVersion>, Serializable
private ReleaseType releaseTypeForReleaseTrain() {
try {
SplitVersion splitVersion = assertVersion();
if (StringUtils.isEmpty(splitVersion.suffix)
&& StringUtils.hasText(splitVersion.patch)) {
if (StringUtils.isEmpty(splitVersion.suffix) && StringUtils.hasText(splitVersion.patch)) {
if ("0".equals(splitVersion.patch)) {
return ReleaseType.RELEASE;
}
@@ -537,8 +524,7 @@ public class ProjectVersion implements Comparable<ProjectVersion>, Serializable
SplitVersion thatSplit = that.assertVersion();
int releaseTypeComparison = this.releaseType.compareTo(that.releaseType);
boolean thisReleaseTypeHigher = releaseTypeComparison > 0;
boolean bothGa = this.isReleaseOrServiceRelease()
&& that.isReleaseOrServiceRelease();
boolean bothGa = this.isReleaseOrServiceRelease() && that.isReleaseOrServiceRelease();
// 1.0.1.M2 vs 1.0.0.RELEASE (x)
if (thisReleaseTypeHigher && !bothGa) {
return 1;
@@ -587,8 +573,7 @@ public class ProjectVersion implements Comparable<ProjectVersion>, Serializable
else if (thisVersion.isOldReleaseTrain()) {
return false;
}
return thisVersion.major.equals(thatVersion.major)
&& thisVersion.minor.equals(thatVersion.minor);
return thisVersion.major.equals(thatVersion.major) && thisVersion.minor.equals(thatVersion.minor);
}
private void assertVersionSet() {
@@ -598,8 +583,7 @@ public class ProjectVersion implements Comparable<ProjectVersion>, Serializable
}
public int compareToReleaseTrain(String version) {
return new TrainVersionNumber(this)
.compareTo(new TrainVersionNumber(new ProjectVersion(version)));
return new TrainVersionNumber(this).compareTo(new TrainVersionNumber(new ProjectVersion(version)));
}
/**
@@ -643,8 +627,7 @@ public class ProjectVersion implements Comparable<ProjectVersion>, Serializable
return Collections.singletonList(SNAPSHOT_PATTERN);
}
// treat like GA
return Arrays.asList(SNAPSHOT_PATTERN, Pattern.compile(MILESTONE_REGEX),
Pattern.compile(RC_REGEX));
return Arrays.asList(SNAPSHOT_PATTERN, Pattern.compile(MILESTONE_REGEX), Pattern.compile(RC_REGEX));
}
@Override
@@ -675,8 +658,7 @@ public class ProjectVersion implements Comparable<ProjectVersion>, Serializable
// 1.0.0.RELEASE
// 1.0.0-RELEASE
private SplitVersion(String major, String minor, String patch, String delimiter,
String suffix) {
private SplitVersion(String major, String minor, String patch, String delimiter, String suffix) {
this.major = major;
this.minor = minor;
this.patch = patch;
@@ -764,15 +746,13 @@ public class ProjectVersion implements Comparable<ProjectVersion>, Serializable
private SplitVersion fullVersionWithIncrementedPatch() {
int incrementedPatch = Integer.parseInt(patch) + 1;
return new SplitVersion(major, minor, Integer.toString(incrementedPatch),
delimiter, suffix);
return new SplitVersion(major, minor, Integer.toString(incrementedPatch), delimiter, suffix);
}
String print() {
// Finchley.SR2
if (StringUtils.isEmpty(minor)) {
return StringUtils.isEmpty(suffix) ? major
: String.format("%s%s%s", major, delimiter, suffix);
return StringUtils.isEmpty(suffix) ? major : String.format("%s%s%s", major, delimiter, suffix);
}
else if (StringUtils.isEmpty(suffix)) {
return String.format("%s.%s.%s", major, minor, patch);
@@ -790,8 +770,7 @@ public class ProjectVersion implements Comparable<ProjectVersion>, Serializable
private boolean tooFewElements() {
// 1 is wrong but Finchley-SR3 is ok
return StringUtils.isEmpty(minor) && StringUtils.isEmpty(patch)
&& StringUtils.isEmpty(suffix);
return StringUtils.isEmpty(minor) && StringUtils.isEmpty(patch) && StringUtils.isEmpty(suffix);
}
private SplitVersion withSnapshot() {
@@ -807,9 +786,8 @@ public class ProjectVersion implements Comparable<ProjectVersion>, Serializable
@Override
public String toString() {
return new ToStringCreator(this).append("major", major).append("minor", minor)
.append("patch", patch).append("delimiter", delimiter)
.append("suffix", suffix).toString();
return new ToStringCreator(this).append("major", major).append("minor", minor).append("patch", patch)
.append("delimiter", delimiter).append("suffix", suffix).toString();
}
@@ -859,11 +837,9 @@ public class ProjectVersion implements Comparable<ProjectVersion>, Serializable
}
}
private int compareWithOldTrain(ProjectVersion oldTrain,
ProjectVersion thatVersion) {
private int compareWithOldTrain(ProjectVersion oldTrain, ProjectVersion thatVersion) {
// Hoxton.SR5 > 2020.0.0-M5
if (oldTrain.isReleaseOrServiceRelease()
&& !thatVersion.isReleaseOrServiceRelease()) {
if (oldTrain.isReleaseOrServiceRelease() && !thatVersion.isReleaseOrServiceRelease()) {
return 1;
}
// Hoxton.SR5 < 2020.0.0-RELEASE

View File

@@ -40,8 +40,7 @@ public class Projects extends HashSet<ProjectVersion> {
@SuppressWarnings("unchecked")
public Projects(ProjectVersion... versions) {
addAll(new HashSet<>(Arrays.stream(versions).filter(Objects::nonNull)
.collect(Collectors.toList())));
addAll(new HashSet<>(Arrays.stream(versions).filter(Objects::nonNull).collect(Collectors.toList())));
}
public Projects(List<ProjectVersion> versions) {
@@ -62,36 +61,31 @@ public class Projects extends HashSet<ProjectVersion> {
});
Projects newProjects = new Projects(foundProjectsToSkip);
foundProjectsToBump.forEach(projectVersion -> newProjects
.add(new ProjectVersion(projectVersion.projectName,
projectVersion.postReleaseSnapshotVersion())));
.add(new ProjectVersion(projectVersion.projectName, projectVersion.postReleaseSnapshotVersion())));
newProjects.addAll(foundProjectsToSkip);
return newProjects;
}
private static IllegalStateException exception(Projects projects,
String projectName) {
return new IllegalStateException("Project with name [" + projectName
+ "] is not present in the list of projects [" + projects.asList()
+ "] . " + additionalErrorMessage(projectName));
private static IllegalStateException exception(Projects projects, String projectName) {
return new IllegalStateException(
"Project with name [" + projectName + "] is not present in the list of projects [" + projects.asList()
+ "] . " + additionalErrorMessage(projectName));
}
private static String additionalErrorMessage(String projectName) {
return "Either put it in the BOM or set it via the [--releaser.fixed-versions["
+ projectName + "]=1.0.0.RELEASE] property";
return "Either put it in the BOM or set it via the [--releaser.fixed-versions[" + projectName
+ "]=1.0.0.RELEASE] property";
}
public ProjectVersion releaseTrain(ReleaserProperties properties) {
return stream()
.filter(version -> version.projectName
.equals(properties.getMetaRelease().getReleaseTrainProjectName())
|| properties.getMetaRelease().getReleaseTrainDependencyNames()
.contains(version.projectName))
.filter(version -> version.projectName.equals(properties.getMetaRelease().getReleaseTrainProjectName())
|| properties.getMetaRelease().getReleaseTrainDependencyNames().contains(version.projectName))
.findFirst()
.orElseThrow(() -> new IllegalStateException("Projects " + this
+ " don't contain any of the following release train names ["
+ properties.getMetaRelease().getReleaseTrainProjectName()
+ "] or "
+ properties.getMetaRelease().getReleaseTrainDependencyNames()));
.orElseThrow(() -> new IllegalStateException(
"Projects " + this + " don't contain any of the following release train names ["
+ properties.getMetaRelease().getReleaseTrainProjectName() + "] or "
+ properties.getMetaRelease().getReleaseTrainDependencyNames()));
}
@Override
@@ -110,8 +104,7 @@ public class Projects extends HashSet<ProjectVersion> {
public Projects postReleaseSnapshotVersion(List<String> projectsToSkip) {
Projects projects = this.stream().filter(v -> projectsToSkip(projectsToSkip, v))
.collect(Collectors.toCollection(Projects::new));
Projects bumped = this.stream().map(
v -> new ProjectVersion(v.projectName, v.postReleaseSnapshotVersion()))
Projects bumped = this.stream().map(v -> new ProjectVersion(v.projectName, v.postReleaseSnapshotVersion()))
.collect(Collectors.toCollection(Projects::new));
Projects merged = new Projects(projects);
merged.addAll(bumped);
@@ -129,26 +122,21 @@ public class Projects extends HashSet<ProjectVersion> {
public ProjectVersion forFile(File projectRoot) {
final ProjectVersion thisProject = new ProjectVersion(projectRoot);
return this.stream()
.filter(projectVersion -> projectVersion.projectName
.equals(thisProject.projectName))
return this.stream().filter(projectVersion -> projectVersion.projectName.equals(thisProject.projectName))
.findFirst().orElseThrow(() -> exception(this, thisProject.projectName));
}
public ProjectVersion forName(String projectName) {
return this.stream()
.filter(projectVersion -> projectVersion.projectName.equals(projectName))
.findFirst().orElseThrow(() -> exception(this, projectName));
return this.stream().filter(projectVersion -> projectVersion.projectName.equals(projectName)).findFirst()
.orElseThrow(() -> exception(this, projectName));
}
public boolean containsProject(String projectName) {
return this.stream().anyMatch(
projectVersion -> projectVersion.projectName.equals(projectName));
return this.stream().anyMatch(projectVersion -> projectVersion.projectName.equals(projectName));
}
public List<ProjectVersion> forNameStartingWith(String projectName) {
return this.stream().filter(
projectVersion -> projectVersion.projectName.startsWith(projectName))
return this.stream().filter(projectVersion -> projectVersion.projectName.startsWith(projectName))
.collect(Collectors.toList());
}
@@ -162,14 +150,13 @@ public class Projects extends HashSet<ProjectVersion> {
}
public Set<Project> asProjects() {
return this.stream().map(projectVersion -> new Project(projectVersion.projectName,
projectVersion.version)).collect(Collectors.toSet());
return this.stream().map(projectVersion -> new Project(projectVersion.projectName, projectVersion.version))
.collect(Collectors.toSet());
}
@Override
public String toString() {
return stream().map(v -> "[" + v.projectName + "=>" + v.version + "]")
.collect(Collectors.joining("\n"));
return stream().map(v -> "[" + v.projectName + "=>" + v.version + "]").collect(Collectors.joining("\n"));
}
}

View File

@@ -61,14 +61,11 @@ public class Project {
@Override
public String toString() {
return "Project{" + "id='" + this.id + '\'' + ", name='" + this.name + '\''
+ ", repoUrl='" + this.repoUrl + '\'' + ", siteUrl='" + this.siteUrl
+ '\'' + ", category='" + this.category + '\'' + ", stackOverflowTags='"
+ this.stackOverflowTags + '\'' + ", projectReleases="
+ this.projectReleases + ", stackOverflowTagList="
+ this.stackOverflowTagList + ", aggregator=" + this.aggregator
+ ", rawBootConfig='" + this.rawBootConfig + '\'' + ", rawOverview='"
+ this.rawOverview + '\'' + '}';
return "Project{" + "id='" + this.id + '\'' + ", name='" + this.name + '\'' + ", repoUrl='" + this.repoUrl
+ '\'' + ", siteUrl='" + this.siteUrl + '\'' + ", category='" + this.category + '\''
+ ", stackOverflowTags='" + this.stackOverflowTags + '\'' + ", projectReleases=" + this.projectReleases
+ ", stackOverflowTagList=" + this.stackOverflowTagList + ", aggregator=" + this.aggregator
+ ", rawBootConfig='" + this.rawBootConfig + '\'' + ", rawOverview='" + this.rawOverview + '\'' + '}';
}
static class MostCurrentRelease {

View File

@@ -50,14 +50,12 @@ public class Release {
@Override
public String toString() {
return "Release{" + "releaseStatus='" + this.releaseStatus + '\''
+ ", refDocUrl='" + this.refDocUrl + '\'' + ", apiDocUrl='"
+ this.apiDocUrl + '\'' + ", groupId='" + this.groupId + '\''
+ ", artifactId='" + this.artifactId + '\'' + ", repository="
+ this.repository + ", version='" + this.version + '\'' + ", current="
+ this.current + ", generalAvailability=" + this.generalAvailability
+ ", preRelease=" + this.preRelease + ", versionDisplayName='"
+ this.versionDisplayName + '\'' + ", snapshot=" + this.snapshot + '}';
return "Release{" + "releaseStatus='" + this.releaseStatus + '\'' + ", refDocUrl='" + this.refDocUrl + '\''
+ ", apiDocUrl='" + this.apiDocUrl + '\'' + ", groupId='" + this.groupId + '\'' + ", artifactId='"
+ this.artifactId + '\'' + ", repository=" + this.repository + ", version='" + this.version + '\''
+ ", current=" + this.current + ", generalAvailability=" + this.generalAvailability + ", preRelease="
+ this.preRelease + ", versionDisplayName='" + this.versionDisplayName + '\'' + ", snapshot="
+ this.snapshot + '}';
}
}

View File

@@ -42,11 +42,10 @@ public class ReleaseUpdate {
@Override
public String toString() {
return "ReleaseUpdate{" + "groupId='" + this.groupId + '\'' + ", artifactId='"
+ this.artifactId + '\'' + ", version='" + this.version + '\''
+ ", releaseStatus='" + this.releaseStatus + '\'' + ", refDocUrl='"
+ this.refDocUrl + '\'' + ", apiDocUrl='" + this.apiDocUrl + '\''
+ ", repository=" + this.repository + '}';
return "ReleaseUpdate{" + "groupId='" + this.groupId + '\'' + ", artifactId='" + this.artifactId + '\''
+ ", version='" + this.version + '\'' + ", releaseStatus='" + this.releaseStatus + '\''
+ ", refDocUrl='" + this.refDocUrl + '\'' + ", apiDocUrl='" + this.apiDocUrl + '\'' + ", repository="
+ this.repository + '}';
}
}

View File

@@ -34,9 +34,8 @@ public class Repository {
@Override
public String toString() {
return "Repository{" + "id='" + this.id + '\'' + ", name='" + this.name + '\''
+ ", url='" + this.url + '\'' + ", snapshotsEnabled="
+ this.snapshotsEnabled + '}';
return "Repository{" + "id='" + this.id + '\'' + ", name='" + this.name + '\'' + ", url='" + this.url + '\''
+ ", snapshotsEnabled=" + this.snapshotsEnabled + '}';
}
}

View File

@@ -36,8 +36,7 @@ import org.springframework.web.client.RestTemplate;
*/
class RestTemplateSaganClient implements SaganClient {
private static final Logger log = LoggerFactory
.getLogger(RestTemplateSaganClient.class);
private static final Logger log = LoggerFactory.getLogger(RestTemplateSaganClient.class);
private final RestTemplate restTemplate;
@@ -50,26 +49,22 @@ class RestTemplateSaganClient implements SaganClient {
@Override
public Project getProject(String projectName) {
return this.restTemplate.getForObject(
this.baseUrl + "/project_metadata/{projectName}", Project.class,
return this.restTemplate.getForObject(this.baseUrl + "/project_metadata/{projectName}", Project.class,
projectName);
}
@Override
public Release getRelease(String projectName, String releaseVersion) {
return this.restTemplate.getForObject(
this.baseUrl
+ "/project_metadata/{projectName}/releases/{releaseVersion}",
Release.class, projectName, releaseVersion);
this.baseUrl + "/project_metadata/{projectName}/releases/{releaseVersion}", Release.class, projectName,
releaseVersion);
}
@Override
public Release deleteRelease(String projectName, String releaseVersion) {
ResponseEntity<Release> entity = this.restTemplate.exchange(
this.baseUrl
+ "/project_metadata/{projectName}/releases/{releaseVersion}",
HttpMethod.DELETE, new HttpEntity<>(""), Release.class, projectName,
releaseVersion);
this.baseUrl + "/project_metadata/{projectName}/releases/{releaseVersion}", HttpMethod.DELETE,
new HttpEntity<>(""), Release.class, projectName, releaseVersion);
Release release = entity.getBody();
log.info("Response from Sagan\n\n[{}] \n with body [{}]", entity, release);
return release;
@@ -78,12 +73,9 @@ class RestTemplateSaganClient implements SaganClient {
@Override
public Project updateRelease(String projectName, List<ReleaseUpdate> releaseUpdates) {
RequestEntity<List<ReleaseUpdate>> request = RequestEntity
.put(URI.create(
this.baseUrl + "/project_metadata/" + projectName + "/releases"))
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE)
.body(releaseUpdates);
ResponseEntity<Project> entity = this.restTemplate.exchange(request,
Project.class);
.put(URI.create(this.baseUrl + "/project_metadata/" + projectName + "/releases"))
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE).body(releaseUpdates);
ResponseEntity<Project> entity = this.restTemplate.exchange(request, Project.class);
Project project = entity.getBody();
log.info("Response from Sagan\n\n[{}] \n with body [{}]", entity, project);
return project;
@@ -93,10 +85,8 @@ class RestTemplateSaganClient implements SaganClient {
public Project patchProject(Project project) {
RequestEntity<Project> request = RequestEntity
.patch(URI.create(this.baseUrl + "/project_metadata/" + project.id))
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE)
.body(project);
ResponseEntity<Project> entity = this.restTemplate.exchange(request,
Project.class);
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE).body(project);
ResponseEntity<Project> entity = this.restTemplate.exchange(request, Project.class);
Project updatedProject = entity.getBody();
log.info("Response from Sagan\n\n[{}] \n with body [{}]", entity, updatedProject);
return updatedProject;

View File

@@ -19,11 +19,11 @@ package releaser.internal.sagan;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Collections;
import java.util.Comparator;
import java.util.Optional;
import java.util.stream.Collectors;
import edu.emory.mathcs.backport.java.util.Collections;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import releaser.internal.ReleaserProperties;
@@ -50,37 +50,30 @@ public class SaganUpdater {
this.releaserProperties = releaserProperties;
}
public ExecutionResult updateSagan(File projectFile, String branch,
ProjectVersion originalVersion, ProjectVersion currentVersion,
Projects projects) {
public ExecutionResult updateSagan(File projectFile, String branch, ProjectVersion originalVersion,
ProjectVersion currentVersion, Projects projects) {
if (!this.releaserProperties.getSagan().isUpdateSagan()) {
log.info("Will not update sagan, since the switch to do so "
+ "is off. Set [releaser.sagan.update-sagan] to [true] to change that");
return ExecutionResult.skipped();
}
ReleaseUpdate update = releaseUpdate(branch, originalVersion, currentVersion,
projects);
Exception updateReleaseException = updateSaganForNonSnapshot(branch,
originalVersion, currentVersion, projects);
ReleaseUpdate update = releaseUpdate(branch, originalVersion, currentVersion, projects);
Exception updateReleaseException = updateSaganForNonSnapshot(branch, originalVersion, currentVersion, projects);
if (updateReleaseException == null) {
log.info("Updating Sagan releases with \n\n{}", update);
try {
Project project = this.saganClient.updateRelease(
currentVersion.projectName, Collections.singletonList(update));
Optional<ProjectVersion> projectVersion = latestVersion(currentVersion,
project);
log.info("Found the following latest project version [{}]",
projectVersion);
Project project = this.saganClient.updateRelease(currentVersion.projectName,
Collections.singletonList(update));
Optional<ProjectVersion> projectVersion = latestVersion(currentVersion, project);
log.info("Found the following latest project version [{}]", projectVersion);
boolean present = projectVersion.isPresent();
if (present
&& currentVersionNewerOrEqual(currentVersion, projectVersion)) {
if (present && currentVersionNewerOrEqual(currentVersion, projectVersion)) {
updateDocumentationIfNecessary(projectFile, project);
}
else {
log.info(present
? "Latest version [" + projectVersion.get() + "] present and "
+ "the current version [" + currentVersion
+ "] is older than that one. " + "Will do nothing."
? "Latest version [" + projectVersion.get() + "] present and " + "the current version ["
+ currentVersion + "] is older than that one. " + "Will do nothing."
: "No latest version found. Will do nothing.");
return ExecutionResult.skipped();
}
@@ -91,23 +84,19 @@ public class SaganUpdater {
}
}
return updateReleaseException == null ? ExecutionResult.success()
: ExecutionResult.unstable(
new IllegalStateException(updateReleaseException.getMessage()));
: ExecutionResult.unstable(new IllegalStateException(updateReleaseException.getMessage()));
}
private void updateDocumentationIfNecessary(File projectFile, Project project) {
boolean shouldUpdate = false;
File docsModule = docsModule(projectFile);
File indexDoc = new File(docsModule,
this.releaserProperties.getSagan().getIndexSectionFileName());
File bootDoc = new File(docsModule,
this.releaserProperties.getSagan().getBootSectionFileName());
File indexDoc = new File(docsModule, this.releaserProperties.getSagan().getIndexSectionFileName());
File bootDoc = new File(docsModule, this.releaserProperties.getSagan().getBootSectionFileName());
if (indexDoc.exists()) {
log.debug("Index adoc file exists");
String fileText = fileToText(indexDoc);
if (StringUtils.hasText(fileText) && !fileText.equals(project.rawOverview)) {
log.info(
"Index adoc content differs from the previously stored, will update it");
log.info("Index adoc content differs from the previously stored, will update it");
project.rawOverview = fileText;
shouldUpdate = true;
}
@@ -115,10 +104,8 @@ public class SaganUpdater {
if (bootDoc.exists()) {
log.debug("Boot adoc file exists");
String fileText = fileToText(bootDoc);
if (StringUtils.hasText(fileText)
&& !fileText.equals(project.rawBootConfig)) {
log.info(
"Boot adoc content differs from the previously stored, will update it");
if (StringUtils.hasText(fileText) && !fileText.equals(project.rawBootConfig)) {
log.info("Boot adoc content differs from the previously stored, will update it");
project.rawBootConfig = fileText;
shouldUpdate = true;
}
@@ -133,8 +120,7 @@ public class SaganUpdater {
}
File docsModule(File projectFile) {
return new File(projectFile,
this.releaserProperties.getSagan().getDocsAdocsFile());
return new File(projectFile, this.releaserProperties.getSagan().getDocsAdocsFile());
}
private String fileToText(File file) {
@@ -146,29 +132,24 @@ public class SaganUpdater {
}
}
private Optional<ProjectVersion> latestVersion(ProjectVersion currentVersion,
Project project) {
private Optional<ProjectVersion> latestVersion(ProjectVersion currentVersion, Project project) {
if (project == null) {
return Optional.empty();
}
return project.projectReleases.stream().filter(release -> release.current)
.map(release -> new ProjectVersion(currentVersion.projectName,
release.version))
.map(release -> new ProjectVersion(currentVersion.projectName, release.version))
.max(Comparator.comparing(o -> o.version));
}
private boolean currentVersionNewerOrEqual(ProjectVersion currentVersion,
Optional<ProjectVersion> projectVersion) {
private boolean currentVersionNewerOrEqual(ProjectVersion currentVersion, Optional<ProjectVersion> projectVersion) {
return currentVersion.compareTo(projectVersion.get()) >= 0;
}
private Exception updateSaganForNonSnapshot(String branch,
ProjectVersion originalVersion, ProjectVersion version, Projects projects) {
private Exception updateSaganForNonSnapshot(String branch, ProjectVersion originalVersion, ProjectVersion version,
Projects projects) {
Exception updateReleaseException = null;
if (!version.isSnapshot()) {
log.info(
"Version is non snapshot [{}]. Will remove all older versions and mark this as current",
version);
log.info("Version is non snapshot [{}]. Will remove all older versions and mark this as current", version);
Project project = this.saganClient.getProject(version.projectName);
if (project != null) {
removeAllSameMinorVersions(version, project);
@@ -179,16 +160,12 @@ public class SaganUpdater {
try {
String bumpedSnapshot = toSnapshot(version.bumpedVersion());
ReleaseUpdate snapshotUpdate = releaseUpdate(branch, originalVersion,
new ProjectVersion(version.projectName, bumpedSnapshot),
projects);
log.info("Updating Sagan with bumped snapshot \n\n[{}]",
snapshotUpdate);
this.saganClient.updateRelease(version.projectName,
Collections.singletonList(snapshotUpdate));
new ProjectVersion(version.projectName, bumpedSnapshot), projects);
log.info("Updating Sagan with bumped snapshot \n\n[{}]", snapshotUpdate);
this.saganClient.updateRelease(version.projectName, Collections.singletonList(snapshotUpdate));
}
catch (Exception e) {
log.warn("Failed to update [" + version.projectName + "/" + snapshot
+ "] from Sagan", e);
log.warn("Failed to update [" + version.projectName + "/" + snapshot + "] from Sagan", e);
updateReleaseException = e;
}
}
@@ -197,10 +174,8 @@ public class SaganUpdater {
}
private void removeAllSameMinorVersions(ProjectVersion version, Project project) {
project.projectReleases.stream()
.filter(release -> version.isSameMinor(release.version))
.collect(Collectors.toList())
.forEach(release -> removeVersionFromSagan(version, release.version));
project.projectReleases.stream().filter(release -> version.isSameMinor(release.version))
.collect(Collectors.toList()).forEach(release -> removeVersionFromSagan(version, release.version));
}
private void removeVersionFromSagan(ProjectVersion version, String snapshot) {
@@ -209,13 +184,12 @@ public class SaganUpdater {
this.saganClient.deleteRelease(version.projectName, snapshot);
}
catch (Exception e) {
log.warn("Failed to remove [" + version.projectName + "/" + snapshot
+ "] from Sagan", e);
log.warn("Failed to remove [" + version.projectName + "/" + snapshot + "] from Sagan", e);
}
}
private ReleaseUpdate releaseUpdate(String branch, ProjectVersion originalVersion,
ProjectVersion version, Projects projects) {
private ReleaseUpdate releaseUpdate(String branch, ProjectVersion originalVersion, ProjectVersion version,
Projects projects) {
ReleaseUpdate update = new ReleaseUpdate();
update.groupId = originalVersion.groupId();
update.artifactId = version.projectName;
@@ -251,21 +225,18 @@ public class SaganUpdater {
}
private String releaseTrainVersion(Projects projects) {
String releaseTrainProjectName = this.releaserProperties.getMetaRelease()
.getReleaseTrainProjectName();
return projects.containsProject(releaseTrainProjectName)
? projects.forName(releaseTrainProjectName).version : "";
String releaseTrainProjectName = this.releaserProperties.getMetaRelease().getReleaseTrainProjectName();
return projects.containsProject(releaseTrainProjectName) ? projects.forName(releaseTrainProjectName).version
: "";
}
private String referenceUrl(String branch, ProjectVersion version,
Projects projects) {
private String referenceUrl(String branch, ProjectVersion version, Projects projects) {
String releaseTrainVersion = releaseTrainVersion(projects);
// up till Greenwich we have a different URL for docs
// if there's no release train, will assume that 2.2.x is the version that has the
// new docs
boolean hasReleaseTrainVersion = StringUtils.hasText(releaseTrainVersion);
boolean newDocs = hasReleaseTrainVersion
? releaseTrainVersion.toLowerCase().charAt(0) > 'g'
boolean newDocs = hasReleaseTrainVersion ? releaseTrainVersion.toLowerCase().charAt(0) > 'g'
: version.version.compareTo("2.2") > 0;
if (newDocs) {
return newReferenceUrl(branch, version);
@@ -276,28 +247,24 @@ public class SaganUpdater {
private String newReferenceUrl(String branch, ProjectVersion version) {
if (!version.isSnapshot()) {
// static/sleuth/{version}/
return "https://cloud.spring.io/spring-cloud-static/" + version.projectName
+ "/{version}/reference/html/";
return "https://cloud.spring.io/spring-cloud-static/" + version.projectName + "/{version}/reference/html/";
}
if (branch.toLowerCase().contains("main")) {
// sleuth/
return "https://cloud.spring.io/" + version.projectName + "/reference/html/";
}
// sleuth/1.1.x/
return "https://cloud.spring.io/" + version.projectName + "/" + branch
+ "/reference/html/";
return "https://cloud.spring.io/" + version.projectName + "/" + branch + "/reference/html/";
}
private String oldReferenceUrl(String branch, ProjectVersion version) {
if (!version.isSnapshot()) {
// static/sleuth/{version}/
return "https://cloud.spring.io/spring-cloud-static/" + version.projectName
+ "/{version}/";
return "https://cloud.spring.io/spring-cloud-static/" + version.projectName + "/{version}/";
}
if (branch.toLowerCase().contains("main")) {
// sleuth/
return "https://cloud.spring.io/" + version.projectName + "/"
+ version.projectName + ".html";
return "https://cloud.spring.io/" + version.projectName + "/" + version.projectName + ".html";
}
// sleuth/1.1.x/
return "https://cloud.spring.io/" + version.projectName + "/" + branch + "/";

View File

@@ -46,8 +46,7 @@ public class BuildUnstableException extends RuntimeException implements Serializ
*/
public static final String EXIT_CODE = "BUILD_UNSTABLE";
private static final Logger log = LoggerFactory
.getLogger(BuildUnstableException.class);
private static final Logger log = LoggerFactory.getLogger(BuildUnstableException.class);
/**
* List of exceptions causing this instability.
@@ -61,8 +60,7 @@ public class BuildUnstableException extends RuntimeException implements Serializ
}
public BuildUnstableException(String message, List<Throwable> throwables) {
this(throwables.stream().map(BuildUnstableException::breakReferenceChain)
.collect(Collectors.toList()));
this(throwables.stream().map(BuildUnstableException::breakReferenceChain).collect(Collectors.toList()));
log.warn("\n\n" + DESCRIPTION + message + " with causes " + throwables);
}
@@ -72,8 +70,7 @@ public class BuildUnstableException extends RuntimeException implements Serializ
private static Throwable breakReferenceChain(Throwable cause) {
if (cause instanceof HttpServerErrorException) {
return new RuntimeException(
"[Breaking self reference chain] " + cause.toString());
return new RuntimeException("[Breaking self reference chain] " + cause.toString());
}
return cause;
}

View File

@@ -65,23 +65,20 @@ public class ExecutionResult implements Serializable {
}
public static ExecutionResult failure(List<Exception> throwables) {
return new ExecutionResult(throwables.stream()
.map(ExecutionResult::breakReferenceChain).collect(Collectors.toList()));
return new ExecutionResult(
throwables.stream().map(ExecutionResult::breakReferenceChain).collect(Collectors.toList()));
}
private static Exception breakReferenceChain(Exception cause) {
if (cause instanceof HttpServerErrorException
|| cause instanceof HttpClientErrorException) {
if (cause instanceof HttpServerErrorException || cause instanceof HttpClientErrorException) {
System.out.println("Breaking the reference chain. . . i think");
return new RuntimeException(
"[Breaking self reference chain] " + cause.toString());
return new RuntimeException("[Breaking self reference chain] " + cause.toString());
}
return cause;
}
public static ExecutionResult unstable(Exception ex) {
return new ExecutionResult(ex instanceof BuildUnstableException ? ex
: new BuildUnstableException(ex));
return new ExecutionResult(ex instanceof BuildUnstableException ? ex : new BuildUnstableException(ex));
}
public static ExecutionResult skipped() {
@@ -110,18 +107,17 @@ public class ExecutionResult implements Serializable {
}
public boolean isUnstable() {
return !this.exceptions.isEmpty() && this.exceptions.stream()
.allMatch(t -> t instanceof BuildUnstableException);
return !this.exceptions.isEmpty()
&& this.exceptions.stream().allMatch(t -> t instanceof BuildUnstableException);
}
public String toStringResult() {
return isUnstable() ? "UNSTABLE"
: isFailure() ? "FAILURE" : isSkipped() ? "SKIPPED" : "SUCCESS";
return isUnstable() ? "UNSTABLE" : isFailure() ? "FAILURE" : isSkipped() ? "SKIPPED" : "SUCCESS";
}
public boolean isFailure() {
return !this.exceptions.isEmpty() && this.exceptions.stream()
.anyMatch(t -> !(t instanceof BuildUnstableException));
return !this.exceptions.isEmpty()
&& this.exceptions.stream().anyMatch(t -> !(t instanceof BuildUnstableException));
}
public boolean isSuccess() {
@@ -148,8 +144,7 @@ public class ExecutionResult implements Serializable {
this.skipped = skipped;
}
private static final class MergedThrowable extends RuntimeException
implements Serializable {
private static final class MergedThrowable extends RuntimeException implements Serializable {
private MergedThrowable(List<Exception> throwables) {
super("Failed due to the following exceptions " + throwables);
@@ -157,8 +152,7 @@ public class ExecutionResult implements Serializable {
}
private static final class MergedUnstableThrowable extends BuildUnstableException
implements Serializable {
private static final class MergedUnstableThrowable extends BuildUnstableException implements Serializable {
private MergedUnstableThrowable(List<Exception> throwables) {
super("Unstable due to the following exceptions " + throwables);

View File

@@ -34,8 +34,7 @@ public final class HandlebarsHelper {
public static Template template(String templateSubFolder, String templateName) {
try {
Handlebars handlebars = new Handlebars(
new ClassPathTemplateLoader("/templates/" + templateSubFolder));
Handlebars handlebars = new Handlebars(new ClassPathTemplateLoader("/templates/" + templateSubFolder));
handlebars.registerHelper("replace", StringHelpers.replace);
handlebars.registerHelper("capitalizeFirst", StringHelpers.capitalizeFirst);
return handlebars.compile(templateName);

View File

@@ -60,11 +60,9 @@ public final class PomReader {
}
catch (XmlPullParserException | IOException e) {
if (file.isFile() && fileText.length() == 0) {
throw new IllegalStateException(
"File [" + pom.getAbsolutePath() + "] is empty", e);
throw new IllegalStateException("File [" + pom.getAbsolutePath() + "] is empty", e);
}
throw new IllegalStateException(
"Failed to read file: " + pom.getAbsolutePath(), e);
throw new IllegalStateException("Failed to read file: " + pom.getAbsolutePath(), e);
}
}

View File

@@ -65,8 +65,7 @@ public final class TemporaryFileStorage {
if (file.isDirectory()) {
Files.walkFileTree(file.toPath(), new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file,
BasicFileAttributes attrs) throws IOException {
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
if (log.isTraceEnabled()) {
log.trace("Removing file [" + file + "]");
}
@@ -75,8 +74,7 @@ public final class TemporaryFileStorage {
}
@Override
public FileVisitResult postVisitDirectory(Path dir,
IOException exc) throws IOException {
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
if (log.isTraceEnabled()) {
log.trace("Removing dir [" + dir + "]");
}
@@ -110,9 +108,8 @@ public final class TemporaryFileStorage {
return tempDir;
}
}
throw new IllegalStateException("Failed to create directory within "
+ TEMP_DIR_ATTEMPTS + " attempts (tried " + baseName + "0 to " + baseName
+ (TEMP_DIR_ATTEMPTS - 1) + ")");
throw new IllegalStateException("Failed to create directory within " + TEMP_DIR_ATTEMPTS + " attempts (tried "
+ baseName + "0 to " + baseName + (TEMP_DIR_ATTEMPTS - 1) + ")");
}
}

View File

@@ -34,8 +34,7 @@ import releaser.internal.project.Projects;
*/
class BlogTemplateGenerator {
private static final Logger log = LoggerFactory
.getLogger(BlogTemplateGenerator.class);
private static final Logger log = LoggerFactory.getLogger(BlogTemplateGenerator.class);
private static final Pattern RC_PATTERN = Pattern.compile("(.*)(RC)([0-9]+)");
@@ -53,8 +52,8 @@ class BlogTemplateGenerator {
private final NotesGenerator notesGenerator;
BlogTemplateGenerator(Template template, String releaseVersion, File blogOutput,
Projects projects, ProjectGitHubHandler handler) {
BlogTemplateGenerator(Template template, String releaseVersion, File blogOutput, Projects projects,
ProjectGitHubHandler handler) {
this.template = template;
this.releaseVersion = releaseVersion;
this.blogOutput = blogOutput;
@@ -75,24 +74,21 @@ class BlogTemplateGenerator {
boolean release = !SR_PATTERN.matcher(this.releaseVersion).matches()
&& !RC_PATTERN.matcher(this.releaseVersion).matches()
&& !MILESTONE_PATTERN.matcher(this.releaseVersion).matches();
boolean nonRelease = !(release
|| SR_PATTERN.matcher(this.releaseVersion).matches());
boolean nonRelease = !(release || SR_PATTERN.matcher(this.releaseVersion).matches());
String availability = availability(release);
String releaseName = parsedReleaseName(this.releaseVersion, release);
String releaseLink = link(nonRelease);
Map<String, Object> map = ImmutableMap.<String, Object>builder()
.put("availability", availability).put("releaseName", releaseName)
.put("releaseLink", releaseLink)
Map<String, Object> map = ImmutableMap.<String, Object>builder().put("availability", availability)
.put("releaseName", releaseName).put("releaseLink", releaseLink)
.put("releaseVersion", this.releaseVersion)
.put("projects", this.notesGenerator.fromProjects(this.projects))
.put("nonRelease", nonRelease).build();
.put("projects", this.notesGenerator.fromProjects(this.projects)).put("nonRelease", nonRelease)
.build();
String blog = this.template.apply(map);
Files.write(this.blogOutput.toPath(), blog.getBytes());
return this.blogOutput;
}
catch (Exception e) {
throw new IllegalStateException(
"Exception occurred while trying to create a blog entry", e);
throw new IllegalStateException("Exception occurred while trying to create a blog entry", e);
}
}
@@ -127,8 +123,7 @@ class BlogTemplateGenerator {
}
if (log.isWarnEnabled()) {
log.warn("Unrecognized release [{}] . "
+ "Hopefully, you know what you're doing. Will treat it as milestone",
this.releaseVersion);
+ "Hopefully, you know what you're doing. Will treat it as milestone", this.releaseVersion);
}
return milestone(milestone);
}
@@ -147,8 +142,7 @@ class BlogTemplateGenerator {
return "[Spring Milestone](https://repo.spring.io/milestone/) repository";
}
return "[Maven Central](https://repo1.maven.org/maven2/"
+ "org/springframework/cloud/spring-cloud-dependencies/"
+ this.releaseVersion + "/)";
+ "org/springframework/cloud/spring-cloud-dependencies/" + this.releaseVersion + "/)";
}
}

View File

@@ -28,8 +28,7 @@ import org.slf4j.LoggerFactory;
*/
class EmailTemplateGenerator {
private static final Logger log = LoggerFactory
.getLogger(EmailTemplateGenerator.class);
private static final Logger log = LoggerFactory.getLogger(EmailTemplateGenerator.class);
private final Template template;
@@ -50,8 +49,7 @@ class EmailTemplateGenerator {
return this.emailOutput;
}
catch (Exception e) {
throw new IllegalStateException(
"Exception occurred while trying to generate an email template", e);
throw new IllegalStateException("Exception occurred while trying to generate an email template", e);
}
}

View File

@@ -37,13 +37,12 @@ class NotesGenerator {
}
Set<Notes> fromProjects(Projects projects) {
return projects.stream().filter(projectVersion -> !projectVersion.projectName
.toLowerCase().contains("boot")).map(projectVersion -> {
return projects.stream().filter(projectVersion -> !projectVersion.projectName.toLowerCase().contains("boot"))
.map(projectVersion -> {
String name = projectVersion.projectName;
String version = projectVersion.version;
String closedMilestoneUrl = this.handler.milestoneUrl(projectVersion);
String convertedName = Arrays.stream(name.split("-"))
.map(StringUtils::capitalize)
String convertedName = Arrays.stream(name.split("-")).map(StringUtils::capitalize)
.collect(Collectors.joining(" "));
return new Notes(convertedName, version, closedMilestoneUrl);
}).collect(Collectors.toSet());
@@ -90,8 +89,7 @@ class Notes {
if (this.name != null ? !this.name.equals(notes.name) : notes.name != null) {
return false;
}
return this.version != null ? this.version.equals(notes.version)
: notes.version == null;
return this.version != null ? this.version.equals(notes.version) : notes.version == null;
}
@Override

View File

@@ -43,8 +43,8 @@ class ReleaseNotesTemplateGenerator {
private final NotesGenerator notesGenerator;
ReleaseNotesTemplateGenerator(Template template, String releaseVersion,
File blogOutput, Projects projects, ProjectGitHubHandler handler) {
ReleaseNotesTemplateGenerator(Template template, String releaseVersion, File blogOutput, Projects projects,
ProjectGitHubHandler handler) {
this.template = template;
this.releaseVersion = releaseVersion;
this.blogOutput = blogOutput;
@@ -57,15 +57,13 @@ class ReleaseNotesTemplateGenerator {
Map<String, Object> map = ImmutableMap.<String, Object>builder()
.put("date", LocalDate.now().format(DateTimeFormatter.ISO_DATE))
.put("releaseVersion", this.releaseVersion)
.put("projects", this.notesGenerator.fromProjects(this.projects))
.build();
.put("projects", this.notesGenerator.fromProjects(this.projects)).build();
String blog = this.template.apply(map);
Files.write(this.blogOutput.toPath(), blog.getBytes());
return this.blogOutput;
}
catch (IOException e) {
throw new IllegalStateException(
"Exception occurred while trying to generate release notes", e);
throw new IllegalStateException("Exception occurred while trying to generate release notes", e);
}
}

View File

@@ -59,8 +59,7 @@ public class TemplateGenerator {
this.releaseNotesOutput = new File("target/notes.md");
}
TemplateGenerator(ReleaserProperties props, File output,
ProjectGitHubHandler handler) {
TemplateGenerator(ReleaserProperties props, File output, ProjectGitHubHandler handler) {
this.props = props;
this.emailOutput = output;
this.blogOutput = output;
@@ -97,8 +96,7 @@ public class TemplateGenerator {
File blogOutput = file(this.blogOutput);
String releaseVersion = parsedVersion(projects);
Template template = template(BLOG_TEMPLATE);
return new BlogTemplateGenerator(template, releaseVersion, blogOutput, projects,
this.handler).blog();
return new BlogTemplateGenerator(template, releaseVersion, blogOutput, projects, this.handler).blog();
}
public File tweet(Projects projects) {
@@ -112,8 +110,8 @@ public class TemplateGenerator {
File output = file(this.releaseNotesOutput);
String releaseVersion = parsedVersion(projects);
Template template = template(RELEASE_NOTES_TEMPLATE);
return new ReleaseNotesTemplateGenerator(template, releaseVersion, output,
projects, this.handler).releaseNotes();
return new ReleaseNotesTemplateGenerator(template, releaseVersion, output, projects, this.handler)
.releaseNotes();
}
private String parsedVersion(Projects projects) {
@@ -128,8 +126,7 @@ public class TemplateGenerator {
}
private Template template(String template) {
return HandlebarsHelper.template(this.props.getTemplate().getTemplateFolder(),
template);
return HandlebarsHelper.template(this.props.getTemplate().getTemplateFolder(), template);
}
}

View File

@@ -28,8 +28,7 @@ import org.slf4j.LoggerFactory;
*/
class TwitterTemplateGenerator {
private static final Logger log = LoggerFactory
.getLogger(TwitterTemplateGenerator.class);
private static final Logger log = LoggerFactory.getLogger(TwitterTemplateGenerator.class);
private final Template template;
@@ -50,8 +49,7 @@ class TwitterTemplateGenerator {
return this.output;
}
catch (Exception e) {
throw new IllegalStateException(
"Exception occurred while trying to generate a twitter template", e);
throw new IllegalStateException("Exception occurred while trying to generate a twitter template", e);
}
}

View File

@@ -60,8 +60,7 @@ public class VersionsFetcher implements Closeable {
private final ReleaserProperties properties;
public VersionsFetcher(ReleaserProperties properties,
ProjectPomUpdater projectPomUpdater) {
public VersionsFetcher(ReleaserProperties properties, ProjectPomUpdater projectPomUpdater) {
this.properties = properties;
this.projectPomUpdater = projectPomUpdater;
this.toPropertiesConverter = new ToPropertiesConverter(new RawGithubRetriever());
@@ -75,8 +74,7 @@ public class VersionsFetcher implements Closeable {
public boolean isLatestGa(ProjectVersion version) {
if (!version.isReleaseOrServiceRelease()) {
if (log.isDebugEnabled()) {
log.debug("Version [" + version.toString()
+ "] is non GA, will not fetch any versions.");
log.debug("Version [" + version.toString() + "] is non GA, will not fetch any versions.");
}
return false;
}
@@ -86,55 +84,44 @@ public class VersionsFetcher implements Closeable {
return false;
}
String latestVersionsUrl = this.properties.getVersions().getAllVersionsFileUrl();
InitializrProperties initializrProperties = this.toPropertiesConverter
.toProperties(latestVersionsUrl);
InitializrProperties initializrProperties = this.toPropertiesConverter.toProperties(latestVersionsUrl);
if (initializrProperties == null) {
return false;
}
ProjectVersion bomVersion = latestBomVersion();
if (bomVersion == null) {
log.info("No BOM mapping with name [{}] found",
this.properties.getVersions().getBomName());
log.info("No BOM mapping with name [{}] found", this.properties.getVersions().getBomName());
return false;
}
Projects projectVersions = null;
try {
projectVersions = this.projectPomUpdater.retrieveVersionsFromReleaseTrainBom(
"v" + bomVersion.toString(), false);
projectVersions = this.projectPomUpdater.retrieveVersionsFromReleaseTrainBom("v" + bomVersion.toString(),
false);
}
catch (Exception ex) {
log.error(
"Failed to check the project versions. Will return that the project is not GA",
ex);
log.error("Failed to check the project versions. Will return that the project is not GA", ex);
return false;
}
boolean containsProject = projectVersions.containsProject(version.projectName);
if (containsProject) {
return bomVersion.compareTo(projectVersions.forName(version.projectName)) > 0;
}
log.info("The project [" + version.projectName
+ "] is not present in the BOM with projects [" + projectVersions.stream()
.map(v -> v.projectName).collect(Collectors.joining(", "))
+ "]");
log.info("The project [" + version.projectName + "] is not present in the BOM with projects ["
+ projectVersions.stream().map(v -> v.projectName).collect(Collectors.joining(", ")) + "]");
return false;
}
private ProjectVersion latestBomVersion() {
String latestVersionsUrl = this.properties.getVersions().getAllVersionsFileUrl();
InitializrProperties initializrProperties = this.toPropertiesConverter
.toProperties(latestVersionsUrl);
InitializrProperties initializrProperties = this.toPropertiesConverter.toProperties(latestVersionsUrl);
if (initializrProperties == null) {
return null;
}
ProjectVersion springCloudVersion = initializrProperties.getEnv().getBoms()
.getOrDefault(
this.properties.getVersions().getBomName(), new BillOfMaterials())
.getMappings().stream()
.map(mapping -> new ProjectVersion(
this.properties.getVersions().getBomName(), mapping.getVersion()))
.filter(ProjectVersion::isReleaseOrServiceRelease)
.max(ProjectVersion::compareTo).orElse(new ProjectVersion(
this.properties.getVersions().getBomName(), ""));
.getOrDefault(this.properties.getVersions().getBomName(), new BillOfMaterials()).getMappings().stream()
.map(mapping -> new ProjectVersion(this.properties.getVersions().getBomName(), mapping.getVersion()))
.filter(ProjectVersion::isReleaseOrServiceRelease).max(ProjectVersion::compareTo)
.orElse(new ProjectVersion(this.properties.getVersions().getBomName(), ""));
log.info("Latest BOM version is [{}]", springCloudVersion.version);
return springCloudVersion;
}
@@ -154,14 +141,13 @@ class RawGithubRetriever {
try {
URL url = new URL(stringUrl);
URLConnection con = url.openConnection();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(
con.getInputStream(), StandardCharsets.UTF_8))) {
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(con.getInputStream(), StandardCharsets.UTF_8))) {
return reader.lines().collect(Collectors.joining("\n"));
}
}
catch (IOException e) {
LOG.warn("Exception occurred while trying to fetch the URL [" + stringUrl
+ "] contents");
LOG.warn("Exception occurred while trying to fetch the URL [" + stringUrl + "] contents");
return null;
}
}
@@ -185,16 +171,12 @@ class ToPropertiesConverter implements Closeable {
return null;
}
YamlPropertiesFactoryBean yamlProcessor = new YamlPropertiesFactoryBean();
yamlProcessor.setResources(new InputStreamResource(new ByteArrayInputStream(
retrievedFile.getBytes(StandardCharsets.UTF_8))));
yamlProcessor.setResources(
new InputStreamResource(new ByteArrayInputStream(retrievedFile.getBytes(StandardCharsets.UTF_8))));
Properties properties = yamlProcessor.getObject();
return new Binder(
new MapConfigurationPropertySource(properties.entrySet().stream()
.collect(Collectors.toMap(e -> e.getKey().toString(),
e -> e.getValue().toString()))))
.bind("initializr",
InitializrProperties.class)
.get();
return new Binder(new MapConfigurationPropertySource(properties.entrySet().stream()
.collect(Collectors.toMap(e -> e.getKey().toString(), e -> e.getValue().toString()))))
.bind("initializr", InitializrProperties.class).get();
});
}

View File

@@ -32,17 +32,13 @@ public class SpringCloudReleaserProperties {
public static ReleaserProperties get() {
try {
File releaserConfig = new File(SpringCloudReleaserProperties.class
.getResource("/application.yml").toURI());
File releaserConfig = new File(SpringCloudReleaserProperties.class.getResource("/application.yml").toURI());
YamlPropertiesFactoryBean yamlProcessor = new YamlPropertiesFactoryBean();
yamlProcessor.setResources(new FileSystemResource(releaserConfig));
Properties properties = yamlProcessor.getObject();
ReleaserProperties releaserProperties = new Binder(
new MapConfigurationPropertySource(properties.entrySet().stream()
.collect(Collectors.toMap(e -> e.getKey().toString(),
e -> e.getValue().toString()))))
.bind("releaser", ReleaserProperties.class)
.get();
ReleaserProperties releaserProperties = new Binder(new MapConfigurationPropertySource(properties.entrySet()
.stream().collect(Collectors.toMap(e -> e.getKey().toString(), e -> e.getValue().toString()))))
.bind("releaser", ReleaserProperties.class).get();
return releaserProperties;
}
catch (URISyntaxException e) {

View File

@@ -24,10 +24,9 @@ import java.util.Collections;
import org.apache.maven.model.Model;
import org.assertj.core.api.BDDAssertions;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import releaser.SpringCloudReleaserProperties;
import releaser.internal.buildsystem.MavenBomParserAccessor;
import releaser.internal.buildsystem.ProjectPomUpdater;
@@ -45,14 +44,14 @@ import static org.assertj.core.api.BDDAssertions.then;
*/
public class PomUpdateAcceptanceTests {
@Rule
public TemporaryFolder tmp = new TemporaryFolder();
@TempDir
public File tmp;
File temporaryFolder;
@Before
@BeforeEach
public void setup() throws Exception {
this.temporaryFolder = this.tmp.newFolder();
this.temporaryFolder = new File(tmp, "test");
TestUtils.prepareLocalRepo();
FileSystemUtils.copyRecursively(file("/projects/"), this.temporaryFolder);
}
@@ -62,25 +61,20 @@ public class PomUpdateAcceptanceTests {
ReleaserProperties releaserProperties = releaserProperties();
releaserProperties.getFixedVersions().put("checkstyle", "100.0.0.RELEASE");
ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties,
Collections
.singletonList(MavenBomParserAccessor.maven(releaserProperties)));
Collections.singletonList(MavenBomParserAccessor.maven(releaserProperties)));
Projects projects = projectPomUpdater.retrieveVersionsFromReleaseTrainBom();
File project = new File(this.temporaryFolder, "/spring-cloud-sleuth");
projectPomUpdater.updateProjectFromReleaseTrain(project, projects,
projects.forFile(project), true);
projectPomUpdater.updateProjectFromReleaseTrain(project, projects, projects.forFile(project), true);
then(this.temporaryFolder).exists();
Model rootPom = PomReader.readPom(tmpFile("/spring-cloud-sleuth/pom.xml"));
Model depsPom = PomReader.readPom(
tmpFile("/spring-cloud-sleuth/spring-cloud-sleuth-dependencies/pom.xml"));
Model corePom = PomReader.readPom(
tmpFile("/spring-cloud-sleuth/spring-cloud-sleuth-core/pom.xml"));
Model depsPom = PomReader.readPom(tmpFile("/spring-cloud-sleuth/spring-cloud-sleuth-dependencies/pom.xml"));
Model corePom = PomReader.readPom(tmpFile("/spring-cloud-sleuth/spring-cloud-sleuth-core/pom.xml"));
Model zipkinStreamPom = PomReader.readPom(tmpFile(
"/spring-cloud-sleuth/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin-stream/pom.xml"));
then(rootPom.getVersion()).isEqualTo("1.2.0.BUILD-SNAPSHOT");
then(rootPom.getProperties())
.containsEntry("spring-cloud-commons.version", "1.2.0.BUILD-SNAPSHOT")
then(rootPom.getProperties()).containsEntry("spring-cloud-commons.version", "1.2.0.BUILD-SNAPSHOT")
.containsEntry("spring-cloud-stream.version", "Chelsea.BUILD-SNAPSHOT")
.containsEntry("spring-cloud-netflix.version", "1.3.0.BUILD-SNAPSHOT")
.containsEntry("checkstyle.version", "100.0.0.RELEASE");
@@ -95,23 +89,20 @@ public class PomUpdateAcceptanceTests {
throws Exception {
ReleaserProperties releaserProperties = branchReleaserProperties();
ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties,
Collections
.singletonList(MavenBomParserAccessor.maven(releaserProperties)));
Collections.singletonList(MavenBomParserAccessor.maven(releaserProperties)));
Projects projects = projectPomUpdater.retrieveVersionsFromReleaseTrainBom();
projects.add(new ProjectVersion("spring-cloud-sleuth-samples", "0.0.5.RELEASE"));
File project = new File(this.temporaryFolder,
"/spring-cloud-sleuth-with-unmatched-property/spring-cloud-sleuth-samples");
addBuildSnapshotToChildPom(project);
projectPomUpdater.updateProjectFromReleaseTrain(project, projects,
projects.forFile(project), true);
projectPomUpdater.updateProjectFromReleaseTrain(project, projects, projects.forFile(project), true);
}
private void addBuildSnapshotToChildPom(File project) throws IOException {
File childPom = new File(project, "pom.xml");
String text = new String(Files.readAllBytes(childPom.toPath()));
Files.write(childPom.toPath(),
text.replaceAll("1.19.2", "1.19.2.BUILD-SNAPSHOT").getBytes());
Files.write(childPom.toPath(), text.replaceAll("1.19.2", "1.19.2.BUILD-SNAPSHOT").getBytes());
}
@Test
@@ -119,15 +110,13 @@ public class PomUpdateAcceptanceTests {
throws Exception {
ReleaserProperties releaserProperties = branchReleaserProperties();
ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties,
Collections
.singletonList(MavenBomParserAccessor.maven(releaserProperties)));
Collections.singletonList(MavenBomParserAccessor.maven(releaserProperties)));
Projects projects = projectPomUpdater.retrieveVersionsFromReleaseTrainBom();
File project = new File(this.temporaryFolder,
"/spring-cloud-sleuth-with-unmatched-property");
File project = new File(this.temporaryFolder, "/spring-cloud-sleuth-with-unmatched-property");
BDDAssertions
.thenThrownBy(() -> projectPomUpdater.updateProjectFromReleaseTrain(
project, projects, projects.forFile(project), true))
.thenThrownBy(() -> projectPomUpdater.updateProjectFromReleaseTrain(project, projects,
projects.forFile(project), true))
.hasMessageContaining("<version>0.3.1.BUILD-SNAPSHOT</version>");
}
@@ -136,18 +125,15 @@ public class PomUpdateAcceptanceTests {
throws Exception {
ReleaserProperties releaserProperties = branchReleaserProperties();
ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties,
Collections
.singletonList(MavenBomParserAccessor.maven(releaserProperties)));
Collections.singletonList(MavenBomParserAccessor.maven(releaserProperties)));
Projects projects = projectPomUpdater.retrieveVersionsFromReleaseTrainBom();
projects.removeIf(projectVersion -> projectVersion.projectName
.contains("spring-cloud-build"));
projects.removeIf(projectVersion -> projectVersion.projectName.contains("spring-cloud-build"));
projects.add(new ProjectVersion("spring-cloud-build", "1.4.2.RELEASE"));
File project = new File(this.temporaryFolder,
"/spring-cloud-sleuth-with-milestone-dep");
File project = new File(this.temporaryFolder, "/spring-cloud-sleuth-with-milestone-dep");
BDDAssertions
.thenThrownBy(() -> projectPomUpdater.updateProjectFromReleaseTrain(
project, projects, projects.forFile(project), true))
.thenThrownBy(() -> projectPomUpdater.updateProjectFromReleaseTrain(project, projects,
projects.forFile(project), true))
.hasMessageContaining("<zipkin.version>1.19.2-M2</zipkin.version>");
}
@@ -156,15 +142,13 @@ public class PomUpdateAcceptanceTests {
throws Exception {
ReleaserProperties releaserProperties = branchReleaserProperties();
ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties,
Collections
.singletonList(MavenBomParserAccessor.maven(releaserProperties)));
Collections.singletonList(MavenBomParserAccessor.maven(releaserProperties)));
Projects projects = projects(projectPomUpdater);
File project = new File(this.temporaryFolder,
"/spring-cloud-sleuth-with-milestone-dep");
File project = new File(this.temporaryFolder, "/spring-cloud-sleuth-with-milestone-dep");
BDDAssertions
.thenThrownBy(() -> projectPomUpdater.updateProjectFromReleaseTrain(
project, projects, projects.forFile(project), true))
.thenThrownBy(() -> projectPomUpdater.updateProjectFromReleaseTrain(project, projects,
projects.forFile(project), true))
.hasMessageContaining("<zipkin.version>1.19.2-M2</zipkin.version>");
}
@@ -173,35 +157,26 @@ public class PomUpdateAcceptanceTests {
throws Exception {
ReleaserProperties releaserProperties = branchReleaserProperties();
ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties,
Collections
.singletonList(MavenBomParserAccessor.maven(releaserProperties)));
Collections.singletonList(MavenBomParserAccessor.maven(releaserProperties)));
Projects projects = projects(projectPomUpdater);
File project = new File(this.temporaryFolder,
"/spring-cloud-sleuth-with-ignored-line");
File project = new File(this.temporaryFolder, "/spring-cloud-sleuth-with-ignored-line");
projectPomUpdater.updateProjectFromReleaseTrain(project, projects,
projects.forFile(project), true);
projectPomUpdater.updateProjectFromReleaseTrain(project, projects, projects.forFile(project), true);
}
private Projects projects(ProjectPomUpdater projectPomUpdater) {
Projects projects = projectPomUpdater.retrieveVersionsFromReleaseTrainBom();
projects.removeIf(
projectVersion -> projectVersion.projectName.equals("spring-cloud"));
projects.removeIf(projectVersion -> projectVersion.projectName.equals("spring-cloud"));
projects.add(new ProjectVersion("spring-cloud", "Camden.RC1"));
projects.removeIf(projectVersion -> projectVersion.projectName
.equals("spring-cloud-dependencies"));
projects.removeIf(projectVersion -> projectVersion.projectName.equals("spring-cloud-dependencies"));
projects.add(new ProjectVersion("spring-cloud-dependencies", "Camden.RC1"));
projects.removeIf(projectVersion -> projectVersion.projectName
.equals("spring-cloud-starter"));
projects.removeIf(projectVersion -> projectVersion.projectName.equals("spring-cloud-starter"));
projects.add(new ProjectVersion("spring-cloud-starter", "Camden.RC1"));
projects.removeIf(projectVersion -> projectVersion.projectName
.equals("spring-cloud-starter-build"));
projects.removeIf(projectVersion -> projectVersion.projectName.equals("spring-cloud-starter-build"));
projects.add(new ProjectVersion("spring-cloud-starter-build", "Camden.RC1"));
projects.removeIf(projectVersion -> projectVersion.projectName
.equals("spring-cloud-release"));
projects.removeIf(projectVersion -> projectVersion.projectName.equals("spring-cloud-release"));
projects.add(new ProjectVersion("spring-cloud-release", "Camden.RC1"));
projects.removeIf(projectVersion -> projectVersion.projectName
.contains("spring-cloud-build"));
projects.removeIf(projectVersion -> projectVersion.projectName.contains("spring-cloud-build"));
projects.add(new ProjectVersion("spring-cloud-build", "1.4.2.RELEASE"));
return projects;
}
@@ -211,26 +186,21 @@ public class PomUpdateAcceptanceTests {
throws Exception {
ReleaserProperties releaserProperties = branchReleaserProperties();
ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties,
Collections
.singletonList(MavenBomParserAccessor.maven(releaserProperties)));
Collections.singletonList(MavenBomParserAccessor.maven(releaserProperties)));
Projects projects = projectPomUpdater.retrieveVersionsFromReleaseTrainBom();
projects.removeIf(projectVersion -> projectVersion.projectName
.contains("spring-cloud-build"));
projects.removeIf(projectVersion -> projectVersion.projectName.contains("spring-cloud-build"));
projects.add(new ProjectVersion("spring-cloud-build", "1.4.2.BUILD-SNAPSHOT"));
File project = new File(this.temporaryFolder, "/spring-cloud-sleuth");
BDDAssertions
.thenThrownBy(() -> projectPomUpdater.updateProjectFromReleaseTrain(
project, projects, projects.forFile(project), true))
.hasMessageContaining("BUILD-SNAPSHOT</version>");
BDDAssertions.thenThrownBy(() -> projectPomUpdater.updateProjectFromReleaseTrain(project, projects,
projects.forFile(project), true)).hasMessageContaining("BUILD-SNAPSHOT</version>");
}
@Test
public void should_not_update_a_project_that_is_not_on_the_list() throws Exception {
ReleaserProperties releaserProperties = releaserProperties();
ProjectPomUpdater projectPomUpdater = new ProjectPomUpdater(releaserProperties,
Collections
.singletonList(MavenBomParserAccessor.maven(releaserProperties)));
Collections.singletonList(MavenBomParserAccessor.maven(releaserProperties)));
File beforeProcessing = pom("/projects/project/");
Projects projects = projectPomUpdater.retrieveVersionsFromReleaseTrainBom();
File project = tmpFile("/project/");
@@ -245,8 +215,7 @@ public class PomUpdateAcceptanceTests {
private ReleaserProperties releaserProperties() throws URISyntaxException {
ReleaserProperties releaserProperties = SpringCloudReleaserProperties.get();
releaserProperties.getGit().setReleaseTrainBomUrl(
file("/projects/spring-cloud-release/").toURI().toString());
releaserProperties.getGit().setReleaseTrainBomUrl(file("/projects/spring-cloud-release/").toURI().toString());
return releaserProperties;
}
@@ -265,10 +234,7 @@ public class PomUpdateAcceptanceTests {
}
private File pom(String relativePath) throws URISyntaxException {
return new File(
new File(
PomUpdateAcceptanceTests.class.getResource(relativePath).toURI()),
"pom.xml");
return new File(new File(PomUpdateAcceptanceTests.class.getResource(relativePath).toURI()), "pom.xml");
}
private String asString(File file) throws IOException {

View File

@@ -21,7 +21,7 @@ import java.util.HashMap;
import java.util.Map;
import org.assertj.core.api.BDDAssertions;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.BDDAssertions.then;
@@ -72,13 +72,10 @@ public class ReleaserPropertiesTests {
BDDAssertions.then(properties.getWorkingDir()).isEqualTo("foo");
BDDAssertions.then(properties.getFixedVersions()).isEqualTo(map());
BDDAssertions.then(properties.getMaven().getBuildCommand()).isEqualTo("foo2");
BDDAssertions.then(properties.getGradle().getIgnoredGradleRegex())
.isEqualTo(Arrays.asList("foo3", "foo4"));
BDDAssertions.then(properties.getMetaRelease().getProjectsToSkip())
.isEqualTo(Arrays.asList("foo5", "foo6"));
BDDAssertions.then(properties.getGradle().getIgnoredGradleRegex()).isEqualTo(Arrays.asList("foo3", "foo4"));
BDDAssertions.then(properties.getMetaRelease().getProjectsToSkip()).isEqualTo(Arrays.asList("foo5", "foo6"));
BDDAssertions.then(properties.getGit().getPassword()).isEqualTo("foo7");
BDDAssertions.then(properties.getPom().getIgnoredPomRegex())
.isEqualTo(Arrays.asList("foo8", "foo9"));
BDDAssertions.then(properties.getPom().getIgnoredPomRegex()).isEqualTo(Arrays.asList("foo8", "foo9"));
BDDAssertions.then(properties.getSagan().getBaseUrl()).isEqualTo("foo10");
}

View File

@@ -22,13 +22,12 @@ 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.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.BDDMockito;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.junit.jupiter.MockitoExtension;
import releaser.SpringCloudReleaserProperties;
import releaser.internal.buildsystem.GradleUpdater;
import releaser.internal.buildsystem.ProjectPomUpdater;
@@ -42,7 +41,8 @@ import releaser.internal.project.Projects;
import releaser.internal.sagan.SaganUpdater;
import releaser.internal.template.TemplateGenerator;
import org.springframework.boot.test.rule.OutputCapture;
import org.springframework.boot.test.system.CapturedOutput;
import org.springframework.boot.test.system.OutputCaptureExtension;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.BDDMockito.then;
@@ -51,12 +51,9 @@ import static org.mockito.Mockito.never;
/**
* @author Marcin Grzejszczak
*/
@RunWith(MockitoJUnitRunner.class)
@ExtendWith({ MockitoExtension.class, OutputCaptureExtension.class })
public class ReleaserTests {
@Rule
public OutputCapture outputCapture = new OutputCapture();
@Mock
ProjectPomUpdater projectPomUpdater;
@@ -86,16 +83,15 @@ public class ReleaserTests {
File pom;
@Before
@BeforeEach
public void setup() throws URISyntaxException {
URI pomUri = ReleaserTests.class.getResource("/projects/project/pom.xml").toURI();
this.pom = new File(pomUri);
}
Releaser releaser(Supplier<ProjectVersion> originalVersionSupplier) {
return new Releaser(SpringCloudReleaserProperties.get(), this.projectPomUpdater,
this.projectCommandExecutor, this.projectGitHandler,
this.projectGitHubHandler, this.templateGenerator, this.gradleUpdater,
return new Releaser(SpringCloudReleaserProperties.get(), this.projectPomUpdater, this.projectCommandExecutor,
this.projectGitHandler, this.projectGitHubHandler, this.templateGenerator, this.gradleUpdater,
this.saganUpdater, this.documentationUpdater, this.postReleaseActions) {
@Override
ProjectVersion originalVersion(File project) {
@@ -105,71 +101,61 @@ public class ReleaserTests {
}
Releaser releaser() {
return new Releaser(new ReleaserProperties(), this.projectPomUpdater,
this.projectCommandExecutor, this.projectGitHandler,
this.projectGitHubHandler, this.templateGenerator, this.gradleUpdater,
return new Releaser(new ReleaserProperties(), this.projectPomUpdater, this.projectCommandExecutor,
this.projectGitHandler, this.projectGitHubHandler, this.templateGenerator, this.gradleUpdater,
this.saganUpdater, this.documentationUpdater, this.postReleaseActions);
}
@Test
public void should_not_bump_versions_for_original_release_project() {
releaser(() -> new ProjectVersion("original", "1.0.0.RELEASE"))
.rollbackReleaseVersion(this.pom,
new Projects(new ProjectVersion("changed", "1.0.0.RELEASE")),
new ProjectVersion("changed", "1.0.0.RELEASE"));
public void should_not_bump_versions_for_original_release_project(CapturedOutput outputCapture) {
releaser(() -> new ProjectVersion("original", "1.0.0.RELEASE")).rollbackReleaseVersion(this.pom,
new Projects(new ProjectVersion("changed", "1.0.0.RELEASE")),
new ProjectVersion("changed", "1.0.0.RELEASE"));
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));
BDDAssertions.then(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() {
releaser(() -> new ProjectVersion("original", "1.0.0.BUILD-SNAPSHOT"))
.rollbackReleaseVersion(this.pom,
new Projects(
new ProjectVersion("changed", "1.0.0.BUILD-SNAPSHOT")),
new ProjectVersion("changed", "1.0.0.BUILD-SNAPSHOT"));
public void should_not_bump_versions_for_original_snapshot_project_and_current_snapshot(
CapturedOutput outputCapture) {
releaser(() -> new ProjectVersion("original", "1.0.0.BUILD-SNAPSHOT")).rollbackReleaseVersion(this.pom,
new Projects(new ProjectVersion("changed", "1.0.0.BUILD-SNAPSHOT")),
new ProjectVersion("changed", "1.0.0.BUILD-SNAPSHOT"));
BDDAssertions.then(this.outputCapture.toString())
.contains("Won't rollback a snapshot version");
then(this.projectGitHandler).should(never())
.commitAfterBumpingVersions(any(File.class), any(ProjectVersion.class));
BDDAssertions.then(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() {
public void should_bump_versions_for_original_snapshot_project(CapturedOutput outputCapture) {
ProjectVersion scReleaseVersion = new ProjectVersion("changed", "1.0.0.RELEASE");
releaser(() -> new ProjectVersion("original", "1.0.0.BUILD-SNAPSHOT"))
.rollbackReleaseVersion(this.pom, new Projects(
new ProjectVersion("changed", "1.0.0.RELEASE"),
releaser(() -> new ProjectVersion("original", "1.0.0.BUILD-SNAPSHOT")).rollbackReleaseVersion(this.pom,
new Projects(new ProjectVersion("changed", "1.0.0.RELEASE"),
new ProjectVersion("spring-cloud-build", "2.0.0.RELEASE"),
new ProjectVersion("spring-boot-starter", "3.0.0.RELEASE")),
scReleaseVersion);
scReleaseVersion);
BDDAssertions.then(this.outputCapture.toString())
.contains("Project was successfully updated")
BDDAssertions.then(outputCapture.toString()).contains("Project was successfully updated")
.contains("Successfully reverted the commit and bumped snapshot versions")
.contains("spring-boot-starter=>3.0.0.RELEASE")
.contains("spring-cloud-build=>2.0.1.SNAPSHOT")
.contains("spring-boot-starter=>3.0.0.RELEASE").contains("spring-cloud-build=>2.0.1.SNAPSHOT")
.contains("changed=>1.0.1.SNAPSHOT");
}
@Test
public void should_not_generate_email_for_snapshot_version() {
releaser().createEmail(new ProjectVersion("original", "1.0.0.BUILD-SNAPSHOT"),
projects());
releaser().createEmail(new ProjectVersion("original", "1.0.0.BUILD-SNAPSHOT"), projects());
then(this.templateGenerator).should(never()).email(any(Projects.class));
}
@Test
public void should_generate_email_for_release_version() {
BDDMockito.given(this.templateGenerator.email(projects()))
.willReturn(new File("."));
releaser().createEmail(new ProjectVersion("original", "1.0.0.RELEASE"),
projects());
BDDMockito.given(this.templateGenerator.email(projects())).willReturn(new File("."));
releaser().createEmail(new ProjectVersion("original", "1.0.0.RELEASE"), projects());
then(this.templateGenerator).should().email(any(Projects.class));
}
@@ -178,20 +164,17 @@ public class ReleaserTests {
public void should_not_close_milestone_for_snapshots() {
releaser().closeMilestone(new ProjectVersion("original", "1.0.0.BUILD-SNAPSHOT"));
then(this.projectGitHubHandler).should(never())
.closeMilestone(any(ProjectVersion.class));
then(this.projectGitHubHandler).should(never()).closeMilestone(any(ProjectVersion.class));
}
@Test
public void should_not_rollback_for_snapshots() {
releaser(() -> 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"));
releaser(() -> 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));
then(this.projectGitHandler).should(never()).revertChangesIfApplicable(any(File.class),
any(ProjectVersion.class));
}
Projects projects() {

View File

@@ -30,8 +30,7 @@ class GradleBomParserTests {
@Test
void should_read_versions_from_bom_from_properties() {
GradleBomParser parser = new GradleBomParser(new ReleaserProperties(),
new ArrayList<>()) {
GradleBomParser parser = new GradleBomParser(new ReleaserProperties(), new ArrayList<>()) {
@Override
public boolean isApplicable(File clonedBom) {
return true;
@@ -52,8 +51,7 @@ class GradleBomParserTests {
VersionsFromBom versionsFromBom = parser.versionsFromBom(new File("."));
BDDAssertions.then(versionsFromBom.versionForProject("spring-cloud-contract"))
.isEqualTo("1.0.0.RELEASE");
BDDAssertions.then(versionsFromBom.versionForProject("spring-cloud-contract")).isEqualTo("1.0.0.RELEASE");
}
@Test
@@ -62,8 +60,7 @@ class GradleBomParserTests {
gradleSubstitution.put("verifierVersion", "spring-cloud-contract");
ReleaserProperties releaserProperties = new ReleaserProperties();
releaserProperties.getGradle().setGradlePropsSubstitution(gradleSubstitution);
GradleBomParser parser = new GradleBomParser(releaserProperties,
new ArrayList<>()) {
GradleBomParser parser = new GradleBomParser(releaserProperties, new ArrayList<>()) {
@Override
public boolean isApplicable(File clonedBom) {
return true;
@@ -84,22 +81,19 @@ class GradleBomParserTests {
VersionsFromBom versionsFromBom = parser.versionsFromBom(new File("."));
BDDAssertions.then(versionsFromBom.versionForProject("spring-cloud-contract"))
.isEqualTo("1.0.0.RELEASE");
BDDAssertions.then(versionsFromBom.versionForProject("spring-cloud-contract")).isEqualTo("1.0.0.RELEASE");
}
@Test
void should_be_not_applicable_when_no_build_gradle_is_present() {
GradleBomParser parser = new GradleBomParser(new ReleaserProperties(),
new ArrayList<>());
GradleBomParser parser = new GradleBomParser(new ReleaserProperties(), new ArrayList<>());
BDDAssertions.then(parser.isApplicable(new File("."))).isFalse();
}
@Test
void should_be_applicable_when_build_gradle_is_present() {
GradleBomParser parser = new GradleBomParser(new ReleaserProperties(),
new ArrayList<>()) {
GradleBomParser parser = new GradleBomParser(new ReleaserProperties(), new ArrayList<>()) {
@Override
File file(File clonedBom, String child) {
return clonedBom;
@@ -111,8 +105,7 @@ class GradleBomParserTests {
@Test
void should_return_empty_version_when_no_gradle_properties_is_present() {
GradleBomParser parser = new GradleBomParser(new ReleaserProperties(),
new ArrayList<>());
GradleBomParser parser = new GradleBomParser(new ReleaserProperties(), new ArrayList<>());
VersionsFromBom versionsFromBom = parser.versionsFromBom(new File("."));

View File

@@ -16,11 +16,11 @@
package releaser.internal.buildsystem;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.junit.jupiter.MockitoExtension;
import org.slf4j.Logger;
import static org.mockito.BDDMockito.then;
@@ -28,7 +28,7 @@ import static org.mockito.BDDMockito.then;
/**
* @author Marcin Grzejszczak
*/
@RunWith(MockitoJUnitRunner.class)
@ExtendWith(MockitoExtension.class)
public class LoggerToMavenLogTests {
@Mock

View File

@@ -20,8 +20,8 @@ import java.io.File;
import java.net.URISyntaxException;
import java.util.Collections;
import org.junit.Before;
import org.junit.Test;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import releaser.SpringCloudReleaserProperties;
import releaser.internal.ReleaserProperties;
import releaser.internal.git.GitRepoTests;
@@ -38,7 +38,7 @@ public class MavenBomParserTests {
ReleaserProperties properties = SpringCloudReleaserProperties.get();
@Before
@BeforeEach
public void setup() throws URISyntaxException {
this.springCloudReleaseProject = new File(
GitRepoTests.class.getResource("/projects/spring-cloud-release").toURI());
@@ -51,8 +51,7 @@ public class MavenBomParserTests {
BomParser parser = new MavenBomParser(this.properties, Collections.emptyList());
thenThrownBy(() -> parser.versionsFromBom(this.springCloudReleaseProject))
.isInstanceOf(IllegalStateException.class)
.hasMessageContaining("Pom is not present");
.isInstanceOf(IllegalStateException.class).hasMessageContaining("Pom is not present");
}
@Test
@@ -69,8 +68,7 @@ public class MavenBomParserTests {
public void should_throw_exception_when_cloud_pom_is_missing() {
BomParser parser = new MavenBomParser(this.properties, Collections.emptyList());
thenThrownBy(() -> parser.versionsFromBom(new File(".")))
.isInstanceOf(IllegalStateException.class)
thenThrownBy(() -> parser.versionsFromBom(new File("."))).isInstanceOf(IllegalStateException.class)
.hasMessageContaining("Pom is not present");
}
@@ -81,8 +79,7 @@ public class MavenBomParserTests {
BomParser parser = new MavenBomParser(this.properties, Collections.emptyList());
thenThrownBy(() -> parser.versionsFromBom(this.springCloudReleaseProject))
.isInstanceOf(IllegalStateException.class)
.hasMessageContaining("Pom is not present");
.isInstanceOf(IllegalStateException.class).hasMessageContaining("Pom is not present");
}
}

View File

@@ -23,8 +23,8 @@ import java.net.URISyntaxException;
import org.apache.maven.model.Model;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import org.junit.Before;
import org.junit.Test;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import releaser.internal.git.GitRepoTests;
import releaser.internal.tech.PomReader;
@@ -44,14 +44,12 @@ public class PomReaderTests {
File licenseFile;
@Before
@BeforeEach
public void setup() throws URISyntaxException {
URI scRelease = GitRepoTests.class.getResource("/projects/spring-cloud-release")
.toURI();
URI scRelease = GitRepoTests.class.getResource("/projects/spring-cloud-release").toURI();
this.springCloudReleaseProject = new File(scRelease);
this.springCloudReleaseProjectPom = new File(scRelease.getPath(), "pom.xml");
this.empty = new File(
GitRepoTests.class.getResource("/projects/project/empty.xml").toURI());
this.empty = new File(GitRepoTests.class.getResource("/projects/project/empty.xml").toURI());
this.licenseFile = new File(scRelease.getPath(), "LICENSE.txt");
}
@@ -78,16 +76,14 @@ public class PomReaderTests {
@Test
public void should_throw_exception_when_file_is_invalid() {
thenThrownBy(() -> PomReader.readPom(this.licenseFile))
.hasMessageStartingWith("Failed to read file: ")
thenThrownBy(() -> PomReader.readPom(this.licenseFile)).hasMessageStartingWith("Failed to read file: ")
.hasCauseInstanceOf(XmlPullParserException.class);
}
@Test
public void should_throw_exception_when_file_is_empty() {
thenThrownBy(() -> PomReader.readPom(this.empty)).hasMessageStartingWith("File [")
.hasMessageContaining("] is empty")
.hasCauseInstanceOf(EOFException.class);
.hasMessageContaining("] is empty").hasCauseInstanceOf(EOFException.class);
}
}

View File

@@ -26,16 +26,14 @@ import java.util.Set;
import edu.emory.mathcs.backport.java.util.Collections;
import org.apache.maven.model.Model;
import org.assertj.core.api.BDDAssertions;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import releaser.SpringCloudReleaserProperties;
import releaser.internal.git.GitRepoTests;
import releaser.internal.project.Project;
import releaser.internal.tech.PomReader;
import org.springframework.boot.test.system.OutputCaptureRule;
import org.springframework.util.FileSystemUtils;
/**
@@ -43,11 +41,8 @@ import org.springframework.util.FileSystemUtils;
*/
public class PomUpdaterTests {
@Rule
public OutputCaptureRule capture = new OutputCaptureRule();
@Rule
public TemporaryFolder tmp = new TemporaryFolder();
@TempDir
public File tmp;
VersionsFromBom versionsFromBom = new VersionsFromBomBuilder()
.releaserProperties(SpringCloudReleaserProperties.get()).projects(projects())
@@ -57,58 +52,47 @@ public class PomUpdaterTests {
File temporaryFolder;
@Before
@BeforeEach
public void setup() throws Exception {
this.temporaryFolder = this.tmp.newFolder();
this.temporaryFolder = new File(tmp, "test");
FileSystemUtils.copyRecursively(file("/projects/"), this.temporaryFolder);
}
@Test
public void should_not_update_pom_when_project_is_not_on_the_versions_list()
throws Exception {
public void should_not_update_pom_when_project_is_not_on_the_versions_list() throws Exception {
File springCloudReleasePom = file("/projects/spring-cloud-release");
BDDAssertions.then(this.pomUpdater.shouldProjectBeUpdated(springCloudReleasePom,
this.versionsFromBom)).isFalse();
}
@Test
public void should_not_update_pom_when_project_with_parent_suffix_is_not_on_the_versions_list()
throws Exception {
File springCloud = pom("/projects/project", "pom_with_parent_suffix.xml");
BDDAssertions.then(
this.pomUpdater.shouldProjectBeUpdated(springCloud, this.versionsFromBom))
BDDAssertions.then(this.pomUpdater.shouldProjectBeUpdated(springCloudReleasePom, this.versionsFromBom))
.isFalse();
}
@Test
public void should_update_pom_for_project_with_suffix_when_project_is_on_the_versions_list()
throws Exception {
File springCloud = pom("/projects/project",
"pom_matching_with_parent_suffix.xml");
public void should_not_update_pom_when_project_with_parent_suffix_is_not_on_the_versions_list() throws Exception {
File springCloud = pom("/projects/project", "pom_with_parent_suffix.xml");
BDDAssertions.then(
this.pomUpdater.shouldProjectBeUpdated(springCloud, this.versionsFromBom))
.isTrue();
BDDAssertions.then(this.pomUpdater.shouldProjectBeUpdated(springCloud, this.versionsFromBom)).isFalse();
}
@Test
public void should_update_pom_when_project_is_not_on_the_versions_list()
throws Exception {
public void should_update_pom_for_project_with_suffix_when_project_is_on_the_versions_list() throws Exception {
File springCloud = pom("/projects/project", "pom_matching_with_parent_suffix.xml");
BDDAssertions.then(this.pomUpdater.shouldProjectBeUpdated(springCloud, this.versionsFromBom)).isTrue();
}
@Test
public void should_update_pom_when_project_is_not_on_the_versions_list() throws Exception {
File springCloudSleuthPom = file("/projects/spring-cloud-sleuth");
BDDAssertions.then(this.pomUpdater.shouldProjectBeUpdated(springCloudSleuthPom,
this.versionsFromBom)).isTrue();
BDDAssertions.then(this.pomUpdater.shouldProjectBeUpdated(springCloudSleuthPom, this.versionsFromBom)).isTrue();
}
@Test
public void should_not_update_pom_when_project_is_on_the_versions_list_but_there_is_no_pom()
throws Exception {
public void should_not_update_pom_when_project_is_on_the_versions_list_but_there_is_no_pom() throws Exception {
File springCloudSleuthPom = file("/projects/spring-cloud-sleuth/empty-folder");
BDDAssertions.then(this.pomUpdater.shouldProjectBeUpdated(springCloudSleuthPom,
this.versionsFromBom)).isFalse();
BDDAssertions.then(this.pomUpdater.shouldProjectBeUpdated(springCloudSleuthPom, this.versionsFromBom))
.isFalse();
}
@Test
@@ -116,110 +100,85 @@ public class PomUpdaterTests {
File originalPom = pom("/projects/project");
File pomInTemp = tmpFile("/project/pom.xml");
ModelWrapper rootPom = model("foo");
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp,
this.versionsFromBom);
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, this.versionsFromBom);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom,
pomInTemp);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp);
BDDAssertions.then(asString(storedPom)).isEqualTo(asString(originalPom));
}
@Test
public void should_update_the_pom_if_only_artifact_id_is_matched_in_the_root_pom()
throws Exception {
public void should_update_the_pom_if_only_artifact_id_is_matched_in_the_root_pom() throws Exception {
File originalPom = pom("/projects/project", "pom_matching_artifact.xml");
File pomInTemp = tmpFile("/project/pom_matching_artifact.xml");
ModelWrapper rootPom = model("spring-cloud-sleuth");
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp,
this.versionsFromBom);
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, this.versionsFromBom);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom,
pomInTemp);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp);
BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom));
Model overriddenPomModel = PomReader.readPom(storedPom);
BDDAssertions.then(overriddenPomModel.getVersion())
.isEqualTo("0.0.3.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getVersion()).isEqualTo("0.0.3.BUILD-SNAPSHOT");
}
@Test
public void should_update_the_pom_if_parent_is_matched_via_sc_build()
throws Exception {
public void should_update_the_pom_if_parent_is_matched_via_sc_build() throws Exception {
File originalPom = pom("/projects/project", "pom_matching_parent_v2.xml");
File pomInTemp = tmpFile("/project/pom_matching_parent_v2.xml");
ModelWrapper rootPom = model("spring-cloud-sleuth");
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp,
this.versionsFromBom);
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, this.versionsFromBom);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom,
pomInTemp);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp);
BDDAssertions.then(asString(originalPom)).isNotEqualTo(asString(storedPom));
Model overriddenPomModel = PomReader.readPom(storedPom);
BDDAssertions.then(overriddenPomModel.getVersion())
.isEqualTo("0.0.3.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getParent().getVersion())
.isEqualTo("0.0.2");
BDDAssertions.then(overriddenPomModel.getVersion()).isEqualTo("0.0.3.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getParent().getVersion()).isEqualTo("0.0.2");
}
@Test
public void should_update_the_pom_if_parent_is_matched_via_sc_dependencies_parent()
throws Exception {
public void should_update_the_pom_if_parent_is_matched_via_sc_dependencies_parent() throws Exception {
File originalPom = pom("/projects/project", "pom_matching_parent.xml");
File pomInTemp = tmpFile("/project/pom_matching_parent.xml");
ModelWrapper rootPom = model("spring-cloud-sleuth");
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp,
this.versionsFromBom);
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, this.versionsFromBom);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom,
pomInTemp);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp);
BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom));
Model overriddenPomModel = PomReader.readPom(storedPom);
BDDAssertions.then(overriddenPomModel.getVersion())
.isEqualTo("0.0.3.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getParent().getVersion())
.isEqualTo("0.0.2");
BDDAssertions.then(overriddenPomModel.getVersion()).isEqualTo("0.0.3.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getParent().getVersion()).isEqualTo("0.0.2");
}
@Test
public void should_not_update_child_pom_when_project_is_not_on_the_versions_list()
throws Exception {
public void should_not_update_child_pom_when_project_is_not_on_the_versions_list() throws Exception {
File springCloudReleasePom = file("/projects/spring-cloud-release");
BDDAssertions.then(this.pomUpdater.shouldProjectBeUpdated(springCloudReleasePom,
this.versionsFromBom)).isFalse();
BDDAssertions.then(this.pomUpdater.shouldProjectBeUpdated(springCloudReleasePom, this.versionsFromBom))
.isFalse();
}
@Test
public void should_update_child_pom_when_project_is_not_on_the_versions_list()
throws Exception {
public void should_update_child_pom_when_project_is_not_on_the_versions_list() throws Exception {
File springCloudSleuthPom = file("/projects/spring-cloud-sleuth");
BDDAssertions.then(this.pomUpdater.shouldProjectBeUpdated(springCloudSleuthPom,
this.versionsFromBom)).isTrue();
BDDAssertions.then(this.pomUpdater.shouldProjectBeUpdated(springCloudSleuthPom, this.versionsFromBom)).isTrue();
}
@Test
public void should_update_the_child_pom_if_parent_is_matched_via_sc_build()
throws Exception {
File originalPom = pom("/projects/project/children",
"pom_matching_parent_v2.xml");
public void should_update_the_child_pom_if_parent_is_matched_via_sc_build() throws Exception {
File originalPom = pom("/projects/project/children", "pom_matching_parent_v2.xml");
File pomInTemp = tmpFile("/project/children/pom_matching_parent_v2.xml");
ModelWrapper rootPom = model("spring-cloud-sleuth");
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp,
this.versionsFromBom);
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, this.versionsFromBom);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom,
pomInTemp);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp);
BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom));
Model overriddenPomModel = PomReader.readPom(storedPom);
BDDAssertions.then(overriddenPomModel.getVersion())
.isEqualTo("0.0.3.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getParent().getVersion())
.isEqualTo("0.0.3.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getVersion()).isEqualTo("0.0.3.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getParent().getVersion()).isEqualTo("0.0.3.BUILD-SNAPSHOT");
// the rest is the same
BDDAssertions.then(overriddenPomModel.getProperties())
.containsEntry("spring-cloud-foo.version", "1.3.1.BUILD-SNAPSHOT")
@@ -227,26 +186,20 @@ public class PomUpdaterTests {
}
@Test
public void should_update_the_parent_from_properties_even_if_group_ids_dont_match()
throws Exception {
File originalPom = pom("/projects/project/children",
"pom_different_group_boot_parent.xml");
public void should_update_the_parent_from_properties_even_if_group_ids_dont_match() throws Exception {
File originalPom = pom("/projects/project/children", "pom_different_group_boot_parent.xml");
File pomInTemp = tmpFile("/project/children/pom_different_group_boot_parent.xml");
ModelWrapper rootPom = model("spring-cloud-sleuth", "org.springframework.cloud");
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp,
this.versionsFromBom);
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, this.versionsFromBom);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom,
pomInTemp);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp);
BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom));
Model overriddenPomModel = PomReader.readPom(storedPom);
BDDAssertions.then(overriddenPomModel.getVersion())
.isEqualTo("0.0.3.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getParent().getVersion())
.isEqualTo("1.5.8.RELEASE");
BDDAssertions.then(overriddenPomModel.getProperties())
.containsEntry("spring-cloud-sleuth.version", "0.0.3.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getVersion()).isEqualTo("0.0.3.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getParent().getVersion()).isEqualTo("1.5.8.RELEASE");
BDDAssertions.then(overriddenPomModel.getProperties()).containsEntry("spring-cloud-sleuth.version",
"0.0.3.BUILD-SNAPSHOT");
}
@Test
@@ -255,137 +208,104 @@ public class PomUpdaterTests {
File originalPom = pom("/projects/project/children", "pom_different_group.xml");
File pomInTemp = tmpFile("/project/children/pom_different_group.xml");
ModelWrapper rootPom = model("spring-cloud-sleuth", "org.springframework.cloud");
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp,
this.versionsFromBom);
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, this.versionsFromBom);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom,
pomInTemp);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp);
BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom));
Model overriddenPomModel = PomReader.readPom(storedPom);
BDDAssertions.then(overriddenPomModel.getVersion())
.isEqualTo("1.2.2.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getParent().getVersion())
.isEqualTo("1.5.8.RELEASE");
BDDAssertions.then(overriddenPomModel.getVersion()).isEqualTo("1.2.2.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getParent().getVersion()).isEqualTo("1.5.8.RELEASE");
// the rest is the same
BDDAssertions.then(overriddenPomModel.getProperties())
.containsEntry("spring-cloud-sleuth.version", "0.0.3.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getProperties()).containsEntry("spring-cloud-sleuth.version",
"0.0.3.BUILD-SNAPSHOT");
}
@Test
public void should_update_everything_when_group_ids_dont_match_and_there_is_skip_deployment_property()
throws Exception {
File originalPom = pom("/projects/project/children",
"pom_different_group_skip_deployment_prop.xml");
File pomInTemp = tmpFile(
"/project/children/pom_different_group_skip_deployment_prop.xml");
File originalPom = pom("/projects/project/children", "pom_different_group_skip_deployment_prop.xml");
File pomInTemp = tmpFile("/project/children/pom_different_group_skip_deployment_prop.xml");
ModelWrapper rootPom = model("spring-cloud-sleuth", "org.springframework.cloud");
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp,
this.versionsFromBom);
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, this.versionsFromBom);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom,
pomInTemp);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp);
BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom));
Model overriddenPomModel = PomReader.readPom(storedPom);
BDDAssertions.then(overriddenPomModel.getVersion())
.isEqualTo("1.2.2.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getParent().getVersion())
.isEqualTo("1.5.8.RELEASE");
BDDAssertions.then(overriddenPomModel.getVersion()).isEqualTo("1.2.2.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getParent().getVersion()).isEqualTo("1.5.8.RELEASE");
// the rest is the same
BDDAssertions.then(overriddenPomModel.getProperties())
.containsEntry("spring-cloud-sleuth.version", "0.0.3.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getProperties()).containsEntry("spring-cloud-sleuth.version",
"0.0.3.BUILD-SNAPSHOT");
}
@Test
public void should_update_everything_when_group_ids_dont_match_and_there_is_skip_in_deployment_plugin()
throws Exception {
File originalPom = pom("/projects/project/children",
"pom_different_group_skip_deployment_plugin.xml");
File pomInTemp = tmpFile(
"/project/children/pom_different_group_skip_deployment_plugin.xml");
File originalPom = pom("/projects/project/children", "pom_different_group_skip_deployment_plugin.xml");
File pomInTemp = tmpFile("/project/children/pom_different_group_skip_deployment_plugin.xml");
ModelWrapper rootPom = model("spring-cloud-sleuth", "org.springframework.cloud");
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp,
this.versionsFromBom);
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, this.versionsFromBom);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom,
pomInTemp);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp);
BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom));
Model overriddenPomModel = PomReader.readPom(storedPom);
BDDAssertions.then(overriddenPomModel.getVersion())
.isEqualTo("1.2.2.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getParent().getVersion())
.isEqualTo("1.5.8.RELEASE");
BDDAssertions.then(overriddenPomModel.getVersion()).isEqualTo("1.2.2.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getParent().getVersion()).isEqualTo("1.5.8.RELEASE");
// the rest is the same
BDDAssertions.then(overriddenPomModel.getProperties())
.containsEntry("spring-cloud-sleuth.version", "0.0.3.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getProperties()).containsEntry("spring-cloud-sleuth.version",
"0.0.3.BUILD-SNAPSHOT");
}
@Test
public void should_update_everything_when_group_ids_dont_match_and_there_is_skip_in_deployment_plugin_management()
throws Exception {
File originalPom = pom("/projects/project/children",
"pom_different_group_skip_deployment_plugin_mngmnt.xml");
File pomInTemp = tmpFile(
"/project/children/pom_different_group_skip_deployment_plugin_mngmnt.xml");
File originalPom = pom("/projects/project/children", "pom_different_group_skip_deployment_plugin_mngmnt.xml");
File pomInTemp = tmpFile("/project/children/pom_different_group_skip_deployment_plugin_mngmnt.xml");
ModelWrapper rootPom = model("spring-cloud-sleuth", "org.springframework.cloud");
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp,
this.versionsFromBom);
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, this.versionsFromBom);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom,
pomInTemp);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp);
BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom));
Model overriddenPomModel = PomReader.readPom(storedPom);
BDDAssertions.then(overriddenPomModel.getVersion())
.isEqualTo("1.2.2.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getParent().getVersion())
.isEqualTo("1.5.8.RELEASE");
BDDAssertions.then(overriddenPomModel.getVersion()).isEqualTo("1.2.2.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getParent().getVersion()).isEqualTo("1.5.8.RELEASE");
// the rest is the same
BDDAssertions.then(overriddenPomModel.getProperties())
.containsEntry("spring-cloud-sleuth.version", "0.0.3.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getProperties()).containsEntry("spring-cloud-sleuth.version",
"0.0.3.BUILD-SNAPSHOT");
}
@Test
public void should_update_boot_parent_even_if_the_project_group_doesnt_match()
throws Exception {
File originalPom = pom("/projects/project/children",
"pom_case_from_contract.xml");
public void should_update_boot_parent_even_if_the_project_group_doesnt_match() throws Exception {
File originalPom = pom("/projects/project/children", "pom_case_from_contract.xml");
File pomInTemp = tmpFile("/project/children/pom_case_from_contract.xml");
ModelWrapper rootPom = model("spring-cloud-contract",
"org.springframework.cloud");
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp,
this.versionsFromBom);
ModelWrapper rootPom = model("spring-cloud-contract", "org.springframework.cloud");
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, this.versionsFromBom);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom,
pomInTemp);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp);
BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom));
Model overriddenPomModel = PomReader.readPom(storedPom);
BDDAssertions.then(overriddenPomModel.getParent().getVersion())
.isEqualTo("0.0.2.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getParent().getVersion()).isEqualTo("0.0.2.BUILD-SNAPSHOT");
}
@Test
public void should_update_the_child_pom_if_parent_is_matched_via_sc_dependencies_parent()
throws Exception {
public void should_update_the_child_pom_if_parent_is_matched_via_sc_dependencies_parent() throws Exception {
File originalPom = pom("/projects/project/children", "pom_matching_parent.xml");
File pomInTemp = tmpFile("/project/children/pom_matching_parent.xml");
ModelWrapper rootPom = model("spring-cloud-sleuth");
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp,
this.versionsFromBom);
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, this.versionsFromBom);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom,
pomInTemp);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp);
BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom));
Model overriddenPomModel = PomReader.readPom(storedPom);
BDDAssertions.then(overriddenPomModel.getVersion())
.isEqualTo("0.0.3.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getParent().getVersion())
.isEqualTo("0.0.3.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getVersion()).isEqualTo("0.0.3.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getParent().getVersion()).isEqualTo("0.0.3.BUILD-SNAPSHOT");
// the rest is the same
BDDAssertions.then(overriddenPomModel.getProperties())
.containsEntry("spring-cloud-foo.version", "1.3.1.BUILD-SNAPSHOT")
@@ -394,38 +314,30 @@ public class PomUpdaterTests {
@Test
public void should_update_the_child_pom_if_properties_are_matched() throws Exception {
File originalPom = pom("/projects/project/children",
"pom_matching_properties.xml");
File originalPom = pom("/projects/project/children", "pom_matching_properties.xml");
File pomInTemp = tmpFile("/project/children/pom_matching_properties.xml");
ModelWrapper rootPom = model("spring-cloud-sleuth");
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp,
this.versionsFromBom);
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, this.versionsFromBom);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom,
pomInTemp);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp);
BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom));
Model overriddenPomModel = PomReader.readPom(storedPom);
BDDAssertions.then(overriddenPomModel.getVersion())
.isEqualTo("0.0.3.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getParent().getVersion())
.isEqualTo("0.0.3.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getVersion()).isEqualTo("0.0.3.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getParent().getVersion()).isEqualTo("0.0.3.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getProperties())
.containsEntry("spring-cloud-sleuth.version", "0.0.3.BUILD-SNAPSHOT")
.containsEntry("spring-cloud-vault.version", "0.0.4.BUILD-SNAPSHOT");
}
@Test
public void should_override_a_pom_when_there_was_a_change_in_the_model()
throws Exception {
File beforeProcessing = pom("/projects/project/children",
"pom_matching_properties.xml");
public void should_override_a_pom_when_there_was_a_change_in_the_model() throws Exception {
File beforeProcessing = pom("/projects/project/children", "pom_matching_properties.xml");
File afterProcessing = tmpFile("/project/children/pom_matching_properties.xml");
ModelWrapper model = this.pomUpdater.updateModel(model("spring-cloud-sleuth"),
afterProcessing, this.versionsFromBom);
ModelWrapper model = this.pomUpdater.updateModel(model("spring-cloud-sleuth"), afterProcessing,
this.versionsFromBom);
File processedPom = this.pomUpdater.overwritePomIfDirty(model,
VersionsFromBom.EMPTY_VERSION, afterProcessing);
File processedPom = this.pomUpdater.overwritePomIfDirty(model, VersionsFromBom.EMPTY_VERSION, afterProcessing);
String processedPomText = asString(processedPom);
String beforeProcessingText = asString(beforeProcessing);
@@ -433,51 +345,39 @@ public class PomUpdaterTests {
}
@Test
public void should_not_override_a_pom_when_there_was_no_change_in_the_model()
throws Exception {
public void should_not_override_a_pom_when_there_was_no_change_in_the_model() throws Exception {
File beforeProcessing = pom("/projects/project/");
File afterProcessing = tmpFile("/project/pom.xml");
ModelWrapper model = this.pomUpdater.updateModel(model("foo"), afterProcessing,
this.versionsFromBom);
ModelWrapper model = this.pomUpdater.updateModel(model("foo"), afterProcessing, this.versionsFromBom);
File processedPom = this.pomUpdater.overwritePomIfDirty(model,
VersionsFromBom.EMPTY_VERSION, afterProcessing);
File processedPom = this.pomUpdater.overwritePomIfDirty(model, VersionsFromBom.EMPTY_VERSION, afterProcessing);
BDDAssertions.then(asString(processedPom)).isEqualTo(asString(beforeProcessing));
}
@Test
public void should_update_the_model_when_root_project_has_parent_suffix()
throws Exception {
public void should_update_the_model_when_root_project_has_parent_suffix() throws Exception {
File originalPom = pom("/projects/spring-cloud-contract");
File pomInTemp = tmpFile("/spring-cloud-contract/pom.xml");
ModelWrapper rootPom = model("spring-cloud-contract-parent");
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp,
this.versionsFromBom);
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, this.versionsFromBom);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom,
pomInTemp);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp);
BDDAssertions.then(asString(storedPom)).isNotEqualTo(asString(originalPom));
Model overriddenPomModel = PomReader.readPom(storedPom);
BDDAssertions.then(overriddenPomModel.getVersion())
.isEqualTo("0.0.2.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getParent().getVersion())
.isEqualTo("0.0.2");
BDDAssertions.then(overriddenPomModel.getVersion()).isEqualTo("0.0.2.BUILD-SNAPSHOT");
BDDAssertions.then(overriddenPomModel.getParent().getVersion()).isEqualTo("0.0.2");
}
@Test
public void should_not_update_the_model_when_project_uses_same_version_for_artifact()
throws Exception {
File originalPom = pom("/projects/project/",
"pom_matching_artifact_same_version.xml");
public void should_not_update_the_model_when_project_uses_same_version_for_artifact() throws Exception {
File originalPom = pom("/projects/project/", "pom_matching_artifact_same_version.xml");
File pomInTemp = tmpFile("/project/pom_matching_artifact_same_version.xml");
ModelWrapper rootPom = model("spring-cloud-sleuth");
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp,
this.versionsFromBom);
ModelWrapper model = this.pomUpdater.updateModel(rootPom, pomInTemp, this.versionsFromBom);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom,
pomInTemp);
File storedPom = this.pomUpdater.overwritePomIfDirty(model, this.versionsFromBom, pomInTemp);
BDDAssertions.then(asString(storedPom)).isEqualTo(asString(originalPom));
}
@@ -518,8 +418,7 @@ public class PomUpdaterTests {
}
private File pom(String relativePath, String pomName) throws URISyntaxException {
return new File(new File(GitRepoTests.class.getResource(relativePath).toURI()),
pomName);
return new File(new File(GitRepoTests.class.getResource(relativePath).toURI()), pomName);
}
private String asString(File file) throws IOException {

View File

@@ -19,7 +19,7 @@ package releaser.internal.buildsystem;
import java.io.File;
import java.util.Collections;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import org.mockito.BDDMockito;
import releaser.SpringCloudReleaserProperties;
import releaser.internal.ReleaserProperties;
@@ -36,13 +36,12 @@ public class ProjectPomUpdaterTests {
public void should_skip_any_steps_if_there_is_no_pom_xml() {
ReleaserProperties properties = SpringCloudReleaserProperties.get();
ProjectGitHandler handler = BDDMockito.mock(ProjectGitHandler.class);
ProjectPomUpdater updater = new ProjectPomUpdater(properties,
Collections.emptyList());
ProjectPomUpdater updater = new ProjectPomUpdater(properties, Collections.emptyList());
updater.updateProjectFromReleaseTrain(new File("target"), new Projects(),
new ProjectVersion("foo", "1.0.0.RELEASE"), false);
BDDMockito.then(handler).shouldHaveZeroInteractions();
BDDMockito.then(handler).shouldHaveNoInteractions();
}
}

View File

@@ -22,8 +22,8 @@ import java.net.URISyntaxException;
import java.util.List;
import java.util.regex.Pattern;
import org.junit.Before;
import org.junit.Test;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import releaser.internal.git.GitRepoTests;
import releaser.internal.project.ProjectVersion;
@@ -40,12 +40,10 @@ public class ProjectVersionTests {
File springCloudContract;
@Before
@BeforeEach
public void setup() throws URISyntaxException {
URI scRelease = GitRepoTests.class.getResource("/projects/spring-cloud-release")
.toURI();
URI scContract = GitRepoTests.class.getResource("/projects/spring-cloud-contract")
.toURI();
URI scRelease = GitRepoTests.class.getResource("/projects/spring-cloud-release").toURI();
URI scContract = GitRepoTests.class.getResource("/projects/spring-cloud-contract").toURI();
this.springCloudReleaseProject = new File(scRelease.getPath(), "pom.xml");
this.springCloudContract = new File(scContract.getPath(), "pom.xml");
}
@@ -60,8 +58,7 @@ public class ProjectVersionTests {
@Test
public void should_build_version_from_file() {
ProjectVersion projectVersion = new ProjectVersion(
this.springCloudReleaseProject);
ProjectVersion projectVersion = new ProjectVersion(this.springCloudReleaseProject);
then(projectVersion.version).isEqualTo("Dalston.BUILD-SNAPSHOT");
then(projectVersion.projectName).isEqualTo("spring-cloud-starter-build");
@@ -86,8 +83,8 @@ public class ProjectVersionTests {
public void should_throw_exception_if_version_is_not_long_enough() {
String version = "1";
thenThrownBy(() -> projectVersion(version).bumpedVersion())
.isInstanceOf(IllegalStateException.class).hasMessageContaining(
thenThrownBy(() -> projectVersion(version).bumpedVersion()).isInstanceOf(IllegalStateException.class)
.hasMessageContaining(
"Version [1] is invalid. Should be of format [1.2.3.A] / [1.2.3-A] or [A.B] / [A-B]");
}
@@ -143,8 +140,8 @@ public class ProjectVersionTests {
public void should_throw_exception_when_trying_to_get_major_from_invalid_version() {
String version = "1";
thenThrownBy(() -> projectVersion(version).major())
.isInstanceOf(IllegalStateException.class).hasMessageContaining(
thenThrownBy(() -> projectVersion(version).major()).isInstanceOf(IllegalStateException.class)
.hasMessageContaining(
"Version [1] is invalid. Should be of format [1.2.3.A] / [1.2.3-A] or [A.B] / [A-B]");
}
@@ -163,88 +160,70 @@ public class ProjectVersionTests {
@Test
public void should_not_bump_version_by_patch_version_when_non_ga_or_sr() {
then(projectVersion("1.0.1-SNAPSHOT").postReleaseSnapshotVersion())
.isEqualTo("1.0.1-SNAPSHOT");
then(projectVersion("1.0.1-M1").postReleaseSnapshotVersion())
.isEqualTo("1.0.1-SNAPSHOT");
then(projectVersion("1.0.1-RC1").postReleaseSnapshotVersion())
.isEqualTo("1.0.1-SNAPSHOT");
then(projectVersion("Finchley-SR1").postReleaseSnapshotVersion())
.isEqualTo("Finchley-SNAPSHOT");
then(projectVersion("1.0.1-SNAPSHOT").postReleaseSnapshotVersion()).isEqualTo("1.0.1-SNAPSHOT");
then(projectVersion("1.0.1-M1").postReleaseSnapshotVersion()).isEqualTo("1.0.1-SNAPSHOT");
then(projectVersion("1.0.1-RC1").postReleaseSnapshotVersion()).isEqualTo("1.0.1-SNAPSHOT");
then(projectVersion("Finchley-SR1").postReleaseSnapshotVersion()).isEqualTo("Finchley-SNAPSHOT");
}
@Test
public void should_not_bump_version_by_patch_version_when_non_ga_or_sr_with_hyphen() {
then(projectVersion("1.0.1-SNAPSHOT").postReleaseSnapshotVersion())
.isEqualTo("1.0.1-SNAPSHOT");
then(projectVersion("1.0.1-M1").postReleaseSnapshotVersion())
.isEqualTo("1.0.1-SNAPSHOT");
then(projectVersion("1.0.1-RC1").postReleaseSnapshotVersion())
.isEqualTo("1.0.1-SNAPSHOT");
then(projectVersion("Finchley-SR1").postReleaseSnapshotVersion())
.isEqualTo("Finchley-SNAPSHOT");
then(projectVersion("1.0.1-SNAPSHOT").postReleaseSnapshotVersion()).isEqualTo("1.0.1-SNAPSHOT");
then(projectVersion("1.0.1-M1").postReleaseSnapshotVersion()).isEqualTo("1.0.1-SNAPSHOT");
then(projectVersion("1.0.1-RC1").postReleaseSnapshotVersion()).isEqualTo("1.0.1-SNAPSHOT");
then(projectVersion("Finchley-SR1").postReleaseSnapshotVersion()).isEqualTo("Finchley-SNAPSHOT");
}
@Test
public void should_bump_version_by_patch_version_when_bumping_snapshots_for_ga() {
then(projectVersion("1.0.1-RELEASE").postReleaseSnapshotVersion())
.isEqualTo("1.0.2-SNAPSHOT");
then(projectVersion("1.0.1-RELEASE").postReleaseSnapshotVersion()).isEqualTo("1.0.2-SNAPSHOT");
}
@Test
public void should_return_the_previous_version_for_release_train_version_when_bumping_snapshots() {
String version = "Edgware-SNAPSHOT";
then(projectVersion(version).postReleaseSnapshotVersion())
.isEqualTo("Edgware-SNAPSHOT");
then(projectVersion(version).postReleaseSnapshotVersion()).isEqualTo("Edgware-SNAPSHOT");
}
@Test
public void should_return_the_previous_version_for_hyphen_release_train_version_when_bumping_snapshots() {
String version = "Edgware-SNAPSHOT";
then(projectVersion(version).postReleaseSnapshotVersion())
.isEqualTo("Edgware-SNAPSHOT");
then(projectVersion(version).postReleaseSnapshotVersion()).isEqualTo("Edgware-SNAPSHOT");
}
@Test
public void should_bump_version_by_patch_version_when_bumping_releases() {
String version = "1.0.1-RELEASE";
then(projectVersion(version).postReleaseSnapshotVersion())
.isEqualTo("1.0.2-SNAPSHOT");
then(projectVersion(version).postReleaseSnapshotVersion()).isEqualTo("1.0.2-SNAPSHOT");
}
@Test
public void should_bump_version_by_patch_version_when_bumping_releases_with_hyphen() {
String version = "1.0.1-RELEASE";
then(projectVersion(version).postReleaseSnapshotVersion())
.isEqualTo("1.0.2-SNAPSHOT");
then(projectVersion(version).postReleaseSnapshotVersion()).isEqualTo("1.0.2-SNAPSHOT");
version = "3.1.0";
then(projectVersion(version).postReleaseSnapshotVersion())
.isEqualTo("3.1.1-SNAPSHOT");
then(projectVersion(version).postReleaseSnapshotVersion()).isEqualTo("3.1.1-SNAPSHOT");
version = "3.0.0";
then(projectVersion(version).postReleaseSnapshotVersion())
.isEqualTo("3.0.1-SNAPSHOT");
then(projectVersion(version).postReleaseSnapshotVersion()).isEqualTo("3.0.1-SNAPSHOT");
version = "2.0.0";
then(projectVersion(version).postReleaseSnapshotVersion())
.isEqualTo("2.0.1-SNAPSHOT");
then(projectVersion(version).postReleaseSnapshotVersion()).isEqualTo("2.0.1-SNAPSHOT");
version = "3.0.1";
then(projectVersion(version).postReleaseSnapshotVersion())
.isEqualTo("3.0.2-SNAPSHOT");
then(projectVersion(version).postReleaseSnapshotVersion()).isEqualTo("3.0.2-SNAPSHOT");
}
@Test
public void should_return_the_previous_version_for_release_train_version_when_bumping_releases() {
String version = "Edgware-RELEASE";
then(projectVersion(version).postReleaseSnapshotVersion())
.isEqualTo("Edgware-SNAPSHOT");
then(projectVersion(version).postReleaseSnapshotVersion()).isEqualTo("Edgware-SNAPSHOT");
}
@Test
@@ -407,8 +386,7 @@ public class ProjectVersionTests {
String thisVersion = "1.3.2-SR3";
String thatVersion = "1.3.1-SR3";
then(projectVersion(thisVersion).compareTo(projectVersion(thatVersion)))
.isPositive();
then(projectVersion(thisVersion).compareTo(projectVersion(thatVersion))).isPositive();
}
@Test
@@ -416,117 +394,72 @@ public class ProjectVersionTests {
String thisVersion = "1.3.0-RC3";
String thatVersion = "1.3.1-RC3";
then(projectVersion(thisVersion).compareTo(projectVersion(thatVersion)))
.isNegative();
then(projectVersion(thisVersion).compareTo(projectVersion(thatVersion))).isNegative();
}
@Test
public void should_compare_builds_in_terms_of_maturity_for_projects() {
String thisVersion = "1.3.2.RELEASE";
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.3.1-SNAPSHOT")))
.isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.3.1-M1")))
.isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.3.1-RC1")))
.isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.3.1.RELEASE")))
.isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.3.3.RELEASE")))
.isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.3.3-SNAPSHOT")))
.isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.3.3-M1")))
.isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.3.3-RC1")))
.isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.3.1-SNAPSHOT"))).isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.3.1-M1"))).isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.3.1-RC1"))).isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.3.1.RELEASE"))).isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.3.3.RELEASE"))).isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.3.3-SNAPSHOT"))).isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.3.3-M1"))).isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.3.3-RC1"))).isTrue();
}
@Test
public void should_compare_builds_in_terms_of_maturity_for_trains() {
String thisVersion = "Hoxton-SR1";
then(projectVersion(thisVersion).isMoreMature(projectVersion("Hoxton-SNAPSHOT")))
.isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Hoxton-M1")))
.isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Hoxton-RC1")))
.isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Hoxton.RELEASE")))
.isTrue();
then(projectVersion(thisVersion)
.isMoreMature(projectVersion("Iexample-SNAPSHOT"))).isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Iexample-M1")))
.isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Iexample-RC1")))
.isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Iexample.RELEASE")))
.isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Iexample-SR1")))
.isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Hoxton-SNAPSHOT"))).isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Hoxton-M1"))).isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Hoxton-RC1"))).isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Hoxton.RELEASE"))).isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Iexample-SNAPSHOT"))).isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Iexample-M1"))).isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Iexample-RC1"))).isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Iexample.RELEASE"))).isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Iexample-SR1"))).isFalse();
thisVersion = "Hoxton-SNAPSHOT";
then(projectVersion(thisVersion).isMoreMature(projectVersion("Hoxton-SNAPSHOT")))
.isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Hoxton-M1")))
.isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Hoxton-RC1")))
.isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Hoxton.RELEASE")))
.isFalse();
then(projectVersion(thisVersion)
.isMoreMature(projectVersion("Iexample-SNAPSHOT"))).isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Iexample-M1")))
.isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Iexample-RC1")))
.isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Iexample.RELEASE")))
.isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Iexample-SR1")))
.isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Hoxton-SNAPSHOT"))).isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Hoxton-M1"))).isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Hoxton-RC1"))).isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Hoxton.RELEASE"))).isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Iexample-SNAPSHOT"))).isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Iexample-M1"))).isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Iexample-RC1"))).isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Iexample.RELEASE"))).isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("Iexample-SR1"))).isFalse();
thisVersion = "1.0.1.RELEASE";
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.1-SNAPSHOT")))
.isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.1-M1")))
.isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.1-RC1")))
.isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.1.RELEASE")))
.isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.2-SNAPSHOT")))
.isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.2-M1")))
.isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.2-RC1")))
.isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.2.RELEASE")))
.isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.2-SR1")))
.isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.1-SNAPSHOT"))).isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.1-M1"))).isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.1-RC1"))).isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.1.RELEASE"))).isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.2-SNAPSHOT"))).isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.2-M1"))).isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.2-RC1"))).isTrue();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.2.RELEASE"))).isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.2-SR1"))).isFalse();
thisVersion = "1.0.1-SNAPSHOT";
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.1-SNAPSHOT")))
.isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.1-M1")))
.isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.1-RC1")))
.isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.1.RELEASE")))
.isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.2-SNAPSHOT")))
.isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.2-M1")))
.isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.2-RC1")))
.isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.2.RELEASE")))
.isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.2-SR1")))
.isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.1-SNAPSHOT"))).isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.1-M1"))).isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.1-RC1"))).isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.1.RELEASE"))).isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.2-SNAPSHOT"))).isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.2-M1"))).isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.2-RC1"))).isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.2.RELEASE"))).isFalse();
then(projectVersion(thisVersion).isMoreMature(projectVersion("1.0.2-SR1"))).isFalse();
}
@Test
@@ -711,31 +644,26 @@ public class ProjectVersionTests {
@Test
public void should_return_snapshot_unacceptable_patterns_for_a_milestone_or_rc_version() {
List<Pattern> milestonePatterns = projectVersion("1.0.0-M1")
.unacceptableVersionPatterns();
List<Pattern> milestonePatterns = projectVersion("1.0.0-M1").unacceptableVersionPatterns();
then(milestonePatterns).isNotEmpty();
then(milestonePatterns.get(0).pattern()).contains("SNAPSHOT");
List<Pattern> rcPatterns = projectVersion("1.0.0-RC1")
.unacceptableVersionPatterns();
List<Pattern> rcPatterns = projectVersion("1.0.0-RC1").unacceptableVersionPatterns();
then(rcPatterns).isNotEmpty();
then(rcPatterns.get(0).pattern()).contains("SNAPSHOT");
List<Pattern> milestonePatternsWithDash = projectVersion("1.0.0-M1")
.unacceptableVersionPatterns();
List<Pattern> milestonePatternsWithDash = projectVersion("1.0.0-M1").unacceptableVersionPatterns();
then(milestonePatternsWithDash).isNotEmpty();
then(milestonePatternsWithDash.get(0).pattern()).contains("SNAPSHOT");
List<Pattern> rcPatternsWithDash = projectVersion("1.0.0-RC1")
.unacceptableVersionPatterns();
List<Pattern> rcPatternsWithDash = projectVersion("1.0.0-RC1").unacceptableVersionPatterns();
then(rcPatternsWithDash).isNotEmpty();
then(rcPatternsWithDash.get(0).pattern()).contains("SNAPSHOT");
}
@Test
public void should_return_snapshot_milestone_rc_unacceptable_patterns_for_a_ga_or_sr_version() {
List<Pattern> gaPatterns = projectVersion("1.0.0.RELEASE")
.unacceptableVersionPatterns();
List<Pattern> gaPatterns = projectVersion("1.0.0.RELEASE").unacceptableVersionPatterns();
thenPatternsForSnapshotMilestoneAndReleaseCandidateArePresent(gaPatterns);
gaPatterns = projectVersion("1.0.0").unacceptableVersionPatterns();
@@ -744,24 +672,19 @@ public class ProjectVersionTests {
gaPatterns = projectVersion("1.0.0-RELEASE").unacceptableVersionPatterns();
thenPatternsForSnapshotMilestoneAndReleaseCandidateArePresent(gaPatterns);
List<Pattern> srPatterns = projectVersion("1.0.0-SR1")
.unacceptableVersionPatterns();
List<Pattern> srPatterns = projectVersion("1.0.0-SR1").unacceptableVersionPatterns();
thenPatternsForSnapshotMilestoneAndReleaseCandidateArePresent(srPatterns);
List<Pattern> srPatternsWithDash = projectVersion("1.0.0-SR1")
.unacceptableVersionPatterns();
List<Pattern> srPatternsWithDash = projectVersion("1.0.0-SR1").unacceptableVersionPatterns();
thenPatternsForSnapshotMilestoneAndReleaseCandidateArePresent(srPatternsWithDash);
List<Pattern> unknownTypeOfVersion = projectVersion("1.0.0.SOMETHING")
.unacceptableVersionPatterns();
thenPatternsForSnapshotMilestoneAndReleaseCandidateArePresent(
unknownTypeOfVersion);
List<Pattern> unknownTypeOfVersion = projectVersion("1.0.0.SOMETHING").unacceptableVersionPatterns();
thenPatternsForSnapshotMilestoneAndReleaseCandidateArePresent(unknownTypeOfVersion);
}
@Test
public void should_return_v100RELEASE_when_tag_name_is_requested() {
then(projectVersion("1.0.0.RELEASE").releaseTagName())
.isEqualTo("v1.0.0.RELEASE");
then(projectVersion("1.0.0.RELEASE").releaseTagName()).isEqualTo("v1.0.0.RELEASE");
}
@Test
@@ -771,93 +694,77 @@ public class ProjectVersionTests {
@Test
public void should_return_decremented_patch_when_patch_above_zero() {
then(projectVersion("1.2.3.RELEASE").computePreviousPatchTag("v", "RELEASE"))
.contains("v1.2.2.RELEASE");
then(projectVersion("1.2.3.RELEASE").computePreviousPatchTag("v", "RELEASE")).contains("v1.2.2.RELEASE");
}
@Test
public void should_use_current_suffix_if_no_forced_suffix() {
then(projectVersion("1.2.3.WHATEVER").computePreviousPatchTag("v", ""))
.contains("v1.2.2.WHATEVER");
then(projectVersion("1.2.3.WHATEVER").computePreviousPatchTag("v", "")).contains("v1.2.2.WHATEVER");
}
@Test
public void should_replace_suffix() {
then(projectVersion("1.2.3.WHATEVER").computePreviousPatchTag("v", "RELEASE"))
.contains("v1.2.2.RELEASE");
then(projectVersion("1.2.3.WHATEVER").computePreviousPatchTag("v", "RELEASE")).contains("v1.2.2.RELEASE");
}
@Test
public void should_return_empty_when_patch_at_zero() {
then(projectVersion("1.2.0.WHATEVER").computePreviousPatchTag("v", "RELEASE"))
.isEmpty();
then(projectVersion("1.2.0.WHATEVER").computePreviousPatchTag("v", "RELEASE")).isEmpty();
}
@Test
public void should_return_minor_pattern_when_minor_above_zero() {
then(projectVersion("1.2.0.WHATEVER")
.computePreviousMinorTagPattern("v", "RELEASE").get().pattern())
.isEqualTo("\\Qv1.1.\\E\\d+\\Q.RELEASE\\E");
then(projectVersion("1.2.0.WHATEVER").computePreviousMinorTagPattern("v", "RELEASE").get().pattern())
.isEqualTo("\\Qv1.1.\\E\\d+\\Q.RELEASE\\E");
}
@Test
public void should_compute_minor_pattern_with_current_suffix_if_no_forced_suffix() {
then(projectVersion("1.2.0.WHATEVER").computePreviousMinorTagPattern("v", "")
.get().pattern()).isEqualTo("\\Qv1.1.\\E\\d+\\Q.WHATEVER\\E");
then(projectVersion("1.2.0.WHATEVER").computePreviousMinorTagPattern("v", "").get().pattern())
.isEqualTo("\\Qv1.1.\\E\\d+\\Q.WHATEVER\\E");
}
@Test
public void should_return_empty_minor_pattern_when_minor_zero() {
then(projectVersion("1.0.0.WHATEVER").computePreviousMinorTagPattern("v",
"RELEASE")).isEmpty();
then(projectVersion("1.0.0.WHATEVER").computePreviousMinorTagPattern("v", "RELEASE")).isEmpty();
}
@Test
public void should_return_major_pattern_when_major_above_zero() {
then(projectVersion("1.0.0.WHATEVER")
.computePreviousMajorTagPattern("v", "RELEASE").pattern())
.isEqualTo("\\Qv0.\\E\\d+\\Q.\\E\\d+\\Q.RELEASE\\E");
then(projectVersion("1.0.0.WHATEVER").computePreviousMajorTagPattern("v", "RELEASE").pattern())
.isEqualTo("\\Qv0.\\E\\d+\\Q.\\E\\d+\\Q.RELEASE\\E");
}
@Test
public void should_compute_major_pattern_with_current_suffix_if_no_forced_suffix() {
then(projectVersion("1.0.0.WHATEVER").computePreviousMajorTagPattern("v", "")
.pattern()).isEqualTo("\\Qv0.\\E\\d+\\Q.\\E\\d+\\Q.WHATEVER\\E");
then(projectVersion("1.0.0.WHATEVER").computePreviousMajorTagPattern("v", "").pattern())
.isEqualTo("\\Qv0.\\E\\d+\\Q.\\E\\d+\\Q.WHATEVER\\E");
}
@Test
public void should_throw_major_pattern_when_major_zero() {
assertThatIllegalArgumentException()
.isThrownBy(() -> projectVersion("0.0.1.WHATEVER")
.computePreviousMajorTagPattern("v", "RELEASE"));
.isThrownBy(() -> projectVersion("0.0.1.WHATEVER").computePreviousMajorTagPattern("v", "RELEASE"));
}
private void thenPatternsForSnapshotMilestoneAndReleaseCandidateArePresent(
List<Pattern> unknownTypeOfVersion) {
private void thenPatternsForSnapshotMilestoneAndReleaseCandidateArePresent(List<Pattern> unknownTypeOfVersion) {
then(unknownTypeOfVersion).isNotEmpty();
then(unknownTypeOfVersion.get(0).pattern()).contains("SNAPSHOT");
then(unknownTypeOfVersion.get(1).pattern()).contains("M[0-9]");
then(unknownTypeOfVersion.get(2).pattern()).contains("RC");
then(unknownTypeOfVersion.get(0).matcher("SomeName-SNAPSHOT").lookingAt())
.isTrue();
then(unknownTypeOfVersion.get(0).matcher("SomeName.BUILD-SNAPSHOT").lookingAt())
.isTrue();
then(unknownTypeOfVersion.get(0)
.matcher("\t\t<version>1.19.2-SNAPSHOT</version>\n").lookingAt())
.isTrue();
then(unknownTypeOfVersion.get(0).matcher("SomeName-SNAPSHOT").lookingAt()).isTrue();
then(unknownTypeOfVersion.get(0).matcher("SomeName.BUILD-SNAPSHOT").lookingAt()).isTrue();
then(unknownTypeOfVersion.get(0).matcher("\t\t<version>1.19.2-SNAPSHOT</version>\n").lookingAt()).isTrue();
then(unknownTypeOfVersion.get(1).matcher("SomeName-M3").lookingAt()).isTrue();
then(unknownTypeOfVersion.get(1).matcher("SomeName.M3").lookingAt()).isTrue();
then(unknownTypeOfVersion.get(1)
.matcher("\t\t<zipkin.version>1.19.2-M2</zipkin.version>\n").lookingAt())
.isTrue();
then(unknownTypeOfVersion.get(1).matcher("\t\t<zipkin.version>1.19.2-M2</zipkin.version>\n").lookingAt())
.isTrue();
then(unknownTypeOfVersion.get(2).matcher("SomeName-RC3").lookingAt()).isTrue();
then(unknownTypeOfVersion.get(2).matcher("SomeName.RC3").lookingAt()).isTrue();
then(unknownTypeOfVersion.get(2)
.matcher("<zipkin.version>1.19.2-RC1</zipkin.version>").lookingAt())
.isTrue();
then(unknownTypeOfVersion.get(2).matcher("<zipkin.version>1.19.2-RC1</zipkin.version>").lookingAt()).isTrue();
}
private ProjectVersion projectVersion(String version) {

View File

@@ -22,7 +22,7 @@ import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import releaser.SpringCloudReleaserProperties;
import releaser.internal.ReleaserProperties;
import releaser.internal.project.ProjectVersion;
@@ -71,8 +71,7 @@ public class ProjectsTests {
projectVersions.add(new ProjectVersion("spring-boot-starter-build", "1.0.0"));
Projects projects = new Projects(projectVersions);
then(projects.forNameStartingWith("spring-boot").get(0).version)
.isEqualTo("1.0.0");
then(projects.forNameStartingWith("spring-boot").get(0).version).isEqualTo("1.0.0");
}
@Test
@@ -82,25 +81,18 @@ public class ProjectsTests {
projectVersions.add(build);
ProjectVersion boot = new ProjectVersion("spring-boot-starter", "2.0.0-RELEASE");
projectVersions.add(boot);
ProjectVersion bootDeps = new ProjectVersion("spring-boot-dependencies",
"2.0.0.RELEASE");
ProjectVersion bootDeps = new ProjectVersion("spring-boot-dependencies", "2.0.0.RELEASE");
projectVersions.add(bootDeps);
ProjectVersion original = new ProjectVersion("spring-cloud-starter-foo",
"3.0.0.BUILD-SNAPSHOT");
ProjectVersion original = new ProjectVersion("spring-cloud-starter-foo", "3.0.0.BUILD-SNAPSHOT");
projectVersions.add(original);
Projects projects = new Projects(projectVersions);
Projects forRollback = Projects.forRollback(SpringCloudReleaserProperties.get(),
projects);
Projects forRollback = Projects.forRollback(SpringCloudReleaserProperties.get(), projects);
then(forRollback.forName("spring-cloud-build").version)
.isEqualTo("1.0.1-SNAPSHOT");
then(forRollback.forName("spring-boot-starter").version)
.isEqualTo("2.0.0-RELEASE");
then(forRollback.forName("spring-boot-dependencies").version)
.isEqualTo("2.0.0.RELEASE");
then(forRollback.forName("spring-cloud-starter-foo").version)
.isEqualTo("3.0.0.BUILD-SNAPSHOT");
then(forRollback.forName("spring-cloud-build").version).isEqualTo("1.0.1-SNAPSHOT");
then(forRollback.forName("spring-boot-starter").version).isEqualTo("2.0.0-RELEASE");
then(forRollback.forName("spring-boot-dependencies").version).isEqualTo("2.0.0.RELEASE");
then(forRollback.forName("spring-cloud-starter-foo").version).isEqualTo("3.0.0.BUILD-SNAPSHOT");
}
@Test
@@ -149,8 +141,7 @@ public class ProjectsTests {
@Test
public void should_return_projects_with_bumped_versions() {
Set<ProjectVersion> projectVersions = new HashSet<>();
projectVersions
.add(new ProjectVersion("spring-boot-dependencies", "2.0.0.RELEASE"));
projectVersions.add(new ProjectVersion("spring-boot-dependencies", "2.0.0.RELEASE"));
projectVersions.add(new ProjectVersion("spring-boot-starter", "2.0.0.RELEASE"));
projectVersions.add(new ProjectVersion("foo", "1.0.0.RELEASE"));
projectVersions.add(new ProjectVersion("bar", "1.0.1.M1"));
@@ -160,11 +151,9 @@ public class ProjectsTests {
projectVersions.add(new ProjectVersion("foo4", "Finchley.SR4"));
Projects projects = new Projects(projectVersions);
Projects bumped = projects
.postReleaseSnapshotVersion(Collections.singletonList("spring-boot"));
Projects bumped = projects.postReleaseSnapshotVersion(Collections.singletonList("spring-boot"));
then(bumped.forName("spring-boot-dependencies").version)
.isEqualTo("2.0.0.RELEASE");
then(bumped.forName("spring-boot-dependencies").version).isEqualTo("2.0.0.RELEASE");
then(bumped.forName("spring-boot-starter").version).isEqualTo("2.0.0.RELEASE");
then(bumped.forName("foo").version).isEqualTo("1.0.1.SNAPSHOT");
then(bumped.forName("bar").version).isEqualTo("1.0.1.SNAPSHOT");
@@ -180,9 +169,8 @@ public class ProjectsTests {
projectVersions.add(new ProjectVersion("foo", "1.0.0"));
Projects projects = new Projects(projectVersions);
thenThrownBy(() -> projects.forFile(this.springCloudReleasePom))
.isInstanceOf(IllegalStateException.class).hasMessageContaining(
"Project with name [spring-cloud-starter-build] is not present");
thenThrownBy(() -> projects.forFile(this.springCloudReleasePom)).isInstanceOf(IllegalStateException.class)
.hasMessageContaining("Project with name [spring-cloud-starter-build] is not present");
}
@Test
@@ -191,9 +179,8 @@ public class ProjectsTests {
projectVersions.add(new ProjectVersion("foo", "1.0.0"));
Projects projects = new Projects(projectVersions);
thenThrownBy(() -> projects.forName("spring-cloud-starter-build"))
.isInstanceOf(IllegalStateException.class).hasMessageContaining(
"Project with name [spring-cloud-starter-build] is not present");
thenThrownBy(() -> projects.forName("spring-cloud-starter-build")).isInstanceOf(IllegalStateException.class)
.hasMessageContaining("Project with name [spring-cloud-starter-build] is not present");
}
@Test
@@ -224,9 +211,8 @@ public class ProjectsTests {
projectVersions.add(new ProjectVersion("foo", "1.0.0"));
Projects projects = new Projects(projectVersions);
thenThrownBy(() -> projects.releaseTrain(properties))
.isInstanceOf(IllegalStateException.class).hasMessageContaining(
"don't contain any of the following release train names");
thenThrownBy(() -> projects.releaseTrain(properties)).isInstanceOf(IllegalStateException.class)
.hasMessageContaining("don't contain any of the following release train names");
}
private File file(String relativePath) {

View File

@@ -18,12 +18,12 @@ package releaser.internal.buildsystem;
import org.apache.maven.plugin.logging.Log;
import org.codehaus.mojo.versions.rewriting.ModifiedPomXMLEventReader;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.BDDMockito;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.junit.jupiter.MockitoExtension;
import releaser.internal.project.Project;
import static org.mockito.BDDMockito.then;
@@ -31,7 +31,7 @@ import static org.mockito.BDDMockito.then;
/**
* @author Marcin Grzejszczak
*/
@RunWith(MockitoJUnitRunner.class)
@ExtendWith(MockitoExtension.class)
public class PropertyStorerTests {
@Mock
@@ -51,8 +51,7 @@ public class PropertyStorerTests {
}
private String containsWarnMsgAboutEmptyVersion() {
return BDDMockito
.argThat(argument -> argument.contains("is empty. Will not set it"));
return BDDMockito.argThat(argument -> argument.contains("is empty. Will not set it"));
}
}

View File

@@ -22,10 +22,10 @@ import java.util.Set;
import edu.emory.mathcs.backport.java.util.Arrays;
import org.apache.maven.model.Model;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.junit.jupiter.MockitoExtension;
import releaser.internal.ReleaserProperties;
import releaser.internal.project.Project;
@@ -36,57 +36,52 @@ import static org.mockito.Mockito.never;
/**
* @author Marcin Grzejszczak
*/
@RunWith(MockitoJUnitRunner.class)
@ExtendWith(MockitoExtension.class)
public class PropertyVersionChangerTests {
@Mock
PropertyStorer propertyStorer;
@Test
public void should_set_version_when_project_matches_property_name() throws Exception {
PropertyVersionChanger changer = new PropertyVersionChanger(model(), versions(),
null, null, this.propertyStorer);
public void should_set_version_when_project_matches_property_name() {
PropertyVersionChanger changer = new PropertyVersionChanger(model(), versions(), null, null,
this.propertyStorer);
changer.apply(null);
then(this.propertyStorer).should().setPropertyVersionIfApplicable(
project("spring-cloud-sleuth", "1.2.0.BUILD-SNAPSHOT"));
then(this.propertyStorer).should()
.setPropertyVersionIfApplicable(project("spring-cloud-sleuth", "1.2.0.BUILD-SNAPSHOT"));
}
@Test
public void should_not_set_version_when_project_doesnt_match_property_name()
throws Exception {
PropertyVersionChanger changer = new PropertyVersionChanger(nonMatchingModel(),
versions(), null, null, this.propertyStorer);
public void should_not_set_version_when_project_doesnt_match_property_name() {
PropertyVersionChanger changer = new PropertyVersionChanger(nonMatchingModel(), versions(), null, null,
this.propertyStorer);
changer.apply(null);
then(this.propertyStorer).should(never())
.setPropertyVersionIfApplicable(any(Project.class));
then(this.propertyStorer).should(never()).setPropertyVersionIfApplicable(any(Project.class));
}
@Test
public void should_not_set_version_when_project_matches_property_name_and_versions_are_the_same()
throws Exception {
PropertyVersionChanger changer = new PropertyVersionChanger(modelWithSameValues(),
versions(), null, null, this.propertyStorer);
public void should_not_set_version_when_project_matches_property_name_and_versions_are_the_same() {
PropertyVersionChanger changer = new PropertyVersionChanger(modelWithSameValues(), versions(), null, null,
this.propertyStorer);
changer.apply(null);
then(this.propertyStorer).should(never())
.setPropertyVersionIfApplicable(any(Project.class));
then(this.propertyStorer).should(never()).setPropertyVersionIfApplicable(any(Project.class));
}
VersionsFromBom versions() {
return new VersionsFromBomBuilder().releaserProperties(new ReleaserProperties())
.projects(allProjects()).retrieveFromBom();
return new VersionsFromBomBuilder().releaserProperties(new ReleaserProperties()).projects(allProjects())
.retrieveFromBom();
}
@SuppressWarnings("unchecked")
private Set<Project> allProjects() {
return new HashSet<>(Arrays.asList(
new Project[] { project("spring-cloud-aws", "1.2.0.BUILD-SNAPSHOT"),
project("spring-cloud-sleuth", "1.2.0.BUILD-SNAPSHOT") }));
return new HashSet<>(Arrays.asList(new Project[] { project("spring-cloud-aws", "1.2.0.BUILD-SNAPSHOT"),
project("spring-cloud-sleuth", "1.2.0.BUILD-SNAPSHOT") }));
}
Project project(String name, String value) {

View File

@@ -36,8 +36,7 @@ public final class TestUtils {
prepareLocalRepo("target/test-classes/projects/", "spring-cloud-static");
}
private static void prepareLocalRepo(String buildDir, String repoPath)
throws IOException {
private static void prepareLocalRepo(String buildDir, String repoPath) throws IOException {
File dotGit = new File(buildDir + repoPath + "/.git");
File git = new File(buildDir + repoPath + "/git");
if (git.exists()) {

View File

@@ -54,12 +54,10 @@ class VersionChangeAssert extends AbstractAssert<VersionChangeAssert, ListOfChan
super(actual, VersionChangeAssert.class);
}
VersionChangeAssert newParentVersionIsEqualTo(String groupId, String artifactId,
String newVersion) {
VersionChangeAssert newParentVersionIsEqualTo(String groupId, String artifactId, String newVersion) {
boolean matches = false;
for (VersionChange change : this.actual.changes) {
if (newVersion.equals(change.getNewVersion())
&& groupId.equals(change.getGroupId())
if (newVersion.equals(change.getNewVersion()) && groupId.equals(change.getGroupId())
&& artifactId.equals(change.getArtifactId())) {
matches = true;
break;

View File

@@ -21,7 +21,7 @@ import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import releaser.SpringCloudReleaserProperties;
import releaser.internal.ReleaserProperties;
import releaser.internal.project.Project;
@@ -34,8 +34,7 @@ import static org.assertj.core.api.BDDAssertions.then;
public class VersionsFromBomTests {
VersionsFromBom versionsFromBom = new VersionsFromBomBuilder()
.releaserProperties(SpringCloudReleaserProperties.get()).projects(projects())
.retrieveFromBom();
.releaserProperties(SpringCloudReleaserProperties.get()).projects(projects()).retrieveFromBom();
@Test
public void should_return_true_when_project_is_on_the_list() {
@@ -79,95 +78,65 @@ public class VersionsFromBomTests {
@Test
public void should_update_projects_for_spring_cloud_release() {
VersionsFromBom versionsFromBom = mixedVersions().setVersion("spring-cloud",
"3.0.0");
VersionsFromBom versionsFromBom = mixedVersions().setVersion("spring-cloud", "3.0.0");
then(versionsFromBom.versionForProject("spring-cloud")).isEqualTo("3.0.0");
then(versionsFromBom.versionForProject("spring-cloud-release"))
.isEqualTo("3.0.0");
then(versionsFromBom.versionForProject("spring-cloud-starter"))
.isEqualTo("3.0.0");
then(versionsFromBom.versionForProject("spring-cloud-dependencies"))
.isEqualTo("3.0.0");
then(versionsFromBom.versionForProject("spring-cloud-release")).isEqualTo("3.0.0");
then(versionsFromBom.versionForProject("spring-cloud-starter")).isEqualTo("3.0.0");
then(versionsFromBom.versionForProject("spring-cloud-dependencies")).isEqualTo("3.0.0");
versionsFromBom = mixedVersions().setVersion("spring-cloud-release", "3.0.0");
then(versionsFromBom.versionForProject("spring-cloud")).isEqualTo("3.0.0");
then(versionsFromBom.versionForProject("spring-cloud-release"))
.isEqualTo("3.0.0");
then(versionsFromBom.versionForProject("spring-cloud-starter"))
.isEqualTo("3.0.0");
then(versionsFromBom.versionForProject("spring-cloud-dependencies"))
.isEqualTo("3.0.0");
then(versionsFromBom.versionForProject("spring-cloud-release")).isEqualTo("3.0.0");
then(versionsFromBom.versionForProject("spring-cloud-starter")).isEqualTo("3.0.0");
then(versionsFromBom.versionForProject("spring-cloud-dependencies")).isEqualTo("3.0.0");
versionsFromBom = mixedVersions().setVersion("spring-cloud-release",
"Greenwich.SR8");
versionsFromBom = mixedVersions().setVersion("spring-cloud-release", "Greenwich.SR8");
then(versionsFromBom.versionForProject("spring-cloud"))
.isEqualTo("Greenwich.SR8");
then(versionsFromBom.versionForProject("spring-cloud-release"))
.isEqualTo("Greenwich.SR8");
then(versionsFromBom.versionForProject("spring-cloud-starter"))
.isEqualTo("Greenwich.SR8");
then(versionsFromBom.versionForProject("spring-cloud-dependencies"))
.isEqualTo("Greenwich.SR8");
then(versionsFromBom.versionForProject("spring-cloud")).isEqualTo("Greenwich.SR8");
then(versionsFromBom.versionForProject("spring-cloud-release")).isEqualTo("Greenwich.SR8");
then(versionsFromBom.versionForProject("spring-cloud-starter")).isEqualTo("Greenwich.SR8");
then(versionsFromBom.versionForProject("spring-cloud-dependencies")).isEqualTo("Greenwich.SR8");
versionsFromBom = mixedVersions().setVersion("spring-cloud-dependencies",
"Greenwich.SR8");
versionsFromBom = mixedVersions().setVersion("spring-cloud-dependencies", "Greenwich.SR8");
then(versionsFromBom.versionForProject("spring-cloud"))
.isEqualTo("Greenwich.SR8");
then(versionsFromBom.versionForProject("spring-cloud-release"))
.isEqualTo("Greenwich.SR8");
then(versionsFromBom.versionForProject("spring-cloud-starter"))
.isEqualTo("Greenwich.SR8");
then(versionsFromBom.versionForProject("spring-cloud-dependencies"))
.isEqualTo("Greenwich.SR8");
then(versionsFromBom.versionForProject("spring-cloud")).isEqualTo("Greenwich.SR8");
then(versionsFromBom.versionForProject("spring-cloud-release")).isEqualTo("Greenwich.SR8");
then(versionsFromBom.versionForProject("spring-cloud-starter")).isEqualTo("Greenwich.SR8");
then(versionsFromBom.versionForProject("spring-cloud-dependencies")).isEqualTo("Greenwich.SR8");
}
@Test
public void should_update_projects_for_custom_bom_only() {
VersionsFromBom versionsFromBom = mixedVersions(customBom())
.setVersion("spring-cloud", "3.0.0");
VersionsFromBom versionsFromBom = mixedVersions(customBom()).setVersion("spring-cloud", "3.0.0");
then(versionsFromBom.versionForProject("spring-cloud")).isEqualTo("3.0.0");
then(versionsFromBom.versionForProject("spring-cloud-stream-starters"))
.isEqualTo("Fishtown.RELEASE");
then(versionsFromBom.versionForProject("spring-cloud-stream-starters")).isEqualTo("Fishtown.RELEASE");
then(versionsFromBom.versionForProject("spring-cloud-starter")).isEmpty();
then(versionsFromBom.versionForProject("spring-cloud-dependencies"))
.isEqualTo("Greenwich.RELEASE");
then(versionsFromBom.versionForProject("spring-cloud-dependencies")).isEqualTo("Greenwich.RELEASE");
versionsFromBom = mixedVersions(customBom())
.setVersion("spring-cloud-stream-starters", "Fishtown.SR4");
versionsFromBom = mixedVersions(customBom()).setVersion("spring-cloud-stream-starters", "Fishtown.SR4");
then(versionsFromBom.versionForProject("spring-cloud")).isEmpty();
then(versionsFromBom.versionForProject("spring-cloud-stream-starters"))
.isEqualTo("Fishtown.SR4");
then(versionsFromBom.versionForProject("spring-cloud-stream-starters")).isEqualTo("Fishtown.SR4");
then(versionsFromBom.versionForProject("spring-cloud-starter")).isEmpty();
then(versionsFromBom.versionForProject("spring-cloud-dependencies"))
.isEqualTo("Greenwich.RELEASE");
then(versionsFromBom.versionForProject("spring-cloud-dependencies")).isEqualTo("Greenwich.RELEASE");
versionsFromBom = mixedVersions(customBom()).setVersion("spring-cloud-release",
"Greenwich.SR8");
versionsFromBom = mixedVersions(customBom()).setVersion("spring-cloud-release", "Greenwich.SR8");
then(versionsFromBom.versionForProject("spring-cloud-release"))
.isEqualTo("Greenwich.SR8");
then(versionsFromBom.versionForProject("spring-cloud-stream-starters"))
.isEqualTo("Fishtown.RELEASE");
then(versionsFromBom.versionForProject("spring-cloud-release")).isEqualTo("Greenwich.SR8");
then(versionsFromBom.versionForProject("spring-cloud-stream-starters")).isEqualTo("Fishtown.RELEASE");
then(versionsFromBom.versionForProject("spring-cloud")).isEmpty();
then(versionsFromBom.versionForProject("spring-cloud-starter")).isEmpty();
then(versionsFromBom.versionForProject("spring-cloud-dependencies"))
.isEqualTo("Greenwich.RELEASE");
then(versionsFromBom.versionForProject("spring-cloud-dependencies")).isEqualTo("Greenwich.RELEASE");
versionsFromBom = mixedVersions(customBom())
.setVersion("spring-cloud-dependencies", "Greenwich.SR8");
versionsFromBom = mixedVersions(customBom()).setVersion("spring-cloud-dependencies", "Greenwich.SR8");
then(versionsFromBom.versionForProject("spring-cloud")).isEmpty();
then(versionsFromBom.versionForProject("spring-cloud-stream-starters"))
.isEqualTo("Fishtown.RELEASE");
then(versionsFromBom.versionForProject("spring-cloud-stream-starters")).isEqualTo("Fishtown.RELEASE");
then(versionsFromBom.versionForProject("spring-cloud-starter")).isEmpty();
then(versionsFromBom.versionForProject("spring-cloud-dependencies"))
.isEqualTo("Greenwich.SR8");
then(versionsFromBom.versionForProject("spring-cloud-dependencies")).isEqualTo("Greenwich.SR8");
}
@Test
@@ -178,22 +147,18 @@ public class VersionsFromBomTests {
}
private VersionsFromBom mixedVersions() {
return new VersionsFromBomBuilder()
.releaserProperties(SpringCloudReleaserProperties.get())
return new VersionsFromBomBuilder().releaserProperties(SpringCloudReleaserProperties.get())
.parsers(Collections.emptyList()).projects(mixedProjects()).merged();
}
private VersionsFromBom mixedVersions(ReleaserProperties properties) {
return new VersionsFromBomBuilder().releaserProperties(properties)
.projects(mixedProjects()).retrieveFromBom();
return new VersionsFromBomBuilder().releaserProperties(properties).projects(mixedProjects()).retrieveFromBom();
}
private ReleaserProperties customBom() {
ReleaserProperties properties = SpringCloudReleaserProperties.get();
properties.getMetaRelease()
.setReleaseTrainDependencyNames(Collections.emptyList());
properties.getMetaRelease()
.setReleaseTrainProjectName("spring-cloud-stream-starters");
properties.getMetaRelease().setReleaseTrainDependencyNames(Collections.emptyList());
properties.getMetaRelease().setReleaseTrainProjectName("spring-cloud-stream-starters");
properties.getPom().setThisTrainBom("spring-cloud-stream-dependencies");
return properties;
}

View File

@@ -20,7 +20,7 @@ import java.io.File;
import java.net.URISyntaxException;
import org.assertj.core.api.BDDAssertions;
import org.junit.Test;
import org.junit.jupiter.api.Test;
/**
* @author Marcin Grzejszczak
@@ -28,17 +28,14 @@ import org.junit.Test;
public class ReleaseTrainContentsParserTests {
File finchley = new File(ReleaseTrainContentsParserTests.class
.getResource(
"/projects/spring-cloud-wiki/Spring-Cloud-Finchley-Release-Notes.md")
.toURI());
.getResource("/projects/spring-cloud-wiki/Spring-Cloud-Finchley-Release-Notes.md").toURI());
public ReleaseTrainContentsParserTests() throws URISyntaxException {
}
@Test
public void should_retrieve_latest_release_version_name() {
String releaseTrain = new ReleaseTrainContentsParser()
.latestReleaseTrainFromWiki(this.finchley);
String releaseTrain = new ReleaseTrainContentsParser().latestReleaseTrainFromWiki(this.finchley);
BDDAssertions.then(releaseTrain).isEqualTo("Finchley.SR2");
}

View File

@@ -24,10 +24,9 @@ import java.util.Collections;
import org.assertj.core.api.BDDAssertions;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import releaser.SpringCloudReleaserProperties;
import releaser.internal.ReleaserProperties;
import releaser.internal.buildsystem.TestUtils;
@@ -45,13 +44,12 @@ import org.springframework.util.FileSystemUtils;
*/
public class ReleaseTrainContentsUpdaterTests {
@Rule
public TemporaryFolder tmp = new TemporaryFolder();
@TempDir
public File tmp;
ReleaserProperties properties = SpringCloudReleaserProperties.get();
ProjectGitHubHandler projectGitHubHandler = new ProjectGitHubHandler(this.properties,
Collections.emptyList()) {
ProjectGitHubHandler projectGitHubHandler = new ProjectGitHubHandler(this.properties, Collections.emptyList()) {
@Override
public String milestoneUrl(ProjectVersion releaseVersion) {
return "http://www.foo.com/";
@@ -60,11 +58,10 @@ public class ReleaseTrainContentsUpdaterTests {
ProjectGitHandler projectGitHandler = new ProjectGitHandler(this.properties);
TemplateGenerator templateGenerator = new TemplateGenerator(this.properties,
this.projectGitHubHandler);
TemplateGenerator templateGenerator = new TemplateGenerator(this.properties, this.projectGitHubHandler);
ReleaseTrainContentsUpdater updater = new ReleaseTrainContentsUpdater(this.properties,
this.projectGitHandler, this.templateGenerator);
ReleaseTrainContentsUpdater updater = new ReleaseTrainContentsUpdater(this.properties, this.projectGitHandler,
this.templateGenerator);
File springCloudRepo;
@@ -72,9 +69,9 @@ public class ReleaseTrainContentsUpdaterTests {
File temporaryFolder;
@Before
@BeforeEach
public void setup() throws Exception {
this.temporaryFolder = this.tmp.newFolder();
this.temporaryFolder = new File(tmp, "test");
TestUtils.prepareLocalRepo();
FileSystemUtils.copyRecursively(file("/projects"), this.temporaryFolder);
this.springCloudRepo = new File(this.temporaryFolder, "spring-cloud/");
@@ -82,8 +79,7 @@ public class ReleaseTrainContentsUpdaterTests {
}
private File file(String relativePath) throws URISyntaxException {
return new File(
ReleaseTrainContentsUpdaterTests.class.getResource(relativePath).toURI());
return new File(ReleaseTrainContentsUpdaterTests.class.getResource(relativePath).toURI());
}
@Test
@@ -110,58 +106,44 @@ public class ReleaseTrainContentsUpdaterTests {
throws GitAPIException, IOException {
this.properties.getMetaRelease().setEnabled(true);
this.properties.getGit().setUpdateReleaseTrainWiki(true);
this.properties.getGit()
.setReleaseTrainWikiUrl(this.wikiRepo.getAbsolutePath() + "/");
this.properties.getGit().setReleaseTrainWikiUrl(this.wikiRepo.getAbsolutePath() + "/");
File file = this.updater.updateReleaseTrainWiki(oldReleaseTrain());
BDDAssertions.then(file).isNotNull();
BDDAssertions.then(edgwareWikiEntryContent(file)).doesNotContain("# Edgware.SR7")
.doesNotContain(
"Spring Cloud Consul `2.0.1.RELEASE` ([issues](http://www.foo.com/))");
BDDAssertions
.then(GitTestUtils.openGitProject(file).log().call().iterator().next()
.getShortMessage())
.doesNotContain("Spring Cloud Consul `2.0.1.RELEASE` ([issues](http://www.foo.com/))");
BDDAssertions.then(GitTestUtils.openGitProject(file).log().call().iterator().next().getShortMessage())
.doesNotContain("Updating project page to release train");
}
@Test
public void should_update_the_contents_of_wiki_when_release_train_greater()
throws GitAPIException, IOException {
public void should_update_the_contents_of_wiki_when_release_train_greater() throws GitAPIException, IOException {
this.properties.getMetaRelease().setEnabled(true);
this.properties.getGit().setUpdateReleaseTrainWiki(true);
this.properties.getGit()
.setReleaseTrainWikiUrl(this.wikiRepo.getAbsolutePath() + "/");
this.properties.getGit().setReleaseTrainWikiUrl(this.wikiRepo.getAbsolutePath() + "/");
File file = this.updater.updateReleaseTrainWiki(newReleaseTrain());
BDDAssertions.then(file).isNotNull();
BDDAssertions.then(edgwareWikiEntryContent(file)).contains("# Edgware.SR7")
.contains(
"Spring Cloud Consul `2.0.1.RELEASE` ([issues](http://www.foo.com/))");
BDDAssertions
.then(GitTestUtils.openGitProject(file).log().call().iterator().next()
.getShortMessage())
.contains("Spring Cloud Consul `2.0.1.RELEASE` ([issues](http://www.foo.com/))");
BDDAssertions.then(GitTestUtils.openGitProject(file).log().call().iterator().next().getShortMessage())
.contains("Updating project page to release train [Edgware.SR7]");
}
@Test
public void should_generate_the_contents_of_wiki_when_release_train_missing()
throws GitAPIException, IOException {
public void should_generate_the_contents_of_wiki_when_release_train_missing() throws GitAPIException, IOException {
this.properties.getMetaRelease().setEnabled(true);
this.properties.getGit().setUpdateReleaseTrainWiki(true);
this.properties.getGit()
.setReleaseTrainWikiUrl(this.wikiRepo.getAbsolutePath() + "/");
this.properties.getGit().setReleaseTrainWikiUrl(this.wikiRepo.getAbsolutePath() + "/");
File file = this.updater.updateReleaseTrainWiki(freshNewReleaseTrain());
BDDAssertions.then(file).isNotNull();
BDDAssertions.then(greenwichWikiEntryContent(file))
.contains("# Greenwich.RELEASE").contains(
"Spring Cloud Consul `2.0.1.RELEASE` ([issues](http://www.foo.com/))");
BDDAssertions
.then(GitTestUtils.openGitProject(file).log().call().iterator().next()
.getShortMessage())
BDDAssertions.then(greenwichWikiEntryContent(file)).contains("# Greenwich.RELEASE")
.contains("Spring Cloud Consul `2.0.1.RELEASE` ([issues](http://www.foo.com/))");
BDDAssertions.then(GitTestUtils.openGitProject(file).log().call().iterator().next().getShortMessage())
.contains("Updating project page to release train [Greenwich.RELEASE]");
}
@@ -170,17 +152,14 @@ public class ReleaseTrainContentsUpdaterTests {
throws GitAPIException, IOException {
this.properties.getMetaRelease().setEnabled(true);
this.properties.getGit().setUpdateReleaseTrainWiki(true);
this.properties.getGit()
.setReleaseTrainWikiUrl(this.wikiRepo.getAbsolutePath() + "/");
this.properties.getGit().setReleaseTrainWikiUrl(this.wikiRepo.getAbsolutePath() + "/");
File file = this.updater.updateReleaseTrainWiki(freshNewReleaseTrainCalver());
BDDAssertions.then(file).isNotNull();
BDDAssertions.then(calverWikiEntryContent(file)).contains("# 2020.0.5").contains(
"Spring Cloud Consul `2.0.1.RELEASE` ([issues](http://www.foo.com/))");
BDDAssertions
.then(GitTestUtils.openGitProject(file).log().call().iterator().next()
.getShortMessage())
BDDAssertions.then(calverWikiEntryContent(file)).contains("# 2020.0.5")
.contains("Spring Cloud Consul `2.0.1.RELEASE` ([issues](http://www.foo.com/))");
BDDAssertions.then(GitTestUtils.openGitProject(file).log().call().iterator().next().getShortMessage())
.contains("Updating project page to release train [2020.0.5]");
}

View File

@@ -19,7 +19,7 @@ package releaser.internal.docs;
import java.util.List;
import org.assertj.core.api.BDDAssertions;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import releaser.internal.project.ProjectVersion;
import releaser.internal.project.Projects;
@@ -30,8 +30,7 @@ public class RowTests {
@Test
public void should_convert_projects_to_rows_for_last_ga() {
Projects projects = new Projects(
new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"),
Projects projects = new Projects(new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"),
new ProjectVersion("sc-release", "2.0.1.RELEASE"));
List<Row> rows = Row.fromProjects(projects, true);
@@ -50,8 +49,7 @@ public class RowTests {
@Test
public void should_convert_projects_to_rows_for_current_ga() {
Projects projects = new Projects(
new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"),
Projects projects = new Projects(new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"),
new ProjectVersion("sc-release", "2.0.1.RELEASE"));
List<Row> rows = Row.fromProjects(projects, false);

View File

@@ -20,85 +20,61 @@ import java.io.File;
import java.net.URISyntaxException;
import org.assertj.core.api.BDDAssertions;
import org.junit.Rule;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.test.rule.OutputCapture;
import org.springframework.boot.test.system.CapturedOutput;
import org.springframework.boot.test.system.OutputCaptureExtension;
/**
* @author Marcin Grzejszczak
*/
@ExtendWith(OutputCaptureExtension.class)
public class SpringCloudGhPagesParserTests {
@Rule
public OutputCapture capture = new OutputCapture();
File rawHtml = new File(
SpringCloudGhPagesParserTests.class.getResource("/raw/spring-cloud-gh-pages-index.html").toURI());
File rawHtml = new File(SpringCloudGhPagesParserTests.class
.getResource("/raw/spring-cloud-gh-pages-index.html").toURI());
File wrongHtml = new File(SpringCloudGhPagesParserTests.class
.getResource("/raw/some-file.html").toURI());
File wrongHtml = new File(SpringCloudGhPagesParserTests.class.getResource("/raw/some-file.html").toURI());
public SpringCloudGhPagesParserTests() throws URISyntaxException {
}
@Test
public void should_parse_the_components_table() {
ReleaseTrainContents contents = new ReleaseTrainContentsParser()
.parseProjectPage(this.rawHtml);
ReleaseTrainContents contents = new ReleaseTrainContentsParser().parseProjectPage(this.rawHtml);
BDDAssertions.then(contents).isNotNull();
BDDAssertions.then(contents.title).isEqualTo(
new Title("Edgware.SR5", "Finchley.SR1", "Finchley.BUILD-SNAPSHOT"));
BDDAssertions.then(contents.title)
.isEqualTo(new Title("Edgware.SR5", "Finchley.SR1", "Finchley.BUILD-SNAPSHOT"));
BDDAssertions.then(contents.rows).contains(
new Row("spring-cloud-aws", "1.2.3.RELEASE", "2.0.0.RELEASE",
"2.0.1.BUILD-SNAPSHOT"),
new Row("spring-cloud-bus", "1.3.3.RELEASE", "2.0.0.RELEASE",
"2.0.1.BUILD-SNAPSHOT"),
new Row("spring-cloud-cli", "1.4.1.RELEASE", "2.0.0.RELEASE",
"2.0.1.BUILD-SNAPSHOT"),
new Row("spring-cloud-commons", "1.3.5.RELEASE", "2.0.1.RELEASE",
"2.0.2.BUILD-SNAPSHOT"),
new Row("spring-cloud-contract", "1.2.6.RELEASE", "2.0.1.RELEASE",
"2.0.2.BUILD-SNAPSHOT"),
new Row("spring-cloud-config", "1.4.5.RELEASE", "2.0.1.RELEASE",
"2.0.2.BUILD-SNAPSHOT"),
new Row("spring-cloud-netflix", "1.4.6.RELEASE", "2.0.1.RELEASE",
"2.0.2.BUILD-SNAPSHOT"),
new Row("spring-cloud-security", "1.2.3.RELEASE", "2.0.0.RELEASE",
"2.0.1.BUILD-SNAPSHOT"),
new Row("spring-cloud-cloudfoundry", "1.1.2.RELEASE", "2.0.0.RELEASE",
"2.0.1.BUILD-SNAPSHOT"),
new Row("spring-cloud-consul", "1.3.5.RELEASE", "2.0.1.RELEASE",
"2.0.2.BUILD-SNAPSHOT"),
new Row("spring-cloud-sleuth", "1.3.5.RELEASE", "2.0.1.RELEASE",
"2.0.2.BUILD-SNAPSHOT"),
new Row("spring-cloud-stream", "Ditmars.SR4", "Elmhurst.SR1",
"Elmhurst.BUILD-SNAPSHOT"),
new Row("spring-cloud-zookeeper", "1.2.2.RELEASE", "2.0.0.RELEASE",
"2.0.1.BUILD-SNAPSHOT"),
new Row("spring-boot", "1.5.16.RELEASE", "2.0.4.RELEASE",
"2.0.4.BUILD-SNAPSHOT"),
new Row("spring-cloud-task", "1.2.3.RELEASE", "2.0.0.RELEASE",
"2.0.1.BUILD-SNAPSHOT"),
new Row("spring-cloud-vault", "1.1.2.RELEASE", "2.0.1.RELEASE",
"2.0.2.BUILD-SNAPSHOT"),
new Row("spring-cloud-gateway", "1.0.2.RELEASE", "2.0.1.RELEASE",
"2.0.2.BUILD-SNAPSHOT"),
new Row("spring-cloud-openfeign", "", "2.0.1.RELEASE",
"2.0.2.BUILD-SNAPSHOT"),
new Row("spring-cloud-function", "1.0.1.RELEASE", "1.0.0.RELEASE",
"1.0.1.BUILD-SNAPSHOT"));
new Row("spring-cloud-aws", "1.2.3.RELEASE", "2.0.0.RELEASE", "2.0.1.BUILD-SNAPSHOT"),
new Row("spring-cloud-bus", "1.3.3.RELEASE", "2.0.0.RELEASE", "2.0.1.BUILD-SNAPSHOT"),
new Row("spring-cloud-cli", "1.4.1.RELEASE", "2.0.0.RELEASE", "2.0.1.BUILD-SNAPSHOT"),
new Row("spring-cloud-commons", "1.3.5.RELEASE", "2.0.1.RELEASE", "2.0.2.BUILD-SNAPSHOT"),
new Row("spring-cloud-contract", "1.2.6.RELEASE", "2.0.1.RELEASE", "2.0.2.BUILD-SNAPSHOT"),
new Row("spring-cloud-config", "1.4.5.RELEASE", "2.0.1.RELEASE", "2.0.2.BUILD-SNAPSHOT"),
new Row("spring-cloud-netflix", "1.4.6.RELEASE", "2.0.1.RELEASE", "2.0.2.BUILD-SNAPSHOT"),
new Row("spring-cloud-security", "1.2.3.RELEASE", "2.0.0.RELEASE", "2.0.1.BUILD-SNAPSHOT"),
new Row("spring-cloud-cloudfoundry", "1.1.2.RELEASE", "2.0.0.RELEASE", "2.0.1.BUILD-SNAPSHOT"),
new Row("spring-cloud-consul", "1.3.5.RELEASE", "2.0.1.RELEASE", "2.0.2.BUILD-SNAPSHOT"),
new Row("spring-cloud-sleuth", "1.3.5.RELEASE", "2.0.1.RELEASE", "2.0.2.BUILD-SNAPSHOT"),
new Row("spring-cloud-stream", "Ditmars.SR4", "Elmhurst.SR1", "Elmhurst.BUILD-SNAPSHOT"),
new Row("spring-cloud-zookeeper", "1.2.2.RELEASE", "2.0.0.RELEASE", "2.0.1.BUILD-SNAPSHOT"),
new Row("spring-boot", "1.5.16.RELEASE", "2.0.4.RELEASE", "2.0.4.BUILD-SNAPSHOT"),
new Row("spring-cloud-task", "1.2.3.RELEASE", "2.0.0.RELEASE", "2.0.1.BUILD-SNAPSHOT"),
new Row("spring-cloud-vault", "1.1.2.RELEASE", "2.0.1.RELEASE", "2.0.2.BUILD-SNAPSHOT"),
new Row("spring-cloud-gateway", "1.0.2.RELEASE", "2.0.1.RELEASE", "2.0.2.BUILD-SNAPSHOT"),
new Row("spring-cloud-openfeign", "", "2.0.1.RELEASE", "2.0.2.BUILD-SNAPSHOT"),
new Row("spring-cloud-function", "1.0.1.RELEASE", "1.0.0.RELEASE", "1.0.1.BUILD-SNAPSHOT"));
}
@Test
public void should_not_parse_the_components_table_when_markers_are_not_found() {
ReleaseTrainContents contents = new ReleaseTrainContentsParser()
.parseProjectPage(this.wrongHtml);
public void should_not_parse_the_components_table_when_markers_are_not_found(CapturedOutput capture) {
ReleaseTrainContents contents = new ReleaseTrainContentsParser().parseProjectPage(this.wrongHtml);
BDDAssertions.then(contents).isNull();
BDDAssertions.then(this.capture.toString())
.contains("The page is missing the components table markers");
BDDAssertions.then(capture.toString()).contains("The page is missing the components table markers");
}
}

View File

@@ -31,10 +31,9 @@ import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.transport.URIish;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import releaser.internal.buildsystem.TestUtils;
import static org.assertj.core.api.Assertions.fail;
@@ -46,8 +45,8 @@ import static org.assertj.core.api.BDDAssertions.thenThrownBy;
*/
public class GitRepoTests {
@Rule
public TemporaryFolder tmp = new TemporaryFolder();
@TempDir
public File tmp;
File springCloudReleaseProject;
@@ -55,9 +54,9 @@ public class GitRepoTests {
GitRepo gitRepo;
@Before
@BeforeEach
public void setup() throws IOException, URISyntaxException {
this.tmpFolder = this.tmp.newFolder();
this.tmpFolder = new File(tmp, "test");
this.springCloudReleaseProject = new File(
GitRepoTests.class.getResource("/projects/spring-cloud-release").toURI());
TestUtils.prepareLocalRepo();
@@ -74,8 +73,8 @@ public class GitRepoTests {
@Test
public void should_throw_exception_when_there_is_no_repo() {
thenThrownBy(() -> this.gitRepo.cloneProject(
new URIish(GitRepoTests.class.getResource("/projects/").toURI().toURL())))
thenThrownBy(() -> this.gitRepo
.cloneProject(new URIish(GitRepoTests.class.getResource("/projects/").toURI().toURL())))
.isInstanceOf(IllegalStateException.class)
.hasMessageContaining("Exception occurred while cloning repo");
}
@@ -97,8 +96,7 @@ public class GitRepoTests {
File pom = new File(new File(this.tmpFolder, uri.getHumanishName()), "pom.xml");
then(pom).exists();
then(Files.lines(pom.toPath())
.anyMatch(s -> s.contains("<version>Camden.SR3</version>"))).isTrue();
then(Files.lines(pom.toPath()).anyMatch(s -> s.contains("<version>Camden.SR3</version>"))).isTrue();
}
@Test
@@ -109,9 +107,7 @@ public class GitRepoTests {
File pom = new File(new File(this.tmpFolder, uri.getHumanishName()), "pom.xml");
then(pom).exists();
then(Files.lines(pom.toPath())
.anyMatch(s -> s.contains("<version>Camden.BUILD-SNAPSHOT</version>")))
.isTrue();
then(Files.lines(pom.toPath()).anyMatch(s -> s.contains("<version>Camden.BUILD-SNAPSHOT</version>"))).isTrue();
}
@Test
@@ -131,8 +127,7 @@ public class GitRepoTests {
}
@Test
public void should_throw_an_exception_when_checking_out_nonexisting_branch()
throws IOException {
public void should_throw_an_exception_when_checking_out_nonexisting_branch() throws IOException {
File project = new GitRepo(this.tmpFolder)
.cloneProject(new URIish(this.springCloudReleaseProject.toURI().toURL()));
try {
@@ -190,14 +185,12 @@ public class GitRepoTests {
private void tagIsPresent(Git git, String tag) throws GitAPIException {
List<Ref> refs = git.tagList().call();
System.out.println("All tags" + refs);
then(refs.stream().anyMatch(ref -> ref.getName().startsWith("refs/tags/" + tag)))
.isTrue();
then(refs.stream().anyMatch(ref -> ref.getName().startsWith("refs/tags/" + tag))).isTrue();
}
@Test
public void should_push_changes_to_master_branch() throws Exception {
File origin = GitTestUtils.clonedProject(this.tmp.newFolder(),
this.springCloudReleaseProject);
File origin = GitTestUtils.clonedProject(new File(tmp, "test1"), this.springCloudReleaseProject);
File project = new GitRepo(this.tmpFolder)
.cloneProject(new URIish(this.springCloudReleaseProject.toURI().toURL()));
GitTestUtils.setOriginOnProjectToTmp(origin, project);
@@ -214,8 +207,7 @@ public class GitRepoTests {
@Test
public void should_push_changes_to_current_branch() throws Exception {
File origin = GitTestUtils.clonedProject(this.tmp.newFolder(),
this.springCloudReleaseProject);
File origin = GitTestUtils.clonedProject(new File(tmp, "test2"), this.springCloudReleaseProject);
File project = new GitRepo(this.tmpFolder)
.cloneProject(new URIish(this.springCloudReleaseProject.toURI().toURL()));
GitTestUtils.setOriginOnProjectToTmp(origin, project);
@@ -232,8 +224,7 @@ public class GitRepoTests {
@Test
public void should_return_the_branch_name() throws Exception {
File origin = GitTestUtils.clonedProject(this.tmp.newFolder(),
this.springCloudReleaseProject);
File origin = GitTestUtils.clonedProject(new File(tmp, "test3"), this.springCloudReleaseProject);
File project = new GitRepo(this.tmpFolder)
.cloneProject(new URIish(this.springCloudReleaseProject.toURI().toURL()));
GitTestUtils.setOriginOnProjectToTmp(origin, project);
@@ -246,8 +237,7 @@ public class GitRepoTests {
@Test
public void should_push_a_tag_to_new_branch_in_origin() throws Exception {
File origin = GitTestUtils.clonedProject(this.tmp.newFolder(),
this.springCloudReleaseProject);
File origin = GitTestUtils.clonedProject(new File(tmp, "test4"), this.springCloudReleaseProject);
File project = new GitRepo(this.tmpFolder)
.cloneProject(new URIish(this.springCloudReleaseProject.toURI().toURL()));
GitTestUtils.setOriginOnProjectToTmp(origin, project);
@@ -297,8 +287,7 @@ public class GitRepoTests {
}
@Test
public void should_not_revert_changes_when_commit_message_is_not_related_to_updating_snapshots()
throws Exception {
public void should_not_revert_changes_when_commit_message_is_not_related_to_updating_snapshots() throws Exception {
File project = new GitRepo(this.tmpFolder)
.cloneProject(new URIish(this.springCloudReleaseProject.toURI().toURL()));

View File

@@ -53,8 +53,7 @@ public final class GitTestUtils {
return new GitRepo.JGitFactory().open(project);
}
public static File clonedProject(File baseDir, File projectToClone)
throws IOException {
public static File clonedProject(File baseDir, File projectToClone) throws IOException {
GitRepo projectRepo = new GitRepo(baseDir);
return projectRepo.cloneProject(new URIish(projectToClone.toURI().toURL()));
}

View File

@@ -19,10 +19,10 @@ package releaser.internal.git;
import java.io.File;
import org.assertj.core.api.BDDAssertions;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.junit.jupiter.MockitoExtension;
import releaser.SpringCloudReleaserProperties;
import releaser.internal.ReleaserProperties;
import releaser.internal.project.ProjectVersion;
@@ -36,7 +36,7 @@ import static org.mockito.Mockito.never;
/**
* @author Marcin Grzejszczak
*/
@RunWith(MockitoJUnitRunner.class)
@ExtendWith(MockitoExtension.class)
public class ProjectGitHandlerTests {
@Mock
@@ -60,8 +60,7 @@ public class ProjectGitHandlerTests {
@Test
public void should_only_commit_without_pushing_changes_when_version_is_snapshot() {
this.updater.commitAndTagIfApplicable(this.file,
projectVersion("1.0.0.BUILD-SNAPSHOT"));
this.updater.commitAndTagIfApplicable(this.file, projectVersion("1.0.0.BUILD-SNAPSHOT"));
then(this.gitRepo).should().commit(eq("Bumping versions"));
then(this.gitRepo).should(never()).tag(anyString());
@@ -78,19 +77,16 @@ public class ProjectGitHandlerTests {
@Test
public void should_commit_when_snapshot_version_is_present_with_post_release_msg() {
ProjectVersion bumped = new ProjectVersion("name",
projectVersion("1.0.0.BUILD-SNAPSHOT").bumpedVersion());
ProjectVersion bumped = new ProjectVersion("name", projectVersion("1.0.0.BUILD-SNAPSHOT").bumpedVersion());
this.updater.commitAfterBumpingVersions(this.file, bumped);
then(this.gitRepo).should()
.commit(eq("Bumping versions to 1.0.1.BUILD-SNAPSHOT after release"));
then(this.gitRepo).should().commit(eq("Bumping versions to 1.0.1.BUILD-SNAPSHOT after release"));
then(this.gitRepo).should(never()).tag(anyString());
}
@Test
public void should_not_commit_when_non_snapshot_version_is_present() {
this.updater.commitAfterBumpingVersions(this.file,
projectVersion("1.0.0.RELEASE"));
this.updater.commitAfterBumpingVersions(this.file, projectVersion("1.0.0.RELEASE"));
then(this.gitRepo).should(never()).commit(eq("Bumping versions after release"));
then(this.gitRepo).should(never()).tag(anyString());
@@ -98,16 +94,14 @@ public class ProjectGitHandlerTests {
@Test
public void should_not_revert_changes_for_snapshots() {
this.updater.revertChangesIfApplicable(this.file,
projectVersion("1.0.0.BUILD-SNAPSHOT"));
this.updater.revertChangesIfApplicable(this.file, projectVersion("1.0.0.BUILD-SNAPSHOT"));
then(this.gitRepo).should(never()).revert(anyString());
}
@Test
public void should_revert_changes_when_version_is_not_snapshot() {
this.updater.revertChangesIfApplicable(this.file,
projectVersion("1.0.0.RELEASE"));
this.updater.revertChangesIfApplicable(this.file, projectVersion("1.0.0.RELEASE"));
then(this.gitRepo).should().revert(eq("Going back to snapshots"));
}
@@ -128,11 +122,8 @@ public class ProjectGitHandlerTests {
@Test
public void should_throw_exception_when_no_fixed_version_passed_for_the_project() {
BDDAssertions
.thenThrownBy(
() -> this.updater.cloneProjectFromOrg("spring-cloud-sleuth"))
.isInstanceOf(IllegalStateException.class)
.hasMessageContaining("You haven't provided a version");
BDDAssertions.thenThrownBy(() -> this.updater.cloneProjectFromOrg("spring-cloud-sleuth"))
.isInstanceOf(IllegalStateException.class).hasMessageContaining("You haven't provided a version");
}
@Test
@@ -181,8 +172,7 @@ public class ProjectGitHandlerTests {
@Test
public void should_check_out_a_branch_if_it_exists_when_cloning_from_org_and_its_a_release_train_version_with_at_least_one_dash() {
this.properties.getFixedVersions().put("spring-cloud-release",
"Finchley-BUILD-SNAPSHOT");
this.properties.getFixedVersions().put("spring-cloud-release", "Finchley-BUILD-SNAPSHOT");
given(this.gitRepo.hasBranch(anyString())).willReturn(false);
given(this.gitRepo.hasBranch("Finchley")).willReturn(true);
@@ -209,8 +199,7 @@ public class ProjectGitHandlerTests {
given(this.gitRepo.hasBranch(anyString())).willReturn(true);
given(this.gitRepo.hasBranch("2.3.x")).willReturn(false);
this.updater.cloneAndGuessBranch(new File(".").getAbsolutePath(),
"2.3.4.RELEASE");
this.updater.cloneAndGuessBranch(new File(".").getAbsolutePath(), "2.3.4.RELEASE");
then(this.gitRepo).should(never()).checkout("2.3.x");
}
@@ -220,8 +209,7 @@ public class ProjectGitHandlerTests {
given(this.gitRepo.hasBranch(anyString())).willReturn(false);
given(this.gitRepo.hasBranch("2.3.x")).willReturn(true);
this.updater.cloneAndGuessBranch(new File(".").getAbsolutePath(),
"2.3.4.RELEASE");
this.updater.cloneAndGuessBranch(new File(".").getAbsolutePath(), "2.3.4.RELEASE");
then(this.gitRepo).should().checkout("2.3.x");
}
@@ -241,8 +229,7 @@ public class ProjectGitHandlerTests {
given(this.gitRepo.hasBranch(anyString())).willReturn(false);
given(this.gitRepo.hasBranch("Finchley")).willReturn(true);
this.updater.cloneAndGuessBranch(new File(".").getAbsolutePath(), "2.0.0.RELEASE",
"Finchley.SR6");
this.updater.cloneAndGuessBranch(new File(".").getAbsolutePath(), "2.0.0.RELEASE", "Finchley.SR6");
then(this.gitRepo).should(never()).checkout("2.0.0");
then(this.gitRepo).should().checkout("Finchley");

View File

@@ -16,6 +16,7 @@
package releaser.internal.github;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
@@ -23,32 +24,30 @@ import com.jcabi.github.Github;
import com.jcabi.github.Repo;
import com.jcabi.github.Repos;
import com.jcabi.github.mock.MkGithub;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.io.TempDir;
import org.mockito.BDDMockito;
import releaser.internal.project.ProjectVersion;
import releaser.internal.project.Projects;
import org.springframework.boot.test.rule.OutputCapture;
import org.springframework.boot.test.system.OutputCaptureExtension;
/**
* @author Marcin Grzejszczak
*/
@ExtendWith(OutputCaptureExtension.class)
public class GithubIssuesTests {
@Rule
public TemporaryFolder folder = new TemporaryFolder();
@Rule
public OutputCapture capture = new OutputCapture();
@TempDir
public File folder;
MkGithub github;
Repo repo;
@Before
@BeforeEach
public void setup() throws IOException {
this.github = github("spring-guides");
this.repo = createGettingStartedGuides(this.github);
@@ -73,7 +72,7 @@ public class GithubIssuesTests {
new ProjectVersion("spring-cloud-build", "2.0.0.BUILD-SNAPSHOT")),
new ProjectVersion("sc-release", "Edgware.BUILD-SNAPSHOT"));
BDDMockito.then(github).shouldHaveZeroInteractions();
BDDMockito.then(github).shouldHaveNoInteractions();
}
@Test
@@ -82,17 +81,15 @@ public class GithubIssuesTests {
GithubIssues issues = new GithubIssues(Collections.emptyList());
issues.fileIssueInSpringGuides(
new Projects(new ProjectVersion("foo", "1.0.0.RELEASE"),
new ProjectVersion("bar", "2.0.0.RELEASE"),
new Projects(new ProjectVersion("foo", "1.0.0.RELEASE"), new ProjectVersion("bar", "2.0.0.RELEASE"),
new ProjectVersion("baz", "3.0.0.RELEASE")),
new ProjectVersion("sc-release", "Edgware.RELEASE"));
BDDMockito.then(github).shouldHaveZeroInteractions();
BDDMockito.then(github).shouldHaveNoInteractions();
}
@Test
public void should_not_do_anything_for_non_release_train_version_when_updating_startspringio()
throws IOException {
public void should_not_do_anything_for_non_release_train_version_when_updating_startspringio() throws IOException {
setupStartSpringIo();
Github github = BDDMockito.mock(Github.class);
GithubIssues issues = new GithubIssues(Collections.emptyList());
@@ -102,28 +99,25 @@ public class GithubIssuesTests {
new ProjectVersion("spring-cloud-build", "2.0.0.RELEASE")),
new ProjectVersion("sc-release", "Edgware.BUILD-SNAPSHOT"));
BDDMockito.then(github).shouldHaveZeroInteractions();
BDDMockito.then(github).shouldHaveNoInteractions();
}
@Test
public void should_not_do_anything_if_not_applicable_when_updating_startspringio()
throws IOException {
public void should_not_do_anything_if_not_applicable_when_updating_startspringio() throws IOException {
setupStartSpringIo();
Github github = BDDMockito.mock(Github.class);
GithubIssues issues = new GithubIssues(Collections.emptyList());
issues.fileIssueInStartSpringIo(
new Projects(new ProjectVersion("foo", "1.0.0.RELEASE"),
new ProjectVersion("bar", "2.0.0.RELEASE"),
new Projects(new ProjectVersion("foo", "1.0.0.RELEASE"), new ProjectVersion("bar", "2.0.0.RELEASE"),
new ProjectVersion("baz", "3.0.0.RELEASE")),
new ProjectVersion("sc-release", "Edgware.RELEASE"));
BDDMockito.then(github).shouldHaveZeroInteractions();
BDDMockito.then(github).shouldHaveNoInteractions();
}
private Repo createGettingStartedGuides(MkGithub github) throws IOException {
return github.repos()
.create(new Repos.RepoCreate("getting-started-guides", false));
return github.repos().create(new Repos.RepoCreate("getting-started-guides", false));
}
private Repo createStartSpringIo(MkGithub github) throws IOException {

View File

@@ -16,6 +16,7 @@
package releaser.internal.github;
import java.io.File;
import java.io.IOException;
import java.net.URL;
@@ -23,14 +24,15 @@ import com.jcabi.github.Milestone;
import com.jcabi.github.Repo;
import com.jcabi.github.Repos;
import com.jcabi.github.mock.MkGithub;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.io.TempDir;
import releaser.internal.ReleaserProperties;
import releaser.internal.project.ProjectVersion;
import org.springframework.boot.test.rule.OutputCapture;
import org.springframework.boot.test.system.CapturedOutput;
import org.springframework.boot.test.system.OutputCaptureExtension;
import static org.assertj.core.api.BDDAssertions.then;
import static org.assertj.core.api.BDDAssertions.thenThrownBy;
@@ -38,26 +40,24 @@ import static org.assertj.core.api.BDDAssertions.thenThrownBy;
/**
* @author Marcin Grzejszczak
*/
@ExtendWith(OutputCaptureExtension.class)
public class GithubMilestonesTests {
@Rule
public TemporaryFolder folder = new TemporaryFolder();
@Rule
public OutputCapture capture = new OutputCapture();
@TempDir
public File folder;
MkGithub github;
Repo repo;
@Before
@BeforeEach
public void setup() throws IOException {
this.github = new MkGithub();
this.repo = createSleuthRepo(this.github);
}
@Test
public void should_close_milestone_if_there_is_one() throws IOException {
public void should_close_milestone_if_there_is_one(CapturedOutput capture) throws IOException {
GithubMilestones milestones = new GithubMilestones(this.github, withToken()) {
@Override
String org() {
@@ -73,12 +73,12 @@ public class GithubMilestonesTests {
milestones.closeMilestone(nonGaSleuthProject());
then(this.capture.toString()).doesNotContain("No matching milestone was found");
then(capture.toString()).doesNotContain("No matching milestone was found");
}
@Test
public void should_close_milestone_when_the_milestone_contains_numeric_version_only_and_version_is_ga()
throws IOException {
public void should_close_milestone_when_the_milestone_contains_numeric_version_only_and_version_is_ga(
CapturedOutput capture) throws IOException {
GithubMilestones milestones = new GithubMilestones(this.github, withToken()) {
@Override
String org() {
@@ -94,7 +94,7 @@ public class GithubMilestonesTests {
milestones.closeMilestone(gaSleuthProject());
then(this.capture.toString()).doesNotContain("No matching milestone was found");
then(capture.toString()).doesNotContain("No matching milestone was found");
}
private ProjectVersion gaSleuthProject() {
@@ -102,7 +102,7 @@ public class GithubMilestonesTests {
}
@Test
public void should_not_close_milestone_when_the_milestone_contains_numeric_version_only()
public void should_not_close_milestone_when_the_milestone_contains_numeric_version_only(CapturedOutput capture)
throws IOException {
GithubMilestones milestones = new GithubMilestones(this.github, withToken()) {
@Override
@@ -119,7 +119,7 @@ public class GithubMilestonesTests {
milestones.closeMilestone(nonGaSleuthProject());
then(this.capture.toString()).contains("No matching milestone was found");
then(capture.toString()).contains("No matching milestone was found");
}
@Test
@@ -137,16 +137,14 @@ public class GithubMilestonesTests {
@Override
URL foundMilestoneUrl(Milestone.Smart milestone) throws IOException {
return new URL(
"https://api.github.com/repos/spring-cloud/spring-cloud-sleuth/milestones/33");
return new URL("https://api.github.com/repos/spring-cloud/spring-cloud-sleuth/milestones/33");
}
};
this.repo.milestones().create("0.2.0.RELEASE");
String url = milestones.milestoneUrl(gaSleuthProject());
then(url).isEqualTo(
"https://github.com/spring-cloud/spring-cloud-sleuth/milestone/33?closed=1");
then(url).isEqualTo("https://github.com/spring-cloud/spring-cloud-sleuth/milestone/33?closed=1");
}
@Test
@@ -157,8 +155,7 @@ public class GithubMilestonesTests {
String url = milestones.milestoneUrl(gaSleuthProject());
then(url).isEqualTo(
"https://github.com/spring-cloud/spring-cloud-sleuth/milestone/33?closed=1");
then(url).isEqualTo("https://github.com/spring-cloud/spring-cloud-sleuth/milestone/33?closed=1");
}
@Test
@@ -186,7 +183,7 @@ public class GithubMilestonesTests {
}
@Test
public void should_return_null_if_no_matching_milestone_was_found_within_threshold()
public void should_return_null_if_no_matching_milestone_was_found_within_threshold(CapturedOutput capture)
throws IOException {
GithubMilestones milestones = new GithubMilestones(this.github, withThreshold()) {
@Override
@@ -203,8 +200,7 @@ public class GithubMilestonesTests {
milestones.closeMilestone(gaSleuthProject());
then(this.capture.toString()).contains(
"No matching milestones were found within the provided threshold [0]");
then(capture.toString()).contains("No matching milestones were found within the provided threshold [0]");
}
private ProjectVersion nonGaSleuthProject() {
@@ -212,8 +208,7 @@ public class GithubMilestonesTests {
}
@Test
public void should_throw_exception_when_there_is_no_matching_milestone()
throws IOException {
public void should_throw_exception_when_there_is_no_matching_milestone(CapturedOutput capture) throws IOException {
GithubMilestones milestones = new GithubMilestones(this.github, withToken()) {
@Override
String org() {
@@ -228,11 +223,11 @@ public class GithubMilestonesTests {
this.repo.milestones().create("v0.2.0.BUILD-SNAPSHOT");
milestones.closeMilestone(nonGaSleuthProject());
then(this.capture.toString()).contains("No matching milestone was found");
then(capture.toString()).contains("No matching milestone was found");
}
@Test
public void should_print_that_no_milestones_were_found_when_io_problems_occurred()
public void should_print_that_no_milestones_were_found_when_io_problems_occurred(CapturedOutput capture)
throws IOException {
GithubMilestones milestones = new GithubMilestones(this.github, withToken()) {
@Override
@@ -249,7 +244,7 @@ public class GithubMilestonesTests {
milestones.closeMilestone(nonGaSleuthProject());
then(this.capture.toString()).contains("No matching milestone was found");
then(capture.toString()).contains("No matching milestone was found");
}
private Repo createSleuthRepo(MkGithub github) throws IOException {
@@ -260,8 +255,7 @@ public class GithubMilestonesTests {
public void should_throw_exception_when_no_token_was_passed() {
GithubMilestones milestones = new GithubMilestones(new ReleaserProperties());
thenThrownBy(() -> milestones.closeMilestone(nonGaSleuthProject()))
.isInstanceOf(IllegalArgumentException.class)
thenThrownBy(() -> milestones.closeMilestone(nonGaSleuthProject())).isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("You must set the value of the OAuth token");
}

View File

@@ -23,10 +23,9 @@ import java.nio.file.Files;
import java.util.HashMap;
import java.util.Map;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import releaser.internal.ReleaserProperties;
import releaser.internal.buildsystem.GradleUpdater;
import releaser.internal.project.ProjectVersion;
@@ -42,14 +41,14 @@ import static org.assertj.core.api.BDDAssertions.thenThrownBy;
*/
public class GradleUpdaterTests {
@Rule
public TemporaryFolder tmp = new TemporaryFolder();
@TempDir
public File tmp;
File temporaryFolder;
@Before
@BeforeEach
public void setup() throws Exception {
this.temporaryFolder = this.tmp.newFolder();
this.temporaryFolder = new File(tmp, "test.txt");
FileSystemUtils.copyRecursively(file("/projects/"), this.temporaryFolder);
}
@@ -64,16 +63,14 @@ public class GradleUpdaterTests {
}
};
properties.getGradle().setGradlePropsSubstitution(props);
Projects projects = new Projects(
new ProjectVersion("spring-cloud-contract", "1.0.0"),
Projects projects = new Projects(new ProjectVersion("spring-cloud-contract", "1.0.0"),
new ProjectVersion("spring-cloud-sleuth", "2.0.0"));
new GradleUpdater().updateProjectFromReleaseTrain(properties, projectRoot,
projects, new ProjectVersion("spring-cloud-contract", "1.0.0"), true);
new GradleUpdater().updateProjectFromReleaseTrain(properties, projectRoot, projects,
new ProjectVersion("spring-cloud-contract", "1.0.0"), true);
then(asString(tmpFile("gradleproject/gradle.properties"))).contains("foo=1.0.0");
then(asString(tmpFile("gradleproject/child/gradle.properties")))
.contains("bar=2.0.0");
then(asString(tmpFile("gradleproject/child/gradle.properties"))).contains("bar=2.0.0");
}
@Test
@@ -87,15 +84,12 @@ public class GradleUpdaterTests {
}
};
properties.getGradle().setGradlePropsSubstitution(props);
Projects projects = new Projects(
new ProjectVersion("spring-cloud-contract", "1.0.0.BUILD-SNAPSHOT"),
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().updateProjectFromReleaseTrain(properties,
projectRoot, projects,
thenThrownBy(() -> new GradleUpdater().updateProjectFromReleaseTrain(properties, projectRoot, projects,
new ProjectVersion("spring-cloud-contract", "1.0.0.RELEASE"), true))
.hasMessageContaining(
"(BUILD-)?SNAPSHOT.*$] pattern in line number [1]");
.hasMessageContaining("(BUILD-)?SNAPSHOT.*$] pattern in line number [1]");
}
private File file(String relativePath) throws URISyntaxException {

View File

@@ -30,11 +30,10 @@ import org.assertj.core.api.BDDAssertions;
import org.awaitility.Awaitility;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.revwalk.RevCommit;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import org.mockito.BDDMockito;
import releaser.SpringCloudReleaserProperties;
import releaser.internal.PomUpdateAcceptanceTests;
@@ -60,8 +59,8 @@ import org.springframework.util.LinkedMultiValueMap;
*/
public class PostReleaseActionsTests {
@Rule
public TemporaryFolder tmp = new TemporaryFolder();
@TempDir
File tmp;
File temporaryFolder;
@@ -114,9 +113,9 @@ public class PostReleaseActionsTests {
return new VersionsFetcher(properties, updater);
}
@Before
@BeforeEach
public void setup() throws Exception {
this.temporaryFolder = this.tmp.newFolder();
this.temporaryFolder = new File(tmp, "test.txt");
TestUtils.prepareLocalRepo();
FileSystemUtils.copyRecursively(file("/projects/"), this.temporaryFolder);
}
@@ -124,27 +123,25 @@ public class PostReleaseActionsTests {
@Test
public void should_do_nothing_when_is_not_meta_release_and_update_test_is_called() {
this.properties.getMetaRelease().setEnabled(false);
PostReleaseActions actions = new PostReleaseActions(this.projectGitHandler,
this.updater, this.gradleUpdater, this.commandExecutor, this.properties,
versionsFetcher, releaserPropertiesUpdater);
PostReleaseActions actions = new PostReleaseActions(this.projectGitHandler, this.updater, this.gradleUpdater,
this.commandExecutor, this.properties, versionsFetcher, releaserPropertiesUpdater);
actions.runUpdatedTests(currentGa());
BDDAssertions.then(this.cloned).isNull();
BDDMockito.then(this.gradleUpdater).shouldHaveZeroInteractions();
BDDMockito.then(this.gradleUpdater).shouldHaveNoInteractions();
}
@Test
public void should_do_nothing_when_the_switch_for_sample_check_is_off_and_update_test_is_called() {
this.properties.getGit().setRunUpdatedSamples(false);
PostReleaseActions actions = new PostReleaseActions(this.projectGitHandler,
this.updater, this.gradleUpdater, this.commandExecutor, this.properties,
versionsFetcher, releaserPropertiesUpdater);
PostReleaseActions actions = new PostReleaseActions(this.projectGitHandler, this.updater, this.gradleUpdater,
this.commandExecutor, this.properties, versionsFetcher, releaserPropertiesUpdater);
actions.runUpdatedTests(currentGa());
BDDAssertions.then(this.cloned).isNull();
BDDMockito.then(this.gradleUpdater).shouldHaveZeroInteractions();
BDDMockito.then(this.gradleUpdater).shouldHaveNoInteractions();
}
@Test
@@ -153,12 +150,11 @@ public class PostReleaseActionsTests {
properties.getMetaRelease().setEnabled(true);
properties.getGit().setRunUpdatedSamples(true);
properties.getGit().setUpdateAllTestSamples(true);
properties.getGit().setTestSamplesProjectUrl(
tmpFile("spring-cloud-core-tests/").getAbsolutePath() + "/");
properties.getGit().setTestSamplesProjectUrl(tmpFile("spring-cloud-core-tests/").getAbsolutePath() + "/");
properties.getMaven().setBuildCommand("touch build.log");
PostReleaseActions actions = new PostReleaseActions(projectGitHandler(properties),
projectPomUpdater(properties), this.gradleUpdater, commandExecutor,
properties, fetcher(properties), releaserPropertiesUpdater) {
projectPomUpdater(properties), this.gradleUpdater, commandExecutor, properties, fetcher(properties),
releaserPropertiesUpdater) {
@Override
ReleaserProperties projectProps(File file) {
return properties;
@@ -177,17 +173,15 @@ public class PostReleaseActionsTests {
private void thenGradleUpdaterWasCalled() {
BDDMockito.then(this.gradleUpdater).should().updateProjectFromReleaseTrain(
BDDMockito.any(ReleaserProperties.class), BDDMockito.any(File.class),
BDDMockito.any(Projects.class), BDDMockito.any(ProjectVersion.class),
BDDMockito.eq(false));
BDDMockito.any(ReleaserProperties.class), BDDMockito.any(File.class), BDDMockito.any(Projects.class),
BDDMockito.any(ProjectVersion.class), BDDMockito.eq(false));
}
@Test
public void should_do_nothing_when_is_not_meta_release_and_release_train_docs_generation_is_called() {
this.properties.getMetaRelease().setEnabled(false);
PostReleaseActions actions = new PostReleaseActions(this.projectGitHandler,
this.updater, this.gradleUpdater, this.commandExecutor, this.properties,
versionsFetcher, releaserPropertiesUpdater);
PostReleaseActions actions = new PostReleaseActions(this.projectGitHandler, this.updater, this.gradleUpdater,
this.commandExecutor, this.properties, versionsFetcher, releaserPropertiesUpdater);
actions.generateReleaseTrainDocumentation(currentGa());
@@ -197,25 +191,22 @@ public class PostReleaseActionsTests {
@Test
public void should_do_nothing_when_the_switch_for_sample_check_is_off_and_release_train_docs_generation_is_called() {
this.properties.getGit().setUpdateReleaseTrainDocs(false);
PostReleaseActions actions = new PostReleaseActions(this.projectGitHandler,
this.updater, this.gradleUpdater, this.commandExecutor, this.properties,
versionsFetcher, releaserPropertiesUpdater);
PostReleaseActions actions = new PostReleaseActions(this.projectGitHandler, this.updater, this.gradleUpdater,
this.commandExecutor, this.properties, versionsFetcher, releaserPropertiesUpdater);
actions.generateReleaseTrainDocumentation(currentGa());
BDDAssertions.then(this.cloned).isNull();
}
@Ignore("flakey on circle")
@Disabled("flakey on circle")
@Test
public void should_update_project_and_run_tests_and_release_train_docs_generation_is_called() {
this.properties.getMetaRelease().setEnabled(true);
this.properties.getGit().setReleaseTrainDocsUrl(
tmpFile("spring-cloud-core-tests/").getAbsolutePath() + "/");
this.properties.getGit().setReleaseTrainDocsUrl(tmpFile("spring-cloud-core-tests/").getAbsolutePath() + "/");
this.properties.getMaven().setGenerateReleaseTrainDocsCommand("./test.sh");
PostReleaseActions actions = new PostReleaseActions(this.projectGitHandler,
this.updater, this.gradleUpdater, this.commandExecutor, this.properties,
versionsFetcher, releaserPropertiesUpdater);
PostReleaseActions actions = new PostReleaseActions(this.projectGitHandler, this.updater, this.gradleUpdater,
this.commandExecutor, this.properties, versionsFetcher, releaserPropertiesUpdater);
actions.generateReleaseTrainDocumentation(currentGa());
@@ -230,43 +221,38 @@ public class PostReleaseActionsTests {
@Test
public void should_do_nothing_when_is_not_meta_release_and_test_samples_update_is_called() {
this.properties.getMetaRelease().setEnabled(false);
PostReleaseActions actions = new PostReleaseActions(this.projectGitHandler,
this.updater, this.gradleUpdater, this.commandExecutor, this.properties,
versionsFetcher, releaserPropertiesUpdater);
PostReleaseActions actions = new PostReleaseActions(this.projectGitHandler, this.updater, this.gradleUpdater,
this.commandExecutor, this.properties, versionsFetcher, releaserPropertiesUpdater);
actions.updateAllTestSamples(currentGa());
BDDAssertions.then(this.cloned).isNull();
BDDMockito.then(this.gradleUpdater).shouldHaveZeroInteractions();
BDDMockito.then(this.gradleUpdater).shouldHaveNoInteractions();
}
@Test
public void should_do_nothing_when_the_switch_for_test_samples_update_check_is_off_and_update_is_called() {
this.properties.getGit().setUpdateReleaseTrainDocs(false);
PostReleaseActions actions = new PostReleaseActions(this.projectGitHandler,
this.updater, this.gradleUpdater, this.commandExecutor, this.properties,
versionsFetcher, releaserPropertiesUpdater);
PostReleaseActions actions = new PostReleaseActions(this.projectGitHandler, this.updater, this.gradleUpdater,
this.commandExecutor, this.properties, versionsFetcher, releaserPropertiesUpdater);
actions.updateAllTestSamples(currentGa());
BDDAssertions.then(this.cloned).isNull();
BDDMockito.then(this.gradleUpdater).shouldHaveZeroInteractions();
BDDMockito.then(this.gradleUpdater).shouldHaveNoInteractions();
}
@Test
public void should_update_test_sample_projects_when_test_samples_update_is_called()
throws Exception {
public void should_update_test_sample_projects_when_test_samples_update_is_called() throws Exception {
ReleaserProperties properties = SpringCloudReleaserProperties.get();
properties.getMetaRelease().setEnabled(true);
properties.getGit().setUpdateAllTestSamples(true);
properties.getGit().getAllTestSampleUrls().clear();
properties.getGit().getAllTestSampleUrls().put("spring-cloud-sleuth",
Collections.singletonList(
tmpFile("spring-cloud-core-tests/").getAbsolutePath() + "/"));
Collections.singletonList(tmpFile("spring-cloud-core-tests/").getAbsolutePath() + "/"));
AtomicReference<Projects> postReleaseProjects = new AtomicReference<>();
PostReleaseActions actions = new PostReleaseActions(this.projectGitHandler,
this.updater, this.gradleUpdater, this.commandExecutor, properties,
versionsFetcher, releaserPropertiesUpdater) {
PostReleaseActions actions = new PostReleaseActions(this.projectGitHandler, this.updater, this.gradleUpdater,
this.commandExecutor, properties, versionsFetcher, releaserPropertiesUpdater) {
@Override
Projects getPostReleaseProjects(Projects projects) {
postReleaseProjects.set(super.getPostReleaseProjects(projects));
@@ -280,37 +266,31 @@ public class PostReleaseActionsTests {
.filter(s -> s.getKey().contains("spring-cloud-core-tests")).findFirst()
.orElseThrow(() -> new IllegalStateException("Not found"));
File clonedFile = entry.getValue().get(0);
Model pomWithCloud = PomReader
.readPom(new File(clonedFile, "zuul-proxy-eureka/pom.xml"));
Model pomWithCloud = PomReader.readPom(new File(clonedFile, "zuul-proxy-eureka/pom.xml"));
Git git = GitTestUtils.openGitProject(clonedFile);
BDDAssertions
.then(pomWithCloud.getProperties().getProperty("spring-cloud.version"))
BDDAssertions.then(pomWithCloud.getProperties().getProperty("spring-cloud.version"))
.isEqualTo("Finchley.SNAPSHOT");
BDDAssertions.then(pomWithCloud.getParent().getVersion())
.isEqualTo("2.0.4.RELEASE");
BDDAssertions.then(pomWithCloud.getParent().getVersion()).isEqualTo("2.0.4.RELEASE");
Iterator<RevCommit> iterator = git.log().call().iterator();
RevCommit commit = iterator.next();
BDDAssertions.then(commit.getShortMessage()).isEqualTo(
"Updated versions after [Finchley.SR1] release train and [2.0.1.RELEASE] [spring-cloud-sleuth] project release");
thenGradleUpdaterWasCalled();
BDDAssertions.then(
postReleaseProjects.get().forName("spring-boot-dependencies").version)
BDDAssertions.then(postReleaseProjects.get().forName("spring-boot-dependencies").version)
.isEqualTo("2.0.4.RELEASE");
}
@Test
public void should_assume_that_project_version_is_snapshot_when_no_pom_is_present()
throws Exception {
public void should_assume_that_project_version_is_snapshot_when_no_pom_is_present() throws Exception {
ReleaserProperties properties = SpringCloudReleaserProperties.get();
properties.getMetaRelease().setEnabled(true);
properties.getGit().setUpdateAllTestSamples(true);
properties.getGit().getAllTestSampleUrls().clear();
properties.getGit().getAllTestSampleUrls().put("spring-cloud-sleuth", Collections
.singletonList(tmpFile("spring-cloud-static/").getAbsolutePath() + "/"));
properties.getGit().getAllTestSampleUrls().put("spring-cloud-sleuth",
Collections.singletonList(tmpFile("spring-cloud-static/").getAbsolutePath() + "/"));
AtomicReference<Projects> postReleaseProjects = new AtomicReference<>();
PostReleaseActions actions = new PostReleaseActions(this.projectGitHandler,
this.updater, this.gradleUpdater, this.commandExecutor, properties,
versionsFetcher, releaserPropertiesUpdater) {
PostReleaseActions actions = new PostReleaseActions(this.projectGitHandler, this.updater, this.gradleUpdater,
this.commandExecutor, properties, versionsFetcher, releaserPropertiesUpdater) {
@Override
Projects getPostReleaseProjects(Projects projects) {
postReleaseProjects.set(super.getPostReleaseProjects(projects));
@@ -320,8 +300,7 @@ public class PostReleaseActionsTests {
actions.updateAllTestSamples(currentGa());
this.clonedTestProjects.entrySet().stream()
.filter(s -> s.getKey().contains("spring-cloud-static")).findFirst()
this.clonedTestProjects.entrySet().stream().filter(s -> s.getKey().contains("spring-cloud-static")).findFirst()
.orElseThrow(() -> new IllegalStateException("Not found"));
}
@@ -329,14 +308,13 @@ public class PostReleaseActionsTests {
public void should_do_nothing_when_guides_are_turned_off() {
this.properties.getGit().setUpdateSpringGuides(false);
VersionsFetcher versionsFetcher = BDDMockito.mock(VersionsFetcher.class);
PostReleaseActions actions = new PostReleaseActions(this.projectGitHandler,
this.updater, this.gradleUpdater, this.commandExecutor, this.properties,
versionsFetcher, releaserPropertiesUpdater);
PostReleaseActions actions = new PostReleaseActions(this.projectGitHandler, this.updater, this.gradleUpdater,
this.commandExecutor, this.properties, versionsFetcher, releaserPropertiesUpdater);
actions.deployGuides(Collections.emptyList());
BDDAssertions.then(this.cloned).isNull();
BDDMockito.then(versionsFetcher).shouldHaveZeroInteractions();
BDDMockito.then(versionsFetcher).shouldHaveNoInteractions();
}
@Test
@@ -348,33 +326,29 @@ public class PostReleaseActionsTests {
BDDMockito.given(versionsFetcher.isLatestGa(BDDMockito.any())).willReturn(true);
AtomicReference<ProjectCommandExecutor> projectBuilderStub = new AtomicReference<>();
ProjectGitHandler handler = BDDMockito.mock(ProjectGitHandler.class);
ProjectCommandExecutor projectCommandExecutor = BDDMockito
.mock(ProjectCommandExecutor.class);
PostReleaseActions actions = new PostReleaseActions(handler, this.updater,
this.gradleUpdater, this.commandExecutor, this.properties,
versionsFetcher, releaserPropertiesUpdater) {
ProjectCommandExecutor projectCommandExecutor = BDDMockito.mock(ProjectCommandExecutor.class);
PostReleaseActions actions = new PostReleaseActions(handler, this.updater, this.gradleUpdater,
this.commandExecutor, this.properties, versionsFetcher, releaserPropertiesUpdater) {
@Override
ProjectCommandExecutor projectBuilder(ProcessedProject processedProject) {
projectBuilderStub.set(projectCommandExecutor);
return projectCommandExecutor;
}
};
ProjectVersion projectVersion = new ProjectVersion(
new File(projects, "spring-cloud-release"));
ProjectVersion projectVersion = new ProjectVersion(new File(projects, "spring-cloud-release"));
actions.deployGuides(Collections.singletonList(
new ProcessedProject(this.properties, projectVersion, projectVersion)));
actions.deployGuides(
Collections.singletonList(new ProcessedProject(this.properties, projectVersion, projectVersion)));
Awaitility.await().untilAsserted(() -> {
BDDAssertions.then(projectBuilderStub.get()).isNotNull();
BDDMockito.then(projectBuilderStub.get()).should()
.deployGuides(this.properties, projectVersion, projectVersion);
BDDMockito.then(projectBuilderStub.get()).should().deployGuides(this.properties, projectVersion,
projectVersion);
});
}
private String sleuthParentPomVersion() {
return PomReader.readPom(new File(this.cloned, "sleuth/pom.xml")).getParent()
.getVersion();
return PomReader.readPom(new File(this.cloned, "sleuth/pom.xml")).getParent().getVersion();
}
Projects currentGa() {

View File

@@ -25,40 +25,35 @@ import java.net.URISyntaxException;
import java.nio.file.Files;
import java.util.concurrent.TimeoutException;
import org.junit.Assume;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import org.zeroturnaround.exec.ProcessExecutor;
import org.zeroturnaround.exec.ProcessResult;
import releaser.internal.PomUpdateAcceptanceTests;
import releaser.internal.ReleaserProperties;
import releaser.internal.buildsystem.TestUtils;
import org.springframework.boot.test.rule.OutputCapture;
import org.springframework.util.FileSystemUtils;
import static org.assertj.core.api.BDDAssertions.then;
import static org.assertj.core.api.BDDAssertions.thenThrownBy;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
/**
* @author Marcin Grzejszczak
*/
public class ProjectCommandExecutorTests {
@Rule
public TemporaryFolder tmp = new TemporaryFolder();
@Rule
public OutputCapture outputCapture = new OutputCapture();
@TempDir
public File tmp;
File temporaryFolder;
@Before
@BeforeEach
public void checkOs() throws Exception {
Assume.assumeFalse(System.getProperty("os.name").toLowerCase().startsWith("win"));
this.temporaryFolder = this.tmp.newFolder();
assumeFalse(System.getProperty("os.name").toLowerCase().startsWith("win"));
this.temporaryFolder = new File(tmp, "test");
TestUtils.prepareLocalRepo();
FileSystemUtils.copyRecursively(file("/projects"), this.temporaryFolder);
}
@@ -80,32 +75,26 @@ public class ProjectCommandExecutorTests {
properties.setWorkingDir(tmpFile("/builder/resolved").getPath());
ProjectCommandExecutor builder = projectBuilder(properties);
builder.build(properties, original(),
new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"));
builder.build(properties, original(), new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"));
then(asString(tmpFile("/builder/resolved/resolved.log")))
.contains("resolved.log");
then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("resolved.log");
}
@Test
public void should_successfully_execute_a_command_when_path_is_provided_explicitly()
throws Exception {
public void should_successfully_execute_a_command_when_path_is_provided_explicitly() throws Exception {
ReleaserProperties properties = new ReleaserProperties();
properties.getBash().setBuildCommand("ls -al");
properties.setWorkingDir(new File("/foo/bar").getAbsolutePath());
ProjectCommandExecutor builder = projectBuilder(properties);
builder.build(properties, original(),
new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"),
builder.build(properties, original(), new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"),
tmpFile("/builder/resolved").getPath());
then(asString(tmpFile("/builder/resolved/resolved.log")))
.contains("resolved.log");
then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("resolved.log");
}
@Test
public void should_successfully_execute_a_build_command_for_milestone_version()
throws Exception {
public void should_successfully_execute_a_build_command_for_milestone_version() throws Exception {
ReleaserProperties properties = new ReleaserProperties();
properties.getBash().setBuildCommand("echo foo");
properties.setWorkingDir(tmpFile("/builder/resolved").getPath());
@@ -117,8 +106,7 @@ public class ProjectCommandExecutorTests {
}
@Test
public void should_successfully_execute_a_build_command_for_rc_version()
throws Exception {
public void should_successfully_execute_a_build_command_for_rc_version() throws Exception {
ReleaserProperties properties = new ReleaserProperties();
properties.getBash().setBuildCommand("echo foo");
properties.setWorkingDir(tmpFile("/builder/resolved").getPath());
@@ -126,13 +114,11 @@ public class ProjectCommandExecutorTests {
builder.build(properties, original(), new ProjectVersion("foo", "1.0.0.RC1"));
then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("foo")
.doesNotContain("-Pguides");
then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("foo").doesNotContain("-Pguides");
}
@Test
public void should_successfully_execute_a_build_command_for_release_version()
throws Exception {
public void should_successfully_execute_a_build_command_for_release_version() throws Exception {
ReleaserProperties properties = new ReleaserProperties();
properties.getBash().setBuildCommand("echo foo");
properties.setWorkingDir(tmpFile("/builder/resolved").getPath());
@@ -144,8 +130,7 @@ public class ProjectCommandExecutorTests {
}
@Test
public void should_successfully_execute_a_build_command_for_sr_version()
throws Exception {
public void should_successfully_execute_a_build_command_for_sr_version() throws Exception {
ReleaserProperties properties = new ReleaserProperties();
properties.getBash().setBuildCommand("echo foo");
properties.setWorkingDir(tmpFile("/builder/resolved").getPath());
@@ -157,19 +142,16 @@ public class ProjectCommandExecutorTests {
}
@Test
public void should_successfully_execute_a_command_when_system_props_placeholder_is_present()
throws Exception {
public void should_successfully_execute_a_command_when_system_props_placeholder_is_present() throws Exception {
ReleaserProperties properties = new ReleaserProperties();
properties.getBash().setBuildCommand("echo {{systemProps}}");
properties.getBash().setSystemProperties("-Dhello=world -Dfoo=bar");
properties.setWorkingDir(tmpFile("/builder/resolved").getPath());
ProjectCommandExecutor builder = projectBuilder(properties);
builder.build(properties, original(),
new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"));
builder.build(properties, original(), new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"));
then(asString(tmpFile("/builder/resolved/resolved.log")))
.contains("-Dhello=world -Dfoo=bar");
then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("-Dhello=world -Dfoo=bar");
}
@Test
@@ -180,8 +162,7 @@ public class ProjectCommandExecutorTests {
properties.setWorkingDir(tmpFile("/builder/resolved").getPath());
ProjectCommandExecutor builder = projectBuilder(properties);
builder.build(properties, original(),
new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"));
builder.build(properties, original(), new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"));
then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("foo");
}
@@ -195,11 +176,9 @@ public class ProjectCommandExecutorTests {
properties.setWorkingDir(tmpFile("/builder/resolved").getPath());
ProjectCommandExecutor builder = projectBuilder(properties);
builder.build(properties, original(),
new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"));
builder.build(properties, original(), new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"));
then(asString(tmpFile("/builder/resolved/resolved.log")))
.contains("hello=world foo=bar");
then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("hello=world foo=bar");
}
@Test
@@ -211,11 +190,9 @@ public class ProjectCommandExecutorTests {
properties.setWorkingDir(tmpFile("/builder/resolved").getPath());
ProjectCommandExecutor builder = projectBuilder(properties);
builder.build(properties, original(),
new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"));
builder.build(properties, original(), new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"));
then(asString(tmpFile("/builder/resolved/resolved.log")))
.contains("-Dhello=world -Dfoo=bar bar");
then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("-Dhello=world -Dfoo=bar bar");
}
@Test
@@ -227,11 +204,9 @@ public class ProjectCommandExecutorTests {
properties.setWorkingDir(tmpFile("/builder/resolved").getPath());
ProjectCommandExecutor builder = projectBuilder(properties);
builder.build(properties, original(),
new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"));
builder.build(properties, original(), new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"));
then(asString(tmpFile("/builder/resolved/resolved.log")))
.contains("bar -Dhello=world -Dfoo=bar");
then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("bar -Dhello=world -Dfoo=bar");
}
@Test
@@ -241,9 +216,8 @@ public class ProjectCommandExecutorTests {
properties.setWorkingDir(tmpFile("/builder/unresolved").getPath());
ProjectCommandExecutor builder = projectBuilder(properties);
thenThrownBy(() -> builder.build(properties, original(),
new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"))).hasMessageContaining(
"contains a tag that wasn't resolved properly");
thenThrownBy(() -> builder.build(properties, original(), new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT")))
.hasMessageContaining("contains a tag that wasn't resolved properly");
}
@Test
@@ -254,9 +228,8 @@ public class ProjectCommandExecutorTests {
properties.setWorkingDir(tmpFile("/builder/unresolved").getPath());
ProjectCommandExecutor builder = projectBuilder(properties);
thenThrownBy(() -> builder.build(properties, original(),
new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"))).hasMessageContaining(
"Process waiting time of [0] minutes exceeded");
thenThrownBy(() -> builder.build(properties, original(), new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT")))
.hasMessageContaining("Process waiting time of [0] minutes exceeded");
}
@Test
@@ -266,16 +239,13 @@ public class ProjectCommandExecutorTests {
properties.setWorkingDir(tmpFile("/builder/resolved").getPath());
ProjectCommandExecutor builder = projectBuilder(properties);
builder.deploy(properties, original(),
new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"));
builder.deploy(properties, original(), new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"));
then(asString(tmpFile("/builder/resolved/resolved.log")))
.contains("resolved.log");
then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("resolved.log");
}
@Test
public void should_successfully_execute_a_deploy_command_for_milestone_version()
throws Exception {
public void should_successfully_execute_a_deploy_command_for_milestone_version() throws Exception {
ReleaserProperties properties = new ReleaserProperties();
properties.getBash().setDeployCommand("echo foo");
properties.setWorkingDir(tmpFile("/builder/resolved").getPath());
@@ -283,90 +253,76 @@ public class ProjectCommandExecutorTests {
builder.deploy(properties, original(), new ProjectVersion("foo", "1.0.0.M1"));
then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("foo")
.doesNotContain("-Pguides");
then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("foo").doesNotContain("-Pguides");
}
@Test
public void should_successfully_execute_a_deploy_command_for_milestone_version_for_maven()
throws Exception {
public void should_successfully_execute_a_deploy_command_for_milestone_version_for_maven() throws Exception {
ReleaserProperties properties = new ReleaserProperties();
properties.getMaven().setDeployCommand("echo foo");
properties.setWorkingDir(tmpFile("/builder/resolved").getPath());
new ReleaserProcessExecutor(properties.getWorkingDir())
.runCommand(new String[] { "touch", "pom.xml" }, 1);
new ReleaserProcessExecutor(properties.getWorkingDir()).runCommand(new String[] { "touch", "pom.xml" }, 1);
ProjectCommandExecutor builder = projectBuilder(properties);
builder.deploy(properties, original(), new ProjectVersion("foo", "1.0.0.M1"));
then(asString(tmpFile("/builder/resolved/resolved.log")))
.contains("foo -Pmilestone").doesNotContain("-Pguides");
}
@Test
public void should_successfully_execute_a_deploy_command_for_rc_version()
throws Exception {
ReleaserProperties properties = new ReleaserProperties();
properties.getBash().setDeployCommand("echo foo");
properties.setWorkingDir(tmpFile("/builder/resolved").getPath());
ProjectCommandExecutor builder = projectBuilder(properties);
builder.deploy(properties, original(), new ProjectVersion("foo", "1.0.0.RC1"));
then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("foo")
then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("foo -Pmilestone")
.doesNotContain("-Pguides");
}
@Test
public void should_successfully_execute_a_deploy_command_for_rc_version_for_maven()
throws Exception {
ReleaserProperties properties = new ReleaserProperties();
properties.getMaven().setDeployCommand("echo foo");
properties.setWorkingDir(tmpFile("/builder/resolved").getPath());
new ReleaserProcessExecutor(properties.getWorkingDir())
.runCommand(new String[] { "touch", "pom.xml" }, 1);
ProjectCommandExecutor builder = projectBuilder(properties);
builder.deploy(properties, original(), new ProjectVersion("foo", "1.0.0.RC1"));
then(asString(tmpFile("/builder/resolved/resolved.log")))
.contains("foo -Pmilestone").doesNotContain("-Pguides");
}
@Test
public void should_successfully_execute_a_deploy_command_for_release_version()
throws Exception {
public void should_successfully_execute_a_deploy_command_for_rc_version() throws Exception {
ReleaserProperties properties = new ReleaserProperties();
properties.getBash().setDeployCommand("echo foo");
properties.setWorkingDir(tmpFile("/builder/resolved").getPath());
ProjectCommandExecutor builder = projectBuilder(properties);
builder.deploy(properties, original(),
new ProjectVersion("foo", "1.0.0.RELEASE"));
builder.deploy(properties, original(), new ProjectVersion("foo", "1.0.0.RC1"));
then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("foo").doesNotContain("-Pguides");
}
@Test
public void should_successfully_execute_a_deploy_command_for_rc_version_for_maven() throws Exception {
ReleaserProperties properties = new ReleaserProperties();
properties.getMaven().setDeployCommand("echo foo");
properties.setWorkingDir(tmpFile("/builder/resolved").getPath());
new ReleaserProcessExecutor(properties.getWorkingDir()).runCommand(new String[] { "touch", "pom.xml" }, 1);
ProjectCommandExecutor builder = projectBuilder(properties);
builder.deploy(properties, original(), new ProjectVersion("foo", "1.0.0.RC1"));
then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("foo -Pmilestone")
.doesNotContain("-Pguides");
}
@Test
public void should_successfully_execute_a_deploy_command_for_release_version() throws Exception {
ReleaserProperties properties = new ReleaserProperties();
properties.getBash().setDeployCommand("echo foo");
properties.setWorkingDir(tmpFile("/builder/resolved").getPath());
ProjectCommandExecutor builder = projectBuilder(properties);
builder.deploy(properties, original(), new ProjectVersion("foo", "1.0.0.RELEASE"));
then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("foo");
}
@Test
public void should_successfully_execute_a_deploy_command_for_release_version_for_maven()
throws Exception {
public void should_successfully_execute_a_deploy_command_for_release_version_for_maven() throws Exception {
ReleaserProperties properties = new ReleaserProperties();
properties.getMaven().setDeployCommand("echo foo");
properties.setWorkingDir(tmpFile("/builder/resolved").getPath());
new ReleaserProcessExecutor(properties.getWorkingDir())
.runCommand(new String[] { "touch", "pom.xml" }, 1);
new ReleaserProcessExecutor(properties.getWorkingDir()).runCommand(new String[] { "touch", "pom.xml" }, 1);
ProjectCommandExecutor builder = projectBuilder(properties);
builder.deploy(properties, original(),
new ProjectVersion("foo", "1.0.0.RELEASE"));
builder.deploy(properties, original(), new ProjectVersion("foo", "1.0.0.RELEASE"));
then(asString(tmpFile("/builder/resolved/resolved.log")))
.contains("foo -Pcentral");
then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("foo -Pcentral");
}
@Test
public void should_successfully_execute_a_deploy_command_for_sr_version()
throws Exception {
public void should_successfully_execute_a_deploy_command_for_sr_version() throws Exception {
ReleaserProperties properties = new ReleaserProperties();
properties.getBash().setDeployCommand("echo foo");
properties.setWorkingDir(tmpFile("/builder/resolved").getPath());
@@ -378,19 +334,16 @@ public class ProjectCommandExecutorTests {
}
@Test
public void should_successfully_execute_a_deploy_command_with_sys_props_placeholder()
throws Exception {
public void should_successfully_execute_a_deploy_command_with_sys_props_placeholder() throws Exception {
ReleaserProperties properties = new ReleaserProperties();
properties.getBash().setDeployCommand("echo \"{{systemProps}}\"");
properties.getBash().setSystemProperties("-Dhello=hello-world");
properties.setWorkingDir(tmpFile("/builder/resolved").getPath());
ProjectCommandExecutor builder = projectBuilder(properties);
builder.deploy(properties, original(),
new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"));
builder.deploy(properties, original(), new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"));
then(asString(tmpFile("/builder/resolved/resolved.log")))
.contains("-Dhello=hello-world");
then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("-Dhello=hello-world");
}
@Test
@@ -402,11 +355,9 @@ public class ProjectCommandExecutorTests {
properties.setWorkingDir(tmpFile("/builder/resolved").getPath());
ProjectCommandExecutor builder = projectBuilder(properties);
builder.deploy(properties, original(),
new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"));
builder.deploy(properties, original(), new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"));
then(asString(tmpFile("/builder/resolved/resolved.log")))
.contains("-Dhello=hello-world");
then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("-Dhello=hello-world");
}
@Test
@@ -417,16 +368,14 @@ public class ProjectCommandExecutorTests {
properties.setWorkingDir(tmpFile("/builder/unresolved").getPath());
ProjectCommandExecutor builder = projectBuilder(properties);
thenThrownBy(() -> builder.deploy(properties, original(),
new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"))).hasMessageContaining(
"Process waiting time of [0] minutes exceeded");
thenThrownBy(() -> builder.deploy(properties, original(), new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT")))
.hasMessageContaining("Process waiting time of [0] minutes exceeded");
}
@Test
public void should_successfully_execute_a_publish_docs_command() throws Exception {
ReleaserProperties properties = new ReleaserProperties();
properties.getBash().setPublishDocsCommand(
"ls -al && echo {{version}} {{oldVersion}} {{nextVersion}}");
properties.getBash().setPublishDocsCommand("ls -al && echo {{version}} {{oldVersion}} {{nextVersion}}");
properties.setWorkingDir(tmpFile("/builder/resolved").getPath());
TestReleaserProcessExecutor executor = testExecutor(properties.getWorkingDir());
ProjectCommandExecutor builder = new ProjectCommandExecutor() {
@@ -436,8 +385,7 @@ public class ProjectCommandExecutorTests {
}
};
builder.publishDocs(properties, original(),
new ProjectVersion("foo", "1.0.0.RELEASE"));
builder.publishDocs(properties, original(), new ProjectVersion("foo", "1.0.0.RELEASE"));
then(asString(tmpFile("/builder/resolved/resolved.log")))
.contains("1.0.0.RELEASE 0.100.0.BUILD-SNAPSHOT 1.0.1.RELEASE");
@@ -445,11 +393,9 @@ public class ProjectCommandExecutorTests {
}
@Test
public void should_successfully_execute_a_publish_docs_command_with_sys_props_placeholder()
throws Exception {
public void should_successfully_execute_a_publish_docs_command_with_sys_props_placeholder() throws Exception {
ReleaserProperties properties = new ReleaserProperties();
properties.getBash().setPublishDocsCommand(
"echo {{systemProps}} 1 && echo {{systemProps}} 2");
properties.getBash().setPublishDocsCommand("echo {{systemProps}} 1 && echo {{systemProps}} 2");
properties.getBash().setSystemProperties("-Dhello=world -Dfoo=bar");
properties.setWorkingDir(tmpFile("/builder/resolved").getPath());
TestReleaserProcessExecutor executor = testExecutor(properties.getWorkingDir());
@@ -460,8 +406,7 @@ public class ProjectCommandExecutorTests {
}
};
builder.publishDocs(properties, original(),
new ProjectVersion("foo", "Finchley.RELEASE"));
builder.publishDocs(properties, original(), new ProjectVersion("foo", "Finchley.RELEASE"));
String s = asString(tmpFile("/builder/resolved/resolved.log"));
System.out.println("====> " + s);
@@ -470,8 +415,7 @@ public class ProjectCommandExecutorTests {
}
@Test
public void should_successfully_execute_a_publish_docs_command_and_substitute_the_version()
throws Exception {
public void should_successfully_execute_a_publish_docs_command_and_substitute_the_version() throws Exception {
ReleaserProperties properties = new ReleaserProperties();
properties.getBash().setPublishDocsCommand("echo '{{version}}'");
properties.setWorkingDir(tmpFile("/builder/resolved").getPath());
@@ -483,16 +427,13 @@ public class ProjectCommandExecutorTests {
}
};
builder.publishDocs(properties, original(),
new ProjectVersion("foo", "1.1.0.RELEASE"));
builder.publishDocs(properties, original(), new ProjectVersion("foo", "1.1.0.RELEASE"));
then(asString(tmpFile("/builder/resolved/resolved.log")))
.contains("1.1.0.RELEASE");
then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("1.1.0.RELEASE");
}
@Test
public void should_successfully_execute_an_update_docs_command_and_substitute_the_version()
throws Exception {
public void should_successfully_execute_an_update_docs_command_and_substitute_the_version() throws Exception {
ReleaserProperties properties = new ReleaserProperties();
properties.getBash().setGenerateReleaseTrainDocsCommand("echo '{{version}}'");
File resolved = tmpFile("/builder/resolved");
@@ -505,11 +446,9 @@ public class ProjectCommandExecutorTests {
}
};
builder.generateReleaseTrainDocs(properties, "1.1.0.RELEASE",
resolved.getAbsolutePath());
builder.generateReleaseTrainDocs(properties, "1.1.0.RELEASE", resolved.getAbsolutePath());
then(asString(tmpFile("/builder/resolved/resolved.log")))
.contains("1.1.0.RELEASE");
then(asString(tmpFile("/builder/resolved/resolved.log"))).contains("1.1.0.RELEASE");
}
@Test
@@ -520,9 +459,8 @@ public class ProjectCommandExecutorTests {
properties.setWorkingDir(tmpFile("/builder/unresolved").getPath());
ProjectCommandExecutor builder = projectBuilder(properties);
thenThrownBy(() -> builder.publishDocs(properties, original(),
new ProjectVersion("foo", "1.0.0.RELEASE"))).hasMessageContaining(
"Process waiting time of [0] minutes exceeded");
thenThrownBy(() -> builder.publishDocs(properties, original(), new ProjectVersion("foo", "1.0.0.RELEASE")))
.hasMessageContaining("Process waiting time of [0] minutes exceeded");
}
@Test
@@ -543,9 +481,8 @@ public class ProjectCommandExecutorTests {
}
};
thenThrownBy(() -> builder.build(properties, original(),
new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT"))).hasMessageContaining(
"The process has exited with exit code [1]");
thenThrownBy(() -> builder.build(properties, original(), new ProjectVersion("foo", "1.0.0.BUILD-SNAPSHOT")))
.hasMessageContaining("The process has exited with exit code [1]");
}
private TestReleaserProcessExecutor testExecutor(String workingDir) {
@@ -579,14 +516,12 @@ public class ProjectCommandExecutorTests {
@Override
ProcessExecutor processExecutor(String[] commands, String workingDir) {
this.counter++;
final ProcessExecutor processExecutor = super.processExecutor(commands,
workingDir);
final ProcessExecutor processExecutor = super.processExecutor(commands, workingDir);
File tempFile = tmpFile("/builder/resolved/resolved.log");
try {
tempFile.createNewFile();
OutputStream fos = new BufferedOutputStream(
new FileOutputStream(tempFile));
OutputStream fos = new BufferedOutputStream(new FileOutputStream(tempFile));
return processExecutor
// use redirectOutputAlsoTo to avoid overriding all output

View File

@@ -21,10 +21,9 @@ import java.util.Arrays;
import java.util.List;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import releaser.internal.ReleaserProperties;
import org.springframework.beans.factory.annotation.Autowired;
@@ -34,7 +33,6 @@ import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.contract.stubrunner.spring.AutoConfigureStubRunner;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.web.client.RestTemplate;
import static org.assertj.core.api.BDDAssertions.then;
@@ -42,7 +40,6 @@ import static org.assertj.core.api.BDDAssertions.then;
/**
* @author Marcin Grzejszczak
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = RestTemplateSaganClientTests.Config.class)
@AutoConfigureStubRunner(ids = "sagan:sagan-site")
public class RestTemplateSaganClientTests {
@@ -55,7 +52,7 @@ public class RestTemplateSaganClientTests {
SaganClient client;
@Before
@BeforeEach
public void setup() {
ReleaserProperties properties = new ReleaserProperties();
properties.getGit().setOauthToken("foo");
@@ -64,14 +61,13 @@ public class RestTemplateSaganClientTests {
}
@Test
@Ignore("2 stubs point to the same endpoint")
@Disabled("2 stubs point to the same endpoint")
public void should_get_a_project() {
Project project = this.client.getProject("spring-framework");
then(project.id).isEqualTo("spring-framework");
then(project.name).isEqualTo("Spring Framework");
then(project.repoUrl)
.isEqualTo("https://github.com/spring-projects/spring-framework");
then(project.repoUrl).isEqualTo("https://github.com/spring-projects/spring-framework");
then(project.siteUrl).isEqualTo("https://projects.spring.io/spring-framework");
then(project.category).isEqualTo("active");
then(project.stackOverflowTags).isNotBlank();
@@ -80,10 +76,8 @@ public class RestTemplateSaganClientTests {
then(project.projectReleases).isNotEmpty();
Release release = project.projectReleases.get(0);
then(release.releaseStatus).isEqualTo("PRERELEASE");
then(release.refDocUrl).isEqualTo(
"http://docs.spring.io/spring/docs/5.0.0.RC4/spring-framework-reference/");
then(release.apiDocUrl)
.isEqualTo("http://docs.spring.io/spring/docs/5.0.0.RC4/javadoc-api/");
then(release.refDocUrl).isEqualTo("http://docs.spring.io/spring/docs/5.0.0.RC4/spring-framework-reference/");
then(release.apiDocUrl).isEqualTo("http://docs.spring.io/spring/docs/5.0.0.RC4/javadoc-api/");
then(release.groupId).isEqualTo("org.springframework");
then(release.artifactId).isEqualTo("spring-context");
then(release.repository.id).isEqualTo("spring-milestones");
@@ -103,10 +97,8 @@ public class RestTemplateSaganClientTests {
Release release = this.client.getRelease("spring-framework", "5.0.0.RC4");
then(release.releaseStatus).isEqualTo("PRERELEASE");
then(release.refDocUrl).isEqualTo(
"http://docs.spring.io/spring/docs/{version}/spring-framework-reference/");
then(release.apiDocUrl)
.isEqualTo("http://docs.spring.io/spring/docs/{version}/javadoc-api/");
then(release.refDocUrl).isEqualTo("http://docs.spring.io/spring/docs/{version}/spring-framework-reference/");
then(release.apiDocUrl).isEqualTo("http://docs.spring.io/spring/docs/{version}/javadoc-api/");
then(release.groupId).isEqualTo("org.springframework");
then(release.artifactId).isEqualTo("spring-context");
then(release.repository.id).isEqualTo("spring-milestones");
@@ -186,8 +178,8 @@ public class RestTemplateSaganClientTests {
sithRelease.refDocUrl = "http://docs.spring.io/spring/docs/{version}/spring-framework-reference/htmlsingle/";
sithRelease.apiDocUrl = "http://docs.spring.io/spring/docs/{version}/javadoc-api/";
List<ReleaseUpdate> updates = Arrays.asList(firstRelease, secondRelease,
thirdRelease, fourthRelease, fithRelease, sithRelease);
List<ReleaseUpdate> updates = Arrays.asList(firstRelease, secondRelease, thirdRelease, fourthRelease,
fithRelease, sithRelease);
Project project = this.client.updateRelease("spring-framework", updates);
@@ -237,8 +229,7 @@ public class RestTemplateSaganClientTests {
}
private RestTemplate restTemplate(ReleaserProperties properties) {
return new RestTemplateBuilder()
.basicAuthentication(properties.getGit().getOauthToken(), "").build();
return new RestTemplateBuilder().basicAuthentication(properties.getGit().getOauthToken(), "").build();
}
@Configuration

View File

@@ -24,8 +24,8 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentMatcher;
import org.mockito.BDDMockito;
import org.mockito.Mockito;
@@ -51,11 +51,11 @@ public class SaganUpdaterOldDocsTest {
Projects projects = new Projects();
@Before
@BeforeEach
public void setup() {
Project project = new Project();
project.projectReleases.addAll(Arrays.asList(release("1.0.0.RC1"),
release("1.1.0.BUILD-SNAPSHOT"), release("2.0.0.M4")));
project.projectReleases
.addAll(Arrays.asList(release("1.0.0.RC1"), release("1.1.0.BUILD-SNAPSHOT"), release("2.0.0.M4")));
BDDMockito.given(this.saganClient.getProject(anyString())).willReturn(project);
this.properties.getSagan().setUpdateSagan(true);
this.saganUpdater = new SaganUpdater(this.saganClient, this.properties);
@@ -72,44 +72,37 @@ public class SaganUpdaterOldDocsTest {
public void should_not_update_sagan_when_switch_is_off() {
this.properties.getSagan().setUpdateSagan(false);
this.saganUpdater.updateSagan(new File("."), "master", version("2.2.0.M1"),
version("2.2.0.M1"), projects);
this.saganUpdater.updateSagan(new File("."), "master", version("2.2.0.M1"), version("2.2.0.M1"), projects);
then(this.saganClient).shouldHaveZeroInteractions();
then(this.saganClient).shouldHaveNoInteractions();
}
@Test
public void should_update_sagan_releases_for_milestone() {
this.saganUpdater.updateSagan(new File("."), "master", version("1.0.0.M1"),
version("1.0.0.M1"), projects);
this.saganUpdater.updateSagan(new File("."), "master", version("1.0.0.M1"), version("1.0.0.M1"), projects);
then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"),
BDDMockito.argThat(withReleaseUpdate("1.0.0.M1",
"https://cloud.spring.io/spring-cloud-static/foo/{version}/",
"PRERELEASE")));
"https://cloud.spring.io/spring-cloud-static/foo/{version}/", "PRERELEASE")));
}
@Test
public void should_update_sagan_releases_for_rc() {
this.saganUpdater.updateSagan(new File("."), "master", version("1.0.0.RC1"),
version("1.0.0.RC1"), projects);
this.saganUpdater.updateSagan(new File("."), "master", version("1.0.0.RC1"), version("1.0.0.RC1"), projects);
then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"),
BDDMockito.argThat(withReleaseUpdate("1.0.0.RC1",
"https://cloud.spring.io/spring-cloud-static/foo/{version}/",
"PRERELEASE")));
"https://cloud.spring.io/spring-cloud-static/foo/{version}/", "PRERELEASE")));
}
@Test
public void should_not_update_docs_for_sagan_when_current_version_older() {
given(this.saganClient.updateRelease(BDDMockito.anyString(),
BDDMockito.anyList())).willReturn(a2_0_0_ReleaseProject());
given(this.saganClient.updateRelease(BDDMockito.anyString(), BDDMockito.anyList()))
.willReturn(a2_0_0_ReleaseProject());
this.saganUpdater.updateSagan(new File("."), "master", version("1.0.0.RC1"),
version("1.0.0.RC1"), projects);
this.saganUpdater.updateSagan(new File("."), "master", version("1.0.0.RC1"), version("1.0.0.RC1"), projects);
then(this.saganClient).should(BDDMockito.never())
.patchProject(BDDMockito.any(Project.class));
then(this.saganClient).should(BDDMockito.never()).patchProject(BDDMockito.any(Project.class));
}
@@ -123,13 +116,11 @@ public class SaganUpdaterOldDocsTest {
}
@Test
public void should_not_update_docs_for_sagan_when_files_exist_but_content_does_not_differ()
throws IOException {
public void should_not_update_docs_for_sagan_when_files_exist_but_content_does_not_differ() throws IOException {
Project project = a2_0_0_ReleaseProject();
project.rawOverview = "new overview";
project.rawBootConfig = "new boot";
given(this.saganClient.updateRelease(BDDMockito.anyString(),
BDDMockito.anyList())).willReturn(project);
given(this.saganClient.updateRelease(BDDMockito.anyString(), BDDMockito.anyList())).willReturn(project);
Path tmp = Files.createTempDirectory("releaser-test");
createFile(tmp, "sagan-index.adoc", "new overview");
@@ -141,18 +132,16 @@ public class SaganUpdaterOldDocsTest {
}
};
saganUpdater.updateSagan(new File("."), "master", version("3.0.0.RC1"),
version("3.0.0.RC1"), projects);
saganUpdater.updateSagan(new File("."), "master", version("3.0.0.RC1"), version("3.0.0.RC1"), projects);
then(this.saganClient).should(BDDMockito.never())
.patchProject(BDDMockito.any(Project.class));
then(this.saganClient).should(BDDMockito.never()).patchProject(BDDMockito.any(Project.class));
}
@Test
public void should_update_docs_for_sagan_when_current_version_newer_and_only_overview_adoc_exists()
throws IOException {
given(this.saganClient.updateRelease(BDDMockito.anyString(),
BDDMockito.anyList())).willReturn(a2_0_0_ReleaseProject());
given(this.saganClient.updateRelease(BDDMockito.anyString(), BDDMockito.anyList()))
.willReturn(a2_0_0_ReleaseProject());
Path tmp = Files.createTempDirectory("releaser-test");
createFile(tmp, "sagan-index.adoc", "new text");
@@ -163,18 +152,16 @@ public class SaganUpdaterOldDocsTest {
}
};
saganUpdater.updateSagan(new File("."), "master", version("3.0.0.RC1"),
version("3.0.0.RC1"), projects);
saganUpdater.updateSagan(new File("."), "master", version("3.0.0.RC1"), version("3.0.0.RC1"), projects);
then(this.saganClient).should().patchProject(
BDDMockito.argThat(argument -> "new text".equals(argument.rawOverview)));
then(this.saganClient).should()
.patchProject(BDDMockito.argThat(argument -> "new text".equals(argument.rawOverview)));
}
@Test
public void should_update_docs_for_sagan_when_current_version_newer_and_only_boot_adoc_exists()
throws IOException {
given(this.saganClient.updateRelease(BDDMockito.anyString(),
BDDMockito.anyList())).willReturn(a2_0_0_ReleaseProject());
public void should_update_docs_for_sagan_when_current_version_newer_and_only_boot_adoc_exists() throws IOException {
given(this.saganClient.updateRelease(BDDMockito.anyString(), BDDMockito.anyList()))
.willReturn(a2_0_0_ReleaseProject());
Path tmp = Files.createTempDirectory("releaser-test");
createFile(tmp, "sagan-boot.adoc", "new text");
@@ -185,11 +172,10 @@ public class SaganUpdaterOldDocsTest {
}
};
saganUpdater.updateSagan(new File("."), "master", version("3.0.0.RC1"),
version("3.0.0.RC1"), projects);
saganUpdater.updateSagan(new File("."), "master", version("3.0.0.RC1"), version("3.0.0.RC1"), projects);
then(this.saganClient).should().patchProject(BDDMockito
.argThat(argument -> "new text".equals(argument.rawBootConfig)));
then(this.saganClient).should()
.patchProject(BDDMockito.argThat(argument -> "new text".equals(argument.rawBootConfig)));
}
private void createFile(Path tmp, String filename, String text) throws IOException {
@@ -206,52 +192,44 @@ public class SaganUpdaterOldDocsTest {
public void should_update_sagan_from_main() {
ProjectVersion projectVersion = version("1.0.0.BUILD-SNAPSHOT");
this.saganUpdater.updateSagan(new File("."), "main", projectVersion,
projectVersion, projects);
this.saganUpdater.updateSagan(new File("."), "main", projectVersion, projectVersion, projects);
then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"),
BDDMockito.argThat(withReleaseUpdate("1.0.0.BUILD-SNAPSHOT",
"https://cloud.spring.io/foo/foo.html", "SNAPSHOT")));
then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"), BDDMockito.argThat(
withReleaseUpdate("1.0.0.BUILD-SNAPSHOT", "https://cloud.spring.io/foo/foo.html", "SNAPSHOT")));
}
@Test
public void should_update_sagan_from_release_version() {
ProjectVersion projectVersion = version("1.0.0.RELEASE");
this.saganUpdater.updateSagan(new File("."), "main", projectVersion,
projectVersion, projects);
this.saganUpdater.updateSagan(new File("."), "main", projectVersion, projectVersion, projects);
then(this.saganClient).should().deleteRelease("foo", "1.0.0.RC1");
then(this.saganClient).should().deleteRelease("foo", "1.0.0.BUILD-SNAPSHOT");
then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"),
BDDMockito.argThat(withReleaseUpdate("1.0.0.RELEASE",
"https://cloud.spring.io/spring-cloud-static/foo/{version}/",
"GENERAL_AVAILABILITY")));
"https://cloud.spring.io/spring-cloud-static/foo/{version}/", "GENERAL_AVAILABILITY")));
then(this.saganClient).should().deleteRelease("foo", "1.0.0.BUILD-SNAPSHOT");
then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"),
BDDMockito.argThat(withReleaseUpdate("1.0.1.BUILD-SNAPSHOT",
"https://cloud.spring.io/foo/foo.html", "SNAPSHOT")));
then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"), BDDMockito.argThat(
withReleaseUpdate("1.0.1.BUILD-SNAPSHOT", "https://cloud.spring.io/foo/foo.html", "SNAPSHOT")));
}
@Test
public void should_update_sagan_from_non_main() {
ProjectVersion projectVersion = version("1.1.0.BUILD-SNAPSHOT");
this.saganUpdater.updateSagan(new File("."), "1.1.x", projectVersion,
projectVersion, projects);
this.saganUpdater.updateSagan(new File("."), "1.1.x", projectVersion, projectVersion, projects);
then(this.saganClient).should(never()).deleteRelease(anyString(), anyString());
then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"),
BDDMockito.argThat(withReleaseUpdate("1.1.0.BUILD-SNAPSHOT",
"https://cloud.spring.io/foo/1.1.x/", "SNAPSHOT")));
then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"), BDDMockito
.argThat(withReleaseUpdate("1.1.0.BUILD-SNAPSHOT", "https://cloud.spring.io/foo/1.1.x/", "SNAPSHOT")));
}
private ArgumentMatcher<List<ReleaseUpdate>> withReleaseUpdate(final String version,
final String refDocUrl, final String releaseStatus) {
private ArgumentMatcher<List<ReleaseUpdate>> withReleaseUpdate(final String version, final String refDocUrl,
final String releaseStatus) {
return argument -> {
ReleaseUpdate item = argument.get(0);
return "foo".equals(item.artifactId)
&& releaseStatus.equals(item.releaseStatus)
return "foo".equals(item.artifactId) && releaseStatus.equals(item.releaseStatus)
&& version.equals(item.version) && refDocUrl.equals(item.apiDocUrl)
&& refDocUrl.equals(item.refDocUrl) && item.current;
};

View File

@@ -24,8 +24,8 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentMatcher;
import org.mockito.BDDMockito;
import org.mockito.Mockito;
@@ -51,11 +51,11 @@ public class SaganUpdaterTest {
Projects projects = new Projects();
@Before
@BeforeEach
public void setup() {
Project project = new Project();
project.projectReleases.addAll(Arrays.asList(release("2.2.0.RC1"),
release("2.3.0.BUILD-SNAPSHOT"), release("2.2.0.M4")));
project.projectReleases
.addAll(Arrays.asList(release("2.2.0.RC1"), release("2.3.0.BUILD-SNAPSHOT"), release("2.2.0.M4")));
BDDMockito.given(this.saganClient.getProject(anyString())).willReturn(project);
this.properties.getSagan().setUpdateSagan(true);
this.saganUpdater = new SaganUpdater(this.saganClient, this.properties);
@@ -72,44 +72,37 @@ public class SaganUpdaterTest {
public void should_not_update_sagan_when_switch_is_off() {
this.properties.getSagan().setUpdateSagan(false);
this.saganUpdater.updateSagan(new File("."), "master", version("2.2.0.M1"),
version("2.2.0.M1"), projects);
this.saganUpdater.updateSagan(new File("."), "master", version("2.2.0.M1"), version("2.2.0.M1"), projects);
then(this.saganClient).shouldHaveZeroInteractions();
then(this.saganClient).shouldHaveNoInteractions();
}
@Test
public void should_update_sagan_releases_for_milestone() {
this.saganUpdater.updateSagan(new File("."), "master", version("2.2.0.M1"),
version("2.2.0.M1"), projects);
this.saganUpdater.updateSagan(new File("."), "master", version("2.2.0.M1"), version("2.2.0.M1"), projects);
then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"),
BDDMockito.argThat(withReleaseUpdate("2.2.0.M1",
"https://cloud.spring.io/spring-cloud-static/foo/{version}/reference/html/",
"PRERELEASE")));
"https://cloud.spring.io/spring-cloud-static/foo/{version}/reference/html/", "PRERELEASE")));
}
@Test
public void should_update_sagan_releases_for_rc() {
this.saganUpdater.updateSagan(new File("."), "master", version("2.2.0.RC1"),
version("2.2.0.RC1"), projects);
this.saganUpdater.updateSagan(new File("."), "master", version("2.2.0.RC1"), version("2.2.0.RC1"), projects);
then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"),
BDDMockito.argThat(withReleaseUpdate("2.2.0.RC1",
"https://cloud.spring.io/spring-cloud-static/foo/{version}/reference/html/",
"PRERELEASE")));
"https://cloud.spring.io/spring-cloud-static/foo/{version}/reference/html/", "PRERELEASE")));
}
@Test
public void should_not_update_docs_for_sagan_when_current_version_older() {
given(this.saganClient.updateRelease(BDDMockito.anyString(),
BDDMockito.anyList())).willReturn(a2_0_0_ReleaseProject());
given(this.saganClient.updateRelease(BDDMockito.anyString(), BDDMockito.anyList()))
.willReturn(a2_0_0_ReleaseProject());
this.saganUpdater.updateSagan(new File("."), "master", version("2.2.0.RC1"),
version("2.2.0.RC1"), projects);
this.saganUpdater.updateSagan(new File("."), "master", version("2.2.0.RC1"), version("2.2.0.RC1"), projects);
then(this.saganClient).should(BDDMockito.never())
.patchProject(BDDMockito.any(Project.class));
then(this.saganClient).should(BDDMockito.never()).patchProject(BDDMockito.any(Project.class));
}
@@ -123,13 +116,11 @@ public class SaganUpdaterTest {
}
@Test
public void should_not_update_docs_for_sagan_when_files_exist_but_content_does_not_differ()
throws IOException {
public void should_not_update_docs_for_sagan_when_files_exist_but_content_does_not_differ() throws IOException {
Project project = a2_0_0_ReleaseProject();
project.rawOverview = "new overview";
project.rawBootConfig = "new boot";
given(this.saganClient.updateRelease(BDDMockito.anyString(),
BDDMockito.anyList())).willReturn(project);
given(this.saganClient.updateRelease(BDDMockito.anyString(), BDDMockito.anyList())).willReturn(project);
Path tmp = Files.createTempDirectory("releaser-test");
createFile(tmp, "sagan-index.adoc", "new overview");
@@ -141,18 +132,16 @@ public class SaganUpdaterTest {
}
};
saganUpdater.updateSagan(new File("."), "master", version("3.0.0.RC1"),
version("3.0.0.RC1"), projects);
saganUpdater.updateSagan(new File("."), "master", version("3.0.0.RC1"), version("3.0.0.RC1"), projects);
then(this.saganClient).should(BDDMockito.never())
.patchProject(BDDMockito.any(Project.class));
then(this.saganClient).should(BDDMockito.never()).patchProject(BDDMockito.any(Project.class));
}
@Test
public void should_update_docs_for_sagan_when_current_version_newer_and_only_overview_adoc_exists()
throws IOException {
given(this.saganClient.updateRelease(BDDMockito.anyString(),
BDDMockito.anyList())).willReturn(a2_0_0_ReleaseProject());
given(this.saganClient.updateRelease(BDDMockito.anyString(), BDDMockito.anyList()))
.willReturn(a2_0_0_ReleaseProject());
Path tmp = Files.createTempDirectory("releaser-test");
createFile(tmp, "sagan-index.adoc", "new text");
@@ -163,18 +152,16 @@ public class SaganUpdaterTest {
}
};
saganUpdater.updateSagan(new File("."), "master", version("3.0.0.RC1"),
version("3.0.0.RC1"), projects);
saganUpdater.updateSagan(new File("."), "master", version("3.0.0.RC1"), version("3.0.0.RC1"), projects);
then(this.saganClient).should().patchProject(
BDDMockito.argThat(argument -> "new text".equals(argument.rawOverview)));
then(this.saganClient).should()
.patchProject(BDDMockito.argThat(argument -> "new text".equals(argument.rawOverview)));
}
@Test
public void should_update_docs_for_sagan_when_current_version_newer_and_only_boot_adoc_exists()
throws IOException {
given(this.saganClient.updateRelease(BDDMockito.anyString(),
BDDMockito.anyList())).willReturn(a2_0_0_ReleaseProject());
public void should_update_docs_for_sagan_when_current_version_newer_and_only_boot_adoc_exists() throws IOException {
given(this.saganClient.updateRelease(BDDMockito.anyString(), BDDMockito.anyList()))
.willReturn(a2_0_0_ReleaseProject());
Path tmp = Files.createTempDirectory("releaser-test");
createFile(tmp, "sagan-boot.adoc", "new text");
@@ -185,11 +172,10 @@ public class SaganUpdaterTest {
}
};
saganUpdater.updateSagan(new File("."), "master", version("3.0.0.RC1"),
version("3.0.0.RC1"), projects);
saganUpdater.updateSagan(new File("."), "master", version("3.0.0.RC1"), version("3.0.0.RC1"), projects);
then(this.saganClient).should().patchProject(BDDMockito
.argThat(argument -> "new text".equals(argument.rawBootConfig)));
then(this.saganClient).should()
.patchProject(BDDMockito.argThat(argument -> "new text".equals(argument.rawBootConfig)));
}
private void createFile(Path tmp, String filename, String text) throws IOException {
@@ -206,20 +192,17 @@ public class SaganUpdaterTest {
public void should_update_sagan_from_main() {
ProjectVersion projectVersion = version("2.2.0.BUILD-SNAPSHOT");
this.saganUpdater.updateSagan(new File("."), "main", projectVersion,
projectVersion, projects);
this.saganUpdater.updateSagan(new File("."), "main", projectVersion, projectVersion, projects);
then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"),
BDDMockito.argThat(withReleaseUpdate("2.2.0.BUILD-SNAPSHOT",
"https://cloud.spring.io/foo/reference/html/", "SNAPSHOT")));
then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"), BDDMockito.argThat(
withReleaseUpdate("2.2.0.BUILD-SNAPSHOT", "https://cloud.spring.io/foo/reference/html/", "SNAPSHOT")));
}
@Test
public void should_update_sagan_from_release_version() {
ProjectVersion projectVersion = version("2.2.0.RELEASE");
this.saganUpdater.updateSagan(new File("."), "main", projectVersion,
projectVersion, projects);
this.saganUpdater.updateSagan(new File("."), "main", projectVersion, projectVersion, projects);
then(this.saganClient).should().deleteRelease("foo", "2.2.0.RC1");
then(this.saganClient).should().deleteRelease("foo", "2.2.0.BUILD-SNAPSHOT");
@@ -228,31 +211,27 @@ public class SaganUpdaterTest {
"https://cloud.spring.io/spring-cloud-static/foo/{version}/reference/html/",
"GENERAL_AVAILABILITY")));
then(this.saganClient).should().deleteRelease("foo", "2.2.0.BUILD-SNAPSHOT");
then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"),
BDDMockito.argThat(withReleaseUpdate("2.2.1.BUILD-SNAPSHOT",
"https://cloud.spring.io/foo/reference/html/", "SNAPSHOT")));
then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"), BDDMockito.argThat(
withReleaseUpdate("2.2.1.BUILD-SNAPSHOT", "https://cloud.spring.io/foo/reference/html/", "SNAPSHOT")));
}
@Test
public void should_update_sagan_from_non_master() {
ProjectVersion projectVersion = version("2.3.0.BUILD-SNAPSHOT");
this.saganUpdater.updateSagan(new File("."), "2.3.x", projectVersion,
projectVersion, projects);
this.saganUpdater.updateSagan(new File("."), "2.3.x", projectVersion, projectVersion, projects);
then(this.saganClient).should(never()).deleteRelease(anyString(), anyString());
then(this.saganClient).should().updateRelease(BDDMockito.eq("foo"),
BDDMockito.argThat(withReleaseUpdate("2.3.0.BUILD-SNAPSHOT",
"https://cloud.spring.io/foo/2.3.x/reference/html/",
"SNAPSHOT")));
"https://cloud.spring.io/foo/2.3.x/reference/html/", "SNAPSHOT")));
}
private ArgumentMatcher<List<ReleaseUpdate>> withReleaseUpdate(final String version,
final String refDocUrl, final String releaseStatus) {
private ArgumentMatcher<List<ReleaseUpdate>> withReleaseUpdate(final String version, final String refDocUrl,
final String releaseStatus) {
return argument -> {
ReleaseUpdate item = argument.get(0);
return "foo".equals(item.artifactId)
&& releaseStatus.equals(item.releaseStatus)
return "foo".equals(item.artifactId) && releaseStatus.equals(item.releaseStatus)
&& version.equals(item.version) && refDocUrl.equals(item.apiDocUrl)
&& refDocUrl.equals(item.refDocUrl) && item.current;
};

View File

@@ -22,7 +22,7 @@ import java.nio.file.Files;
import java.util.Collections;
import java.util.HashSet;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import releaser.SpringCloudReleaserProperties;
import releaser.internal.ReleaserProperties;
import releaser.internal.github.ProjectGitHubHandler;
@@ -38,8 +38,7 @@ public class TemplateGeneratorTests {
ReleaserProperties props = SpringCloudReleaserProperties.get();
ProjectGitHubHandler handler = new ProjectGitHubHandler(this.props,
Collections.emptyList()) {
ProjectGitHubHandler handler = new ProjectGitHubHandler(this.props, Collections.emptyList()) {
@Override
public String milestoneUrl(ProjectVersion releaseVersion) {
if (releaseVersion.projectName.equals("spring-cloud-foo")) {
@@ -53,8 +52,7 @@ public class TemplateGeneratorTests {
public void should_generate_email_from_template_for_tag_with_v_prefix() {
this.props.getPom().setBranch("vDalston.RELEASE");
File generatedMail = new TemplateGenerator(this.props, this.handler)
.email(new Projects());
File generatedMail = new TemplateGenerator(this.props, this.handler).email(new Projects());
then(generatedMail).hasContent(expectedEmail());
}
@@ -63,9 +61,8 @@ public class TemplateGeneratorTests {
public void should_generate_email_from_template_when_output_folder_is_missing() {
this.props.getPom().setBranch("vDalston.RELEASE");
File generatedMail = new TemplateGenerator(this.props,
new File("target/foo/bar/baz/template.txt"), this.handler)
.email(new Projects());
File generatedMail = new TemplateGenerator(this.props, new File("target/foo/bar/baz/template.txt"),
this.handler).email(new Projects());
then(generatedMail).hasContent(expectedEmail());
}
@@ -74,8 +71,7 @@ public class TemplateGeneratorTests {
public void should_generate_email_from_template_for_tag_without_v_prefix() {
this.props.getPom().setBranch("Dalston.RELEASE");
File generatedMail = new TemplateGenerator(this.props, this.handler)
.email(new Projects());
File generatedMail = new TemplateGenerator(this.props, this.handler).email(new Projects());
then(generatedMail).hasContent(expectedEmail());
}
@@ -84,8 +80,7 @@ public class TemplateGeneratorTests {
public void should_generate_tweet_from_template_for_tag_with_v_prefix() {
this.props.getPom().setBranch("vDalston.RELEASE");
File generatedTweet = new TemplateGenerator(this.props, this.handler)
.tweet(new Projects());
File generatedTweet = new TemplateGenerator(this.props, this.handler).tweet(new Projects());
then(generatedTweet).hasContent(expectedTweet());
}
@@ -94,15 +89,13 @@ public class TemplateGeneratorTests {
public void should_generate_tweet_from_template_for_tag_without_v_prefix() {
this.props.getPom().setBranch("Dalston.RELEASE");
File generatedTweet = new TemplateGenerator(this.props, this.handler)
.tweet(new Projects());
File generatedTweet = new TemplateGenerator(this.props, this.handler).tweet(new Projects());
then(generatedTweet).hasContent(expectedTweet());
}
@Test
public void should_generate_blog_from_template_for_tag_with_v_prefix_release()
throws IOException {
public void should_generate_blog_from_template_for_tag_with_v_prefix_release() throws IOException {
this.props.getPom().setBranch("vDalston.RELEASE");
Projects projects = new Projects(new HashSet<ProjectVersion>() {
{
@@ -112,23 +105,18 @@ public class TemplateGeneratorTests {
}
});
File generatedBlog = new TemplateGenerator(this.props, this.handler)
.blog(projects);
File generatedBlog = new TemplateGenerator(this.props, this.handler).blog(projects);
then(content(generatedBlog))
.contains("General Availability (RELEASE) of the [Spring Cloud Dalston]")
.contains("The release can be found in [Maven Central]")
.contains("### Spring Cloud Sleuth")
.contains(
"| Spring Cloud Sleuth | 1.0.0.RELEASE | ([issues](https://foo.bar.com))")
then(content(generatedBlog)).contains("General Availability (RELEASE) of the [Spring Cloud Dalston]")
.contains("The release can be found in [Maven Central]").contains("### Spring Cloud Sleuth")
.contains("| Spring Cloud Sleuth | 1.0.0.RELEASE | ([issues](https://foo.bar.com))")
.contains("| Spring Cloud Foo | 1.0.2.RELEASE | &nbsp;")
.contains("<version>Dalston.RELEASE</version>").contains(
"mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Dalston.RELEASE'");
.contains("<version>Dalston.RELEASE</version>")
.contains("mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Dalston.RELEASE'");
}
@Test
public void should_generate_blog_from_template_for_tag_without_v_prefix_release()
throws IOException {
public void should_generate_blog_from_template_for_tag_without_v_prefix_release() throws IOException {
this.props.getPom().setBranch("Dalston.RELEASE");
Projects projects = new Projects(new HashSet<ProjectVersion>() {
{
@@ -137,22 +125,17 @@ public class TemplateGeneratorTests {
}
});
File generatedBlog = new TemplateGenerator(this.props, this.handler)
.blog(projects);
File generatedBlog = new TemplateGenerator(this.props, this.handler).blog(projects);
then(content(generatedBlog))
.contains("General Availability (RELEASE) of the [Spring Cloud Dalston]")
.contains("The release can be found in [Maven Central]")
.contains("### Spring Cloud Sleuth")
.contains(
"| Spring Cloud Sleuth | 1.0.0.RELEASE | ([issues](https://foo.bar.com))")
.contains("<version>Dalston.RELEASE</version>").contains(
"mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Dalston.RELEASE'");
then(content(generatedBlog)).contains("General Availability (RELEASE) of the [Spring Cloud Dalston]")
.contains("The release can be found in [Maven Central]").contains("### Spring Cloud Sleuth")
.contains("| Spring Cloud Sleuth | 1.0.0.RELEASE | ([issues](https://foo.bar.com))")
.contains("<version>Dalston.RELEASE</version>")
.contains("mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Dalston.RELEASE'");
}
@Test
public void should_generate_blog_from_template_for_tag_without_v_prefix_release_using_calver()
throws IOException {
public void should_generate_blog_from_template_for_tag_without_v_prefix_release_using_calver() throws IOException {
this.props.getPom().setBranch("2020.0.5");
Projects projects = new Projects(new HashSet<ProjectVersion>() {
{
@@ -161,22 +144,17 @@ public class TemplateGeneratorTests {
}
});
File generatedBlog = new TemplateGenerator(this.props, this.handler)
.blog(projects);
File generatedBlog = new TemplateGenerator(this.props, this.handler).blog(projects);
then(content(generatedBlog))
.contains("General Availability (RELEASE) of the [Spring Cloud 2020.0.5]")
.contains("The release can be found in [Maven Central]")
.contains("### Spring Cloud Sleuth")
.contains(
"| Spring Cloud Sleuth | 1.0.0 | ([issues](https://foo.bar.com))")
.contains("<version>2020.0.5</version>").contains(
"mavenBom 'org.springframework.cloud:spring-cloud-dependencies:2020.0.5'");
then(content(generatedBlog)).contains("General Availability (RELEASE) of the [Spring Cloud 2020.0.5]")
.contains("The release can be found in [Maven Central]").contains("### Spring Cloud Sleuth")
.contains("| Spring Cloud Sleuth | 1.0.0 | ([issues](https://foo.bar.com))")
.contains("<version>2020.0.5</version>")
.contains("mavenBom 'org.springframework.cloud:spring-cloud-dependencies:2020.0.5'");
}
@Test
public void should_generate_sr_blog_from_template_for_tag_with_v_prefix_release()
throws IOException {
public void should_generate_sr_blog_from_template_for_tag_with_v_prefix_release() throws IOException {
this.props.getPom().setBranch("vDalston.SR1");
Projects projects = new Projects(new HashSet<ProjectVersion>() {
{
@@ -185,22 +163,17 @@ public class TemplateGeneratorTests {
}
});
File generatedBlog = new TemplateGenerator(this.props, this.handler)
.blog(projects);
File generatedBlog = new TemplateGenerator(this.props, this.handler).blog(projects);
then(content(generatedBlog))
.contains("Service Release 1 (SR1) of the [Spring Cloud Dalston]")
.contains("The release can be found in [Maven Central]")
.contains("### Spring Cloud Sleuth")
.contains(
"| Spring Cloud Sleuth | 1.0.0.RELEASE | ([issues](https://foo.bar.com))")
.contains("<version>Dalston.SR1</version>").contains(
"mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Dalston.SR1'");
then(content(generatedBlog)).contains("Service Release 1 (SR1) of the [Spring Cloud Dalston]")
.contains("The release can be found in [Maven Central]").contains("### Spring Cloud Sleuth")
.contains("| Spring Cloud Sleuth | 1.0.0.RELEASE | ([issues](https://foo.bar.com))")
.contains("<version>Dalston.SR1</version>")
.contains("mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Dalston.SR1'");
}
@Test
public void should_generate_sr_blog_from_template_for_tag_without_v_prefix_release()
throws IOException {
public void should_generate_sr_blog_from_template_for_tag_without_v_prefix_release() throws IOException {
this.props.getPom().setBranch("Dalston.SR1");
Projects projects = new Projects(new HashSet<ProjectVersion>() {
{
@@ -209,22 +182,17 @@ public class TemplateGeneratorTests {
}
});
File generatedBlog = new TemplateGenerator(this.props, this.handler)
.blog(projects);
File generatedBlog = new TemplateGenerator(this.props, this.handler).blog(projects);
then(content(generatedBlog))
.contains("Service Release 1 (SR1) of the [Spring Cloud Dalston]")
.contains("The release can be found in [Maven Central]")
.contains("### Spring Cloud Sleuth")
.contains(
"| Spring Cloud Sleuth | 1.0.0.RELEASE | ([issues](https://foo.bar.com))")
.contains("<version>Dalston.SR1</version>").contains(
"mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Dalston.SR1'");
then(content(generatedBlog)).contains("Service Release 1 (SR1) of the [Spring Cloud Dalston]")
.contains("The release can be found in [Maven Central]").contains("### Spring Cloud Sleuth")
.contains("| Spring Cloud Sleuth | 1.0.0.RELEASE | ([issues](https://foo.bar.com))")
.contains("<version>Dalston.SR1</version>")
.contains("mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Dalston.SR1'");
}
@Test
public void should_generate_milestone_blog_from_template_for_tag_with_v_prefix_release()
throws IOException {
public void should_generate_milestone_blog_from_template_for_tag_with_v_prefix_release() throws IOException {
this.props.getPom().setBranch("vDalston.M1");
Projects projects = new Projects(new HashSet<ProjectVersion>() {
{
@@ -233,24 +201,18 @@ public class TemplateGeneratorTests {
}
});
File generatedBlog = new TemplateGenerator(this.props, this.handler)
.blog(projects);
File generatedBlog = new TemplateGenerator(this.props, this.handler).blog(projects);
then(content(generatedBlog))
.contains("Milestone 1 (M1) of the [Spring Cloud Dalston]")
.contains("The release can be found in [Spring Milestone]")
.contains("### Spring Cloud Sleuth")
.contains(
"| Spring Cloud Sleuth | 1.0.0.M1 | ([issues](https://foo.bar.com))")
.contains("<id>spring-milestones</id>")
.contains("url 'https://repo.spring.io/milestone'")
.contains("<version>Dalston.M1</version>").contains(
"mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Dalston.M1'");
then(content(generatedBlog)).contains("Milestone 1 (M1) of the [Spring Cloud Dalston]")
.contains("The release can be found in [Spring Milestone]").contains("### Spring Cloud Sleuth")
.contains("| Spring Cloud Sleuth | 1.0.0.M1 | ([issues](https://foo.bar.com))")
.contains("<id>spring-milestones</id>").contains("url 'https://repo.spring.io/milestone'")
.contains("<version>Dalston.M1</version>")
.contains("mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Dalston.M1'");
}
@Test
public void should_generate_milestone_blog_from_template_for_tag_without_v_prefix_release()
throws IOException {
public void should_generate_milestone_blog_from_template_for_tag_without_v_prefix_release() throws IOException {
this.props.getPom().setBranch("Dalston.M1");
Projects projects = new Projects(new HashSet<ProjectVersion>() {
{
@@ -259,19 +221,14 @@ public class TemplateGeneratorTests {
}
});
File generatedBlog = new TemplateGenerator(this.props, this.handler)
.blog(projects);
File generatedBlog = new TemplateGenerator(this.props, this.handler).blog(projects);
then(content(generatedBlog))
.contains("Milestone 1 (M1) of the [Spring Cloud Dalston]")
.contains("The release can be found in [Spring Milestone]")
.contains("### Spring Cloud Sleuth")
.contains(
"| Spring Cloud Sleuth | 1.0.0.M1 | ([issues](https://foo.bar.com))")
.contains("<id>spring-milestones</id>")
.contains("url 'https://repo.spring.io/milestone'")
.contains("<version>Dalston.M1</version>").contains(
"mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Dalston.M1'");
then(content(generatedBlog)).contains("Milestone 1 (M1) of the [Spring Cloud Dalston]")
.contains("The release can be found in [Spring Milestone]").contains("### Spring Cloud Sleuth")
.contains("| Spring Cloud Sleuth | 1.0.0.M1 | ([issues](https://foo.bar.com))")
.contains("<id>spring-milestones</id>").contains("url 'https://repo.spring.io/milestone'")
.contains("<version>Dalston.M1</version>")
.contains("mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Dalston.M1'");
}
@Test
@@ -285,24 +242,18 @@ public class TemplateGeneratorTests {
}
});
File generatedBlog = new TemplateGenerator(this.props, this.handler)
.blog(projects);
File generatedBlog = new TemplateGenerator(this.props, this.handler).blog(projects);
then(content(generatedBlog))
.contains("Milestone 1 (M1) of the [Spring Cloud 2020.0.0]")
.contains("The release can be found in [Spring Milestone]")
.contains("### Spring Cloud Sleuth")
.contains(
"| Spring Cloud Sleuth | 1.0.0-M1 | ([issues](https://foo.bar.com))")
.contains("<id>spring-milestones</id>")
.contains("url 'https://repo.spring.io/milestone'")
.contains("<version>2020.0.0-M1</version>").contains(
"mavenBom 'org.springframework.cloud:spring-cloud-dependencies:2020.0.0-M1'");
then(content(generatedBlog)).contains("Milestone 1 (M1) of the [Spring Cloud 2020.0.0]")
.contains("The release can be found in [Spring Milestone]").contains("### Spring Cloud Sleuth")
.contains("| Spring Cloud Sleuth | 1.0.0-M1 | ([issues](https://foo.bar.com))")
.contains("<id>spring-milestones</id>").contains("url 'https://repo.spring.io/milestone'")
.contains("<version>2020.0.0-M1</version>")
.contains("mavenBom 'org.springframework.cloud:spring-cloud-dependencies:2020.0.0-M1'");
}
@Test
public void should_generate_rc_blog_from_template_for_tag_with_v_prefix_release()
throws IOException {
public void should_generate_rc_blog_from_template_for_tag_with_v_prefix_release() throws IOException {
this.props.getPom().setBranch("vDalston.RC1");
Projects projects = new Projects(new HashSet<ProjectVersion>() {
{
@@ -311,24 +262,18 @@ public class TemplateGeneratorTests {
}
});
File generatedBlog = new TemplateGenerator(this.props, this.handler)
.blog(projects);
File generatedBlog = new TemplateGenerator(this.props, this.handler).blog(projects);
then(content(generatedBlog))
.contains("Release Candidate 1 (RC1) of the [Spring Cloud Dalston]")
.contains("The release can be found in [Spring Milestone]")
.contains("### Spring Cloud Sleuth")
.contains(
"| Spring Cloud Sleuth | 1.0.0.RC1 | ([issues](https://foo.bar.com))")
.contains("<id>spring-milestones</id>")
.contains("url 'https://repo.spring.io/milestone'")
.contains("<version>Dalston.RC1</version>").contains(
"mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Dalston.RC1'");
then(content(generatedBlog)).contains("Release Candidate 1 (RC1) of the [Spring Cloud Dalston]")
.contains("The release can be found in [Spring Milestone]").contains("### Spring Cloud Sleuth")
.contains("| Spring Cloud Sleuth | 1.0.0.RC1 | ([issues](https://foo.bar.com))")
.contains("<id>spring-milestones</id>").contains("url 'https://repo.spring.io/milestone'")
.contains("<version>Dalston.RC1</version>")
.contains("mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Dalston.RC1'");
}
@Test
public void should_generate_rc_blog_from_template_for_tag_without_v_prefix_release()
throws IOException {
public void should_generate_rc_blog_from_template_for_tag_without_v_prefix_release() throws IOException {
this.props.getPom().setBranch("Dalston.RC1");
Projects projects = new Projects(new HashSet<ProjectVersion>() {
{
@@ -337,24 +282,18 @@ public class TemplateGeneratorTests {
}
});
File generatedBlog = new TemplateGenerator(this.props, this.handler)
.blog(projects);
File generatedBlog = new TemplateGenerator(this.props, this.handler).blog(projects);
then(content(generatedBlog))
.contains("Release Candidate 1 (RC1) of the [Spring Cloud Dalston]")
.contains("The release can be found in [Spring Milestone]")
.contains("### Spring Cloud Sleuth")
.contains(
"| Spring Cloud Sleuth | 1.0.0.RC1 | ([issues](https://foo.bar.com))")
.contains("<id>spring-milestones</id>")
.contains("url 'https://repo.spring.io/milestone'")
.contains("<version>Dalston.RC1</version>").contains(
"mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Dalston.RC1'");
then(content(generatedBlog)).contains("Release Candidate 1 (RC1) of the [Spring Cloud Dalston]")
.contains("The release can be found in [Spring Milestone]").contains("### Spring Cloud Sleuth")
.contains("| Spring Cloud Sleuth | 1.0.0.RC1 | ([issues](https://foo.bar.com))")
.contains("<id>spring-milestones</id>").contains("url 'https://repo.spring.io/milestone'")
.contains("<version>Dalston.RC1</version>")
.contains("mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Dalston.RC1'");
}
@Test
public void should_generate_rc_blog_from_template_for_tag_without_v_prefix_release_calver()
throws IOException {
public void should_generate_rc_blog_from_template_for_tag_without_v_prefix_release_calver() throws IOException {
this.props.getPom().setBranch("2020.0.0-RC1");
Projects projects = new Projects(new HashSet<ProjectVersion>() {
{
@@ -363,26 +302,19 @@ public class TemplateGeneratorTests {
}
});
File generatedBlog = new TemplateGenerator(this.props, this.handler)
.blog(projects);
File generatedBlog = new TemplateGenerator(this.props, this.handler).blog(projects);
then(content(generatedBlog))
.contains("Release Candidate 1 (RC1) of the [Spring Cloud 2020.0.0]")
.contains("The release can be found in [Spring Milestone]")
.contains("### Spring Cloud Sleuth")
.contains(
"| Spring Cloud Sleuth | 1.0.0-RC1 | ([issues](https://foo.bar.com))")
.contains("<id>spring-milestones</id>")
.contains("url 'https://repo.spring.io/milestone'")
.contains("<version>2020.0.0-RC1</version>").contains(
"mavenBom 'org.springframework.cloud:spring-cloud-dependencies:2020.0.0-RC1'");
then(content(generatedBlog)).contains("Release Candidate 1 (RC1) of the [Spring Cloud 2020.0.0]")
.contains("The release can be found in [Spring Milestone]").contains("### Spring Cloud Sleuth")
.contains("| Spring Cloud Sleuth | 1.0.0-RC1 | ([issues](https://foo.bar.com))")
.contains("<id>spring-milestones</id>").contains("url 'https://repo.spring.io/milestone'")
.contains("<version>2020.0.0-RC1</version>")
.contains("mavenBom 'org.springframework.cloud:spring-cloud-dependencies:2020.0.0-RC1'");
}
@Test
public void should_generate_release_notes_template_when_url_exists()
throws IOException {
ProjectGitHubHandler handler = new ProjectGitHubHandler(this.props,
Collections.emptyList()) {
public void should_generate_release_notes_template_when_url_exists() throws IOException {
ProjectGitHubHandler handler = new ProjectGitHubHandler(this.props, Collections.emptyList()) {
@Override
public String milestoneUrl(ProjectVersion releaseVersion) {
return "https://foo.bar.com?closed=1";
@@ -397,13 +329,11 @@ public class TemplateGeneratorTests {
}
});
File generatedOutput = new TemplateGenerator(this.props, handler)
.releaseNotes(projects);
File generatedOutput = new TemplateGenerator(this.props, handler).releaseNotes(projects);
then(content(generatedOutput)).contains("# Dalston.RC1").contains(
"Spring Cloud Sleuth `1.0.0.RC1` ([issues](https://foo.bar.com?closed=1))")
.contains(
"Spring Cloud Consul `1.0.1.RC1` ([issues](https://foo.bar.com?closed=1))")
then(content(generatedOutput)).contains("# Dalston.RC1")
.contains("Spring Cloud Sleuth `1.0.0.RC1` ([issues](https://foo.bar.com?closed=1))")
.contains("Spring Cloud Consul `1.0.1.RC1` ([issues](https://foo.bar.com?closed=1))")
.doesNotContain("Boot");
}
@@ -412,8 +342,7 @@ public class TemplateGeneratorTests {
}
private String expectedEmail() {
return "Title:\n" + "Spring Cloud Dalston.RELEASE available\n\n" + "Content:\n"
+ "All,\n" + "\n"
return "Title:\n" + "Spring Cloud Dalston.RELEASE available\n\n" + "Content:\n" + "All,\n" + "\n"
+ "On behalf of the team and the community, I'm excited to announce Spring Cloud Dalston RELEASE Train release.\n"
+ "\n" + "link to blog post\n" + "link to twitter\n\n" + "Cheers,\n";
}

View File

@@ -49,17 +49,13 @@ class VersionsFromBomFetcherTests {
}
@Test
void should_return_false_when_current_version_is_not_present_in_the_bom()
throws URISyntaxException {
ProjectVersion projectVersion = new ProjectVersion("spring-cloud-non-existant",
"1.0.0.RELEASE");
URI initilizrUri = VersionsFromBomFetcherTests.class
.getResource("/raw/initializr.yml").toURI();
void should_return_false_when_current_version_is_not_present_in_the_bom() throws URISyntaxException {
ProjectVersion projectVersion = new ProjectVersion("spring-cloud-non-existant", "1.0.0.RELEASE");
URI initilizrUri = VersionsFromBomFetcherTests.class.getResource("/raw/initializr.yml").toURI();
ReleaserProperties properties = new ReleaserProperties();
properties.getGit().setUpdateSpringGuides(true);
properties.getVersions().setAllVersionsFileUrl(initilizrUri.toString());
properties.getGit().setReleaseTrainBomUrl(
file("/projects/spring-cloud-release/").toURI().toString());
properties.getGit().setReleaseTrainBomUrl(file("/projects/spring-cloud-release/").toURI().toString());
ProjectPomUpdater updater = new ProjectPomUpdater(properties, new ArrayList<>());
VersionsFetcher versionsFetcher = new VersionsFetcher(properties, updater);
@@ -70,8 +66,7 @@ class VersionsFromBomFetcherTests {
@Test
void should_return_false_when_current_version_is_not_ga() {
ProjectVersion projectVersion = new ProjectVersion("spring-cloud-contract",
"1.0.0.BUILD-SNAPSHOT");
ProjectVersion projectVersion = new ProjectVersion("spring-cloud-contract", "1.0.0.BUILD-SNAPSHOT");
ReleaserProperties properties = new ReleaserProperties();
properties.getGit().setUpdateSpringGuides(true);
ProjectPomUpdater updater = new ProjectPomUpdater(properties, new ArrayList<>());
@@ -84,15 +79,13 @@ class VersionsFromBomFetcherTests {
@Test
void should_return_false_when_exception_occurs_while_fetching_version_info() {
ProjectVersion projectVersion = new ProjectVersion("spring-cloud-contract",
"1.0.0.BUILD-SNAPSHOT");
ProjectVersion projectVersion = new ProjectVersion("spring-cloud-contract", "1.0.0.BUILD-SNAPSHOT");
ReleaserProperties properties = new ReleaserProperties();
properties.getGit().setUpdateSpringGuides(true);
VersionsFetcher versionsFetcher = new VersionsFetcher(properties,
new ProjectPomUpdater(properties, new ArrayList<>()) {
@Override
public Projects retrieveVersionsFromReleaseTrainBom(String branch,
boolean updateFixedVersions) {
public Projects retrieveVersionsFromReleaseTrainBom(String branch, boolean updateFixedVersions) {
throw new IllegalStateException("BOOM!");
}
});
@@ -103,8 +96,7 @@ class VersionsFromBomFetcherTests {
}
private File localFile(String relativePath) throws URISyntaxException {
return new File(
VersionsFromBomFetcherTests.class.getResource(relativePath).toURI());
return new File(VersionsFromBomFetcherTests.class.getResource(relativePath).toURI());
}
private File file(String relativePath) {

View File

@@ -16,7 +16,7 @@
package demo;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;

View File

@@ -16,7 +16,7 @@
package demo;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;

View File

@@ -16,7 +16,7 @@
package demo;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;

Some files were not shown because too many files have changed in this diff Show More