From 8dfaa014e2ecfe737bb3f4cde454af742be6b0fe Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Thu, 30 Apr 2020 13:09:48 +0200 Subject: [PATCH] #144 - Adapt to new versioning scheme. Remove Calver type as the version scheme can be already represented using the Version type. Adopt ticket/milestone creation, Sagan versioning and Git tags to new scheme. --- .../data/release/build/MavenBuildSystem.java | 32 ++- .../data/release/build/PomUpdater.java | 4 + .../data/release/build/UpdateInformation.java | 40 +++- .../data/release/cli/ReleaseCommands.java | 2 +- .../data/release/git/GitOperations.java | 6 + .../data/release/git/VersionTags.java | 15 +- .../data/release/issues/Tickets.java | 4 +- .../data/release/issues/github/GitHub.java | 2 +- .../issues/github/GitHubMilestone.java | 2 +- .../data/release/issues/jira/Jira.java | 15 +- .../data/release/issues/jira/JiraVersion.java | 2 +- .../data/release/model/ArtifactVersion.java | 85 +++++-- .../data/release/model/Calver.java | 219 ------------------ .../data/release/model/Iteration.java | 2 + .../data/release/model/IterationVersion.java | 3 + .../data/release/model/ModuleIteration.java | 34 ++- .../data/release/model/Projects.java | 4 +- .../data/release/model/ReleaseTrains.java | 11 +- .../data/release/model/Tracker.java | 2 +- .../data/release/model/Train.java | 19 +- .../data/release/model/TrainIteration.java | 51 +++- .../data/release/sagan/MaintainedVersion.java | 3 +- .../data/release/sagan/ProjectMetadata.java | 24 +- .../release/build/MavenIntegrationTests.java | 5 - .../GitHubIssueTrackerIntegrationTests.java | 8 +- .../github/GithubMilestoneUnitTests.java | 18 +- .../jira/JiraConnectorIntegrationTests.java | 12 +- .../issues/jira/JiraVersionUnitTests.java | 20 +- .../release/issues/jira/TicketsUnitTests.java | 23 ++ .../model/ArtifactVersionUnitTests.java | 24 +- .../release/model/CalverVersionUnitTests.java | 78 ------- .../release/model/SimpleIterationVersion.java | 9 + .../SaganOperationsIntegrationTests.java | 2 +- 33 files changed, 384 insertions(+), 396 deletions(-) delete mode 100644 release-tools/src/main/java/org/springframework/data/release/model/Calver.java delete mode 100644 release-tools/src/test/java/org/springframework/data/release/model/CalverVersionUnitTests.java diff --git a/release-tools/src/main/java/org/springframework/data/release/build/MavenBuildSystem.java b/release-tools/src/main/java/org/springframework/data/release/build/MavenBuildSystem.java index 11d020d..be1d075 100644 --- a/release-tools/src/main/java/org/springframework/data/release/build/MavenBuildSystem.java +++ b/release-tools/src/main/java/org/springframework/data/release/build/MavenBuildSystem.java @@ -79,9 +79,13 @@ class MavenBuildSystem implements BuildSystem { if (updater.isBuildProject()) { - updateBom(information); + updateBom(information, "bom/pom.xml", BUILD); updateParentPom(information); + } else if (updater.isBomProject()) { + + updateBom(information, "pom.xml", BOM); + } else { execute(workspace.getFile(POM_XML, updater.getProject()), pom -> { @@ -134,23 +138,23 @@ class MavenBuildSystem implements BuildSystem { return module; } - private void updateBom(UpdateInformation updateInformation) { + private void updateBom(UpdateInformation updateInformation, String file, Project project) { TrainIteration iteration = updateInformation.getTrain(); logger.log(BUILD, "Updating BOM pom.xml…"); - execute(workspace.getFile("bom/pom.xml", BUILD), pom -> { + execute(workspace.getFile(file, project), pom -> { - for (ModuleIteration module : iteration.getModulesExcept(BUILD)) { + for (ModuleIteration module : iteration.getModulesExcept(BUILD, BOM)) { ArtifactVersion version = updateInformation.getProjectVersionToSet(module.getProject()); - logger.log(BUILD, "%s", module); + logger.log(project, "%s", module); String moduleArtifactId = new MavenArtifact(module).getArtifactId(); pom.setDependencyManagementVersion(moduleArtifactId, version); - logger.log(BUILD, "Updated managed dependency version for %s to %s!", moduleArtifactId, version); + logger.log(project, "Updated managed dependency version for %s to %s!", moduleArtifactId, version); module.getProject().doWithAdditionalArtifacts(additionalArtifact -> { @@ -159,9 +163,9 @@ class MavenBuildSystem implements BuildSystem { if (artifact != null) { pom.setDependencyManagementVersion(artifactId, version); - logger.log(BUILD, "Updated managed dependency version for %s to %s!", artifactId, version); + logger.log(project, "Updated managed dependency version for %s to %s!", artifactId, version); } else { - logger.log(BUILD, "Artifact %s not found, skipping update!", artifactId); + logger.log(project, "Artifact %s not found, skipping update!", artifactId); } }); } @@ -220,7 +224,7 @@ class MavenBuildSystem implements BuildSystem { if (BUILD.equals(project)) { - mvn.execute(project, goals.and(arg("newVersion").withValue(information.getReleaseTrainVersion())) // + mvn.execute(project, goals.and(arg("newVersion").withValue(information.getReleaseTrainNameVersion())) // .and(arg("generateBackupPoms").withValue("false")) // .and(arg("groupId").withValue("org.springframework.data")) // .and(arg("artifactId").withValue("spring-data-releasetrain"))); @@ -228,6 +232,16 @@ class MavenBuildSystem implements BuildSystem { mvn.execute(project, CommandLine.of(Goal.INSTALL)); } + if (BOM.equals(project)) { + + mvn.execute(project, goals.and(arg("newVersion").withValue(information.getReleaseTrainVersion())) // + .and(arg("generateBackupPoms").withValue("false")) // + .and(arg("groupId").withValue("org.springframework.data")) // + .and(arg("artifactId").withValue("spring-data-bom"))); + + mvn.execute(project, CommandLine.of(Goal.INSTALL)); + } + return module; } diff --git a/release-tools/src/main/java/org/springframework/data/release/build/PomUpdater.java b/release-tools/src/main/java/org/springframework/data/release/build/PomUpdater.java index 598571e..c17e0ff 100644 --- a/release-tools/src/main/java/org/springframework/data/release/build/PomUpdater.java +++ b/release-tools/src/main/java/org/springframework/data/release/build/PomUpdater.java @@ -40,6 +40,10 @@ class PomUpdater { return BUILD.equals(project); } + public boolean isBomProject() { + return BOM.equals(project); + } + public void updateArtifactVersion(Pom pom) { ArtifactVersion version = information.getProjectVersionToSet(project); diff --git a/release-tools/src/main/java/org/springframework/data/release/build/UpdateInformation.java b/release-tools/src/main/java/org/springframework/data/release/build/UpdateInformation.java index 68279de..a6ac6c2 100644 --- a/release-tools/src/main/java/org/springframework/data/release/build/UpdateInformation.java +++ b/release-tools/src/main/java/org/springframework/data/release/build/UpdateInformation.java @@ -22,7 +22,6 @@ import lombok.NonNull; import lombok.RequiredArgsConstructor; import org.springframework.data.release.model.ArtifactVersion; -import org.springframework.data.release.model.Iteration; import org.springframework.data.release.model.Phase; import org.springframework.data.release.model.Project; import org.springframework.data.release.model.TrainIteration; @@ -98,17 +97,46 @@ public class UpdateInformation { * * @return will never be {@literal null}. */ - public String getReleaseTrainVersion() { + public String getReleaseTrainNameVersion() { - String version = train.getTrain().getName(); + boolean usesCalver = train.getTrain().usesCalver(); switch (phase) { case PREPARE: - Iteration iteration = train.getIteration(); - return String.format("%s-%s", version, iteration.isGAIteration() ? "RELEASE" : iteration.getName()); + return train.getReleaseTrainNameAndVersion(); case CLEANUP: case MAINTENANCE: - return version.concat("-BUILD-SNAPSHOT"); + + if (usesCalver) { + return String.format("%s-SNAPSHOT", train.getNextBugfixName()); + } + + return String.format("%s-BUILD-SNAPSHOT", train.getName()); + } + + throw new IllegalStateException("Unexpected phase detected " + phase + " detected!"); + } + + /** + * Returns the version {@link String} to be used to describe the release train. + * + * @return will never be {@literal null}. + */ + public String getReleaseTrainVersion() { + + boolean usesCalver = train.getTrain().usesCalver(); + + switch (phase) { + case PREPARE: + return train.getReleaseTrainNameAndVersion(); + case CLEANUP: + case MAINTENANCE: + + if (usesCalver) { + return String.format("%s-SNAPSHOT", train.getNextBugfixName()); + } + + return String.format("%s-BUILD-SNAPSHOT", train.getName()); } throw new IllegalStateException("Unexpected phase detected " + phase + " detected!"); diff --git a/release-tools/src/main/java/org/springframework/data/release/cli/ReleaseCommands.java b/release-tools/src/main/java/org/springframework/data/release/cli/ReleaseCommands.java index c8dabe2..2d387a1 100644 --- a/release-tools/src/main/java/org/springframework/data/release/cli/ReleaseCommands.java +++ b/release-tools/src/main/java/org/springframework/data/release/cli/ReleaseCommands.java @@ -73,7 +73,7 @@ class ReleaseCommands extends TimedCommand { git.prepare(iteration); - build.runPreReleaseChecks(iteration); + // build.runPreReleaseChecks(iteration); misc.prepareChangelogs(iteration); misc.updateResources(iteration); diff --git a/release-tools/src/main/java/org/springframework/data/release/git/GitOperations.java b/release-tools/src/main/java/org/springframework/data/release/git/GitOperations.java index 63d456f..86eb625 100644 --- a/release-tools/src/main/java/org/springframework/data/release/git/GitOperations.java +++ b/release-tools/src/main/java/org/springframework/data/release/git/GitOperations.java @@ -627,6 +627,12 @@ public class GitOperations { } logger.log(project, "git cp %s", id.getName()); + + // Required as the CherryPick command has no setter for a CredentialsProvide *sigh* + if (gpg.isGpgAvailable()) { + CredentialsProvider.setDefault(new GpgPassphraseProvider(gpg)); + } + CherryPickResult result = git.cherryPick().include(id).call(); if (result.getStatus().equals(CherryPickStatus.OK)) { diff --git a/release-tools/src/main/java/org/springframework/data/release/git/VersionTags.java b/release-tools/src/main/java/org/springframework/data/release/git/VersionTags.java index 42f7f1c..a3de907 100644 --- a/release-tools/src/main/java/org/springframework/data/release/git/VersionTags.java +++ b/release-tools/src/main/java/org/springframework/data/release/git/VersionTags.java @@ -23,6 +23,7 @@ import java.util.stream.Collectors; import org.springframework.data.release.model.ArtifactVersion; import org.springframework.data.release.model.ModuleIteration; +import org.springframework.data.release.model.Projects; import org.springframework.data.util.Streamable; import org.springframework.util.Assert; @@ -60,7 +61,19 @@ public class VersionTags implements Streamable { } public Tag createTag(ModuleIteration iteration) { - return getLatest().createNew(ArtifactVersion.of(iteration)); + + if (iteration.getProject().equals(Projects.BOM)) { + return Tag.of(iteration.getTrainIteration().getReleaseTrainNameAndVersion()); + } + + Tag latest = getLatest(); + ArtifactVersion version = ArtifactVersion.of(iteration); + + if (latest != null) { + return latest.createNew(version); + } + + return Tag.of(version.toString()); } /** diff --git a/release-tools/src/main/java/org/springframework/data/release/issues/Tickets.java b/release-tools/src/main/java/org/springframework/data/release/issues/Tickets.java index f4910af..735b633 100644 --- a/release-tools/src/main/java/org/springframework/data/release/issues/Tickets.java +++ b/release-tools/src/main/java/org/springframework/data/release/issues/Tickets.java @@ -26,6 +26,7 @@ import java.util.stream.Collector; import java.util.stream.Stream; import org.springframework.data.release.model.ModuleIteration; +import org.springframework.data.release.model.Tracker; import org.springframework.data.release.model.TrainIteration; import org.springframework.data.release.utils.ListWrapperCollector; import org.springframework.data.util.Streamable; @@ -64,7 +65,8 @@ public class Tickets implements Streamable { public Ticket getReleaseTicket(ModuleIteration moduleIteration) { return findReleaseTicket(moduleIteration).orElseThrow( - () -> new IllegalArgumentException(String.format("Did not find a release ticket for %s!", moduleIteration))); + () -> new IllegalArgumentException(String.format("Did not find a release ticket for %s containing %s!", + moduleIteration, Tracker.releaseTicketSummary(moduleIteration)))); } public Tickets getIssueTickets(ModuleIteration moduleIteration) { diff --git a/release-tools/src/main/java/org/springframework/data/release/issues/github/GitHub.java b/release-tools/src/main/java/org/springframework/data/release/issues/github/GitHub.java index bfac737..a107e66 100644 --- a/release-tools/src/main/java/org/springframework/data/release/issues/github/GitHub.java +++ b/release-tools/src/main/java/org/springframework/data/release/issues/github/GitHub.java @@ -532,7 +532,7 @@ class GitHub implements IssueTracker { return milestone .orElseThrow(() -> new IllegalArgumentException(String.format("No milestone for %s found containing %s!", // moduleIteration.getProject().getFullName(), // - moduleIteration.getShortVersionString()))); + new GithubMilestone(moduleIteration)))); } private static Ticket toTicket(GitHubIssue issue) { diff --git a/release-tools/src/main/java/org/springframework/data/release/issues/github/GitHubMilestone.java b/release-tools/src/main/java/org/springframework/data/release/issues/github/GitHubMilestone.java index 0ba1821..98865ce 100644 --- a/release-tools/src/main/java/org/springframework/data/release/issues/github/GitHubMilestone.java +++ b/release-tools/src/main/java/org/springframework/data/release/issues/github/GitHubMilestone.java @@ -29,7 +29,7 @@ class GithubMilestone { ModuleIteration module; public String getDescription() { - return module.getTrain().getName() + " " + module.getIteration().getName(); + return module.getReleaseVersionString(); } public Milestone toMilestone() { diff --git a/release-tools/src/main/java/org/springframework/data/release/issues/jira/Jira.java b/release-tools/src/main/java/org/springframework/data/release/issues/jira/Jira.java index 101ce72..d857ac2 100644 --- a/release-tools/src/main/java/org/springframework/data/release/issues/jira/Jira.java +++ b/release-tools/src/main/java/org/springframework/data/release/issues/jira/Jira.java @@ -120,11 +120,7 @@ class Jira implements JiraConnector { JiraIssues issues = getJiraIssues(query, new HttpHeaders(), 0); - if (!issues.hasIssues()) { - throw new IllegalArgumentException(String.format("Did not find a release ticket for %s!", moduleIteration)); - } - - return toTicket(issues.stream().findFirst().get()); + return issues.stream().map(this::toTicket).collect(Tickets.toTicketsCollector()).getReleaseTicket(moduleIteration); } /* @@ -278,9 +274,9 @@ class Jira implements JiraConnector { } /* - * (non-Javadoc) - * @see org.springframework.data.release.jira.JiraConnector#findJiraReleaseVersion(org.springframework.data.release.model.ModuleIteration) - */ + * (non-Javadoc) + * @see org.springframework.data.release.jira.JiraConnector#findJiraReleaseVersion(org.springframework.data.release.model.ModuleIteration) + */ @Cacheable("release-version") public Optional findJiraReleaseVersion(ModuleIteration moduleIteration) { @@ -318,7 +314,8 @@ class Jira implements JiraConnector { } findJiraReleaseVersion(moduleIteration).orElseThrow( - () -> new IllegalStateException(String.format("Did not find a release version for %s", moduleIteration))); + () -> new IllegalStateException(String.format("No release version for %s found containing %s!", + moduleIteration.getProject().getFullName(), new JiraVersion(moduleIteration)))); JiraComponents jiraComponents = getJiraComponents(moduleIteration.getProjectKey()); diff --git a/release-tools/src/main/java/org/springframework/data/release/issues/jira/JiraVersion.java b/release-tools/src/main/java/org/springframework/data/release/issues/jira/JiraVersion.java index f40aa53..72b9373 100644 --- a/release-tools/src/main/java/org/springframework/data/release/issues/jira/JiraVersion.java +++ b/release-tools/src/main/java/org/springframework/data/release/issues/jira/JiraVersion.java @@ -38,7 +38,7 @@ class JiraVersion { } public String getDescription() { - return module.getTrain().getName() + " " + module.getIteration().getName(); + return module.getReleaseVersionString(); } public FixVersion toFixVersion() { diff --git a/release-tools/src/main/java/org/springframework/data/release/model/ArtifactVersion.java b/release-tools/src/main/java/org/springframework/data/release/model/ArtifactVersion.java index 31e07be..3c815fe 100644 --- a/release-tools/src/main/java/org/springframework/data/release/model/ArtifactVersion.java +++ b/release-tools/src/main/java/org/springframework/data/release/model/ArtifactVersion.java @@ -17,6 +17,10 @@ package org.springframework.data.release.model; import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.With; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.springframework.util.Assert; @@ -24,37 +28,48 @@ import org.springframework.util.Assert; * Value object to represent version of a particular artifact. * * @author Oliver Gierke + * @author Mark Paluch */ @EqualsAndHashCode public class ArtifactVersion implements Comparable { + private static final Pattern PATTERN = Pattern + .compile("(\\d+)\\.(\\d+)(\\.\\d+)?(\\.((SR\\d+)|(RC\\d+)|(M\\d+)|(BUILD-SNAPSHOT)|(RELEASE)))"); + + private static final Pattern MODIFIER_PATTERN = Pattern + .compile("((\\d+)\\.(\\d+)(\\.\\d+)?)(-((RC\\d+)|(M\\d+)|(SNAPSHOT)))?"); + private static final String RELEASE_SUFFIX = "RELEASE"; private static final String MILESTONE_SUFFIX = "M\\d|RC\\d"; private static final String SNAPSHOT_SUFFIX = "BUILD-SNAPSHOT"; + private static final String SNAPSHOT_MODIFIER = "SNAPSHOT"; - private static final String VALID_SUFFIX = String.format("%s|%s|%s", RELEASE_SUFFIX, MILESTONE_SUFFIX, - SNAPSHOT_SUFFIX); + private static final String VALID_SUFFIX = String.format("%s|%s|%s|-%s|-%s|-%s", RELEASE_SUFFIX, MILESTONE_SUFFIX, + SNAPSHOT_SUFFIX, RELEASE_SUFFIX, MILESTONE_SUFFIX, SNAPSHOT_MODIFIER); private final Version version; + private final @With boolean modifierFormat; private final @Getter String suffix; /** * Creates a new {@link ArtifactVersion} from the given logical {@link Version}. * * @param version must not be {@literal null}. + * @param modifierFormat * @param suffix must not be {@literal null} or empty. */ - private ArtifactVersion(Version version, String suffix) { + private ArtifactVersion(Version version, boolean modifierFormat, String suffix) { Assert.notNull(version, "Version must not be null!"); Assert.hasText(suffix, "Suffix must not be null or empty!"); this.version = version; + this.modifierFormat = modifierFormat; this.suffix = suffix; } public static ArtifactVersion of(Version version) { - return new ArtifactVersion(version, RELEASE_SUFFIX); + return new ArtifactVersion(version, false, RELEASE_SUFFIX); } /** @@ -67,14 +82,31 @@ public class ArtifactVersion implements Comparable { Assert.hasText(source, "Version source must not be null or empty!"); - int suffixStart = source.lastIndexOf('.'); + Matcher matcher = PATTERN.matcher(source); + if (matcher.matches()) { - Version version = Version.parse(source.substring(0, suffixStart)); - String suffix = source.substring(suffixStart + 1); + int suffixStart = source.lastIndexOf('.'); - Assert.isTrue(suffix.matches(VALID_SUFFIX), String.format("Invalid version suffix: %s!", source)); + Version version = Version.parse(source.substring(0, suffixStart)); + String suffix = source.substring(suffixStart + 1); - return new ArtifactVersion(version, suffix); + Assert.isTrue(suffix.matches(VALID_SUFFIX), String.format("Invalid version suffix: %s!", source)); + + return new ArtifactVersion(version, false, suffix); + } + + matcher = MODIFIER_PATTERN.matcher(source); + + if (matcher.matches()) { + + Version version = Version.parse(matcher.group(1)); + String suffix = matcher.group(6); + + return new ArtifactVersion(version, true, suffix == null ? RELEASE_SUFFIX : suffix); + } + + throw new IllegalArgumentException( + String.format("Version %s does not match . nor - pattern", source)); } /** @@ -89,17 +121,18 @@ public class ArtifactVersion implements Comparable { Version version = iterationVersion.getVersion(); Iteration iteration = iterationVersion.getIteration(); + boolean modifierVersionFormat = iterationVersion.usesModifierVersionFormat(); if (iteration.isGAIteration()) { - return new ArtifactVersion(version, RELEASE_SUFFIX); + return new ArtifactVersion(version, modifierVersionFormat, RELEASE_SUFFIX); } if (iteration.isServiceIteration()) { Version bugfixVersion = version.withBugfix(iteration.getBugfixValue()); - return new ArtifactVersion(bugfixVersion, RELEASE_SUFFIX); + return new ArtifactVersion(bugfixVersion, modifierVersionFormat, RELEASE_SUFFIX); } - return new ArtifactVersion(version, iteration.getName()); + return new ArtifactVersion(version, modifierVersionFormat, iteration.getName()); } public boolean isVersionWithin(Version version) { @@ -112,7 +145,7 @@ public class ArtifactVersion implements Comparable { * @return */ public ArtifactVersion getReleaseVersion() { - return new ArtifactVersion(version, RELEASE_SUFFIX); + return new ArtifactVersion(version, modifierFormat, RELEASE_SUFFIX); } /** @@ -121,7 +154,7 @@ public class ArtifactVersion implements Comparable { * @return */ public ArtifactVersion getSnapshotVersion() { - return new ArtifactVersion(version, SNAPSHOT_SUFFIX); + return new ArtifactVersion(version, modifierFormat, getSnapshotSuffix()); } /** @@ -143,7 +176,7 @@ public class ArtifactVersion implements Comparable { } public boolean isSnapshotVersion() { - return suffix.matches(SNAPSHOT_SUFFIX); + return suffix.matches(SNAPSHOT_SUFFIX) || suffix.matches(SNAPSHOT_MODIFIER); } public boolean isBugFixVersion() { @@ -163,10 +196,10 @@ public class ArtifactVersion implements Comparable { boolean isGaVersion = version.withBugfix(0).equals(version); Version nextVersion = isGaVersion ? version.nextMinor() : version.nextBugfix(); - return new ArtifactVersion(nextVersion, SNAPSHOT_SUFFIX); + return new ArtifactVersion(nextVersion, modifierFormat, getSnapshotSuffix()); } - return suffix.equals(SNAPSHOT_SUFFIX) ? this : new ArtifactVersion(version, SNAPSHOT_SUFFIX); + return isSnapshotVersion() ? this : new ArtifactVersion(version, modifierFormat, getSnapshotSuffix()); } /** @@ -178,10 +211,10 @@ public class ArtifactVersion implements Comparable { public ArtifactVersion getNextBugfixVersion() { if (suffix.equals(RELEASE_SUFFIX)) { - return new ArtifactVersion(version.nextBugfix(), SNAPSHOT_SUFFIX); + return new ArtifactVersion(version.nextBugfix(), modifierFormat, getSnapshotSuffix()); } - return suffix.equals(SNAPSHOT_SUFFIX) ? this : new ArtifactVersion(version, SNAPSHOT_SUFFIX); + return isSnapshotVersion() ? this : new ArtifactVersion(version, modifierFormat, getSnapshotSuffix()); } public String getReleaseTrainSuffix() { @@ -214,6 +247,16 @@ public class ArtifactVersion implements Comparable { */ @Override public String toString() { + + if (modifierFormat) { + + if (isSnapshotVersion() || isMilestoneVersion()) { + return String.format("%s-%s", version.toMajorMinorBugfix(), suffix); + } + + return version.toMajorMinorBugfix(); + } + return String.format("%s.%s", version.toMajorMinorBugfix(), suffix); } @@ -225,4 +268,8 @@ public class ArtifactVersion implements Comparable { public String toShortString() { return version.toString(); } + + private String getSnapshotSuffix() { + return modifierFormat ? SNAPSHOT_MODIFIER : SNAPSHOT_SUFFIX; + } } diff --git a/release-tools/src/main/java/org/springframework/data/release/model/Calver.java b/release-tools/src/main/java/org/springframework/data/release/model/Calver.java deleted file mode 100644 index a33721e..0000000 --- a/release-tools/src/main/java/org/springframework/data/release/model/Calver.java +++ /dev/null @@ -1,219 +0,0 @@ -package org.springframework.data.release.model; - -import lombok.Getter; - -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.springframework.util.Assert; -import org.springframework.util.StringUtils; - -/** - * Value object to represent a Calver version consisting of year, minor, micro and modifier parts. - * - * @author Mark Paluch - */ -@Getter -public class Calver implements Comparable { - - private static final Pattern PATTERN = Pattern - .compile("(\\d{4})\\.(\\d+)\\.(\\d+)(-((SR\\d+)|(RC\\d+)|(M\\d+)|(SNAPSHOT)))?"); - - private final int year; - private final int minor; - private final int micro; - private final Iteration modifier; - - private Calver(int year, int minor, int micro, Iteration modifier) { - this.year = year; - this.minor = minor; - this.micro = micro; - this.modifier = modifier; - } - - /** - * Parses the given string representation of a version into a {@link Calver} object. - * - * @param version must not be {@literal null} or empty. - * @return - */ - public static Calver parse(String version) { - - Assert.hasText(version, "Version must not be null or empty!"); - - Matcher matcher = PATTERN.matcher(version); - Assert.isTrue(matcher.find(), "Version does not match CalVer"); - - int year = Integer.parseInt(matcher.group(1)); - int minor = Integer.parseInt(matcher.group(2)); - int micro = Integer.parseInt(matcher.group(3)); - String modifier = matcher.group(5); - Iteration iteration; - if (modifier == null) { - iteration = Iteration.GA; - } else if (modifier.equals("SNAPSHOT")) { - iteration = new Iteration("SNAPSHOT", null); - } else { - iteration = Iteration.valueOf(modifier); - } - - return new Calver(year, minor, micro, iteration); - } - - /** - * Returns whether the current {@link Calver} is greater (newer) than the given one. - * - * @param version - * @return - */ - public boolean isGreaterThan(Calver version) { - return compareTo(version) > 0; - } - - /** - * Returns whether the current {@link Calver} is greater (newer) or the same as the given one. - * - * @param version - * @return - */ - public boolean isGreaterThanOrEqualTo(Calver version) { - return compareTo(version) >= 0; - } - - /** - * Returns whether the current {@link Calver} is the same as the given one. - * - * @param version - * @return - */ - public boolean is(Calver version) { - return equals(version); - } - - /** - * Returns whether the current {@link Calver} is less (older) than the given one. - * - * @param version - * @return - */ - public boolean isLessThan(Calver version) { - return compareTo(version) < 0; - } - - /** - * Returns whether the current {@link Calver} is less (older) or equal to the current one. - * - * @param version - * @return - */ - public boolean isLessThanOrEqualTo(Calver version) { - return compareTo(version) <= 0; - } - - public Calver nextMinor() { - return new Calver(this.year, this.minor + 1, 0, modifier); - } - - public Calver nextBugfix() { - return new Calver(this.year, this.minor, this.micro + 1, modifier); - } - - public Calver withBugfix(int bugfix) { - return new Calver(this.year, this.minor, bugfix, modifier); - } - - public Calver withModifier(Iteration modifier) { - return new Calver(this.year, this.minor, this.micro, modifier); - } - - /* - * (non-Javadoc) - * @see java.lang.Comparable#compareTo(java.lang.Object) - */ - public int compareTo(Calver that) { - - if (that == null) { - return 1; - } - - if (year != that.year) { - return year - that.year; - } - - if (minor != that.minor) { - return minor - that.minor; - } - - if (micro != that.micro) { - return micro - that.micro; - } - - if (modifier != that.modifier) { - - if (modifier == null && that.modifier == null) { - return 0; - } - - if (modifier != null && that.modifier == null) { - return modifier.compareTo(Iteration.GA); - } - - if (modifier == null && that.modifier != null) { - return Iteration.GA.compareTo(modifier); - } - return modifier.compareTo(that.modifier); - } - - return 0; - } - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (!(o instanceof Calver)) - return false; - - Calver calver = (Calver) o; - - if (year != calver.year) - return false; - if (minor != calver.minor) - return false; - if (micro != calver.micro) - return false; - return modifier.equals(calver.modifier); - } - - @Override - public int hashCode() { - int result = year; - result = 31 * result + minor; - result = 31 * result + micro; - result = 31 * result + modifier.hashCode(); - return result; - } - - /* - * (non-Javadoc) - * @see java.lang.Object#toString() - */ - @Override - public String toString() { - - List digits = new ArrayList<>(); - digits.add(year); - digits.add(minor); - digits.add(micro); - - String raw = StringUtils.collectionToDelimitedString(digits, "."); - - if (!Iteration.GA.equals(this.modifier)) { - return String.format("%s-%s", raw, this.modifier.getName()); - } - - return raw; - } -} diff --git a/release-tools/src/main/java/org/springframework/data/release/model/Iteration.java b/release-tools/src/main/java/org/springframework/data/release/model/Iteration.java index c9f2937..f0c6225 100644 --- a/release-tools/src/main/java/org/springframework/data/release/model/Iteration.java +++ b/release-tools/src/main/java/org/springframework/data/release/model/Iteration.java @@ -15,6 +15,7 @@ */ package org.springframework.data.release.model; +import lombok.EqualsAndHashCode; import lombok.NonNull; import lombok.Value; @@ -30,6 +31,7 @@ import org.springframework.util.ReflectionUtils; * @author Mark Paluch */ @Value +@EqualsAndHashCode(of = "name") public class Iteration implements Comparable { public static final Iteration SR24 = new Iteration("SR23", null); diff --git a/release-tools/src/main/java/org/springframework/data/release/model/IterationVersion.java b/release-tools/src/main/java/org/springframework/data/release/model/IterationVersion.java index 07ce3a8..9fdef55 100644 --- a/release-tools/src/main/java/org/springframework/data/release/model/IterationVersion.java +++ b/release-tools/src/main/java/org/springframework/data/release/model/IterationVersion.java @@ -19,10 +19,13 @@ package org.springframework.data.release.model; * A {@link Version} tied to an {@link Iteration}. * * @author Oliver Gierke + * @author Mark Paluch */ public interface IterationVersion extends VersionAware { Iteration getIteration(); boolean isBranchVersion(); + + boolean usesModifierVersionFormat(); } diff --git a/release-tools/src/main/java/org/springframework/data/release/model/ModuleIteration.java b/release-tools/src/main/java/org/springframework/data/release/model/ModuleIteration.java index c5d3fef..025d3c2 100644 --- a/release-tools/src/main/java/org/springframework/data/release/model/ModuleIteration.java +++ b/release-tools/src/main/java/org/springframework/data/release/model/ModuleIteration.java @@ -26,7 +26,7 @@ import lombok.RequiredArgsConstructor; */ @RequiredArgsConstructor(access = AccessLevel.PACKAGE) @EqualsAndHashCode -public class ModuleIteration implements IterationVersion, ProjectAware{ +public class ModuleIteration implements IterationVersion, ProjectAware { private final @Getter Module module; private final @Getter TrainIteration trainIteration; @@ -75,6 +75,15 @@ public class ModuleIteration implements IterationVersion, ProjectAware{ return getIteration().isServiceIteration() || trainIteration.getTrain().isAlwaysUseBranch(); } + /* + * (non-Javadoc) + * @see org.springframework.data.release.model.IterationVersion#usesModifierVersionFormat() + */ + @Override + public boolean usesModifierVersionFormat() { + return trainIteration.getTrain().usesCalver(); + } + /** * Returns the {@link String} representation of the logical version of the {@link ModuleIteration}. This will * abbreviate trailing zeros and not include the release train name. @@ -103,15 +112,34 @@ public class ModuleIteration implements IterationVersion, ProjectAware{ Iteration iteration = trainIteration.getIteration(); if (iteration.isServiceIteration()) { - builder.append(" (").append(trainIteration.toString()); + builder.append(" ("); + if (getTrain().usesCalver()) { + builder.append(trainIteration.getName()); + } else { + builder.append(trainIteration.toString()); + } } else { builder.append(" ").append(iteration.getName()).append(" ("); - builder.append(trainIteration.getTrain().getName()); + builder.append(trainIteration.getName()); } return builder.append(")").toString(); } + public String getReleaseVersionString() { + + if (getTrain().usesCalver()) { + + if (getIteration().isServiceIteration() || getIteration().isGAIteration()) { + return getTrainIteration().getCalver().toMajorMinorBugfix(); + } + + return getTrainIteration().getCalver().toMajorMinorBugfix() + "-" + getIteration().getName(); + } + + return getTrain().getName() + " " + getIteration().getName(); + } + /** * Returns the {@link String} representation of the logical version of the {@link ModuleIteration}. This will use the * technical version string and append the train iteration. diff --git a/release-tools/src/main/java/org/springframework/data/release/model/Projects.java b/release-tools/src/main/java/org/springframework/data/release/model/Projects.java index 4241477..de2e234 100644 --- a/release-tools/src/main/java/org/springframework/data/release/model/Projects.java +++ b/release-tools/src/main/java/org/springframework/data/release/model/Projects.java @@ -37,12 +37,14 @@ import org.jgrapht.traverse.TopologicalOrderIterator; */ public class Projects { - public static final Project COMMONS, BUILD, REST, JDBC, JPA, MONGO_DB, NEO4J, SOLR, COUCHBASE, CASSANDRA, + public static final Project BOM, COMMONS, BUILD, REST, JDBC, JPA, MONGO_DB, NEO4J, SOLR, COUCHBASE, CASSANDRA, ELASTICSEARCH, R2DBC, REDIS, GEMFIRE, KEY_VALUE, ENVERS, LDAP, GEODE; public static final List PROJECTS; static { + BOM = new Project("DATABOM", "BOM", Tracker.GITHUB); + BUILD = new Project("DATABUILD", "Build", Tracker.GITHUB) // .withAdditionalArtifacts(ArtifactCoordinates.forGroupId("org.springframework.data.build") .artifacts("spring-data-build-parent", "spring-data-build-resources") diff --git a/release-tools/src/main/java/org/springframework/data/release/model/ReleaseTrains.java b/release-tools/src/main/java/org/springframework/data/release/model/ReleaseTrains.java index 82333fb..0975938 100644 --- a/release-tools/src/main/java/org/springframework/data/release/model/ReleaseTrains.java +++ b/release-tools/src/main/java/org/springframework/data/release/model/ReleaseTrains.java @@ -28,7 +28,8 @@ import java.util.List; public class ReleaseTrains { public static final List TRAINS; - public static final Train CODD, DIJKSTRA, EVANS, FOWLER, GOSLING, HOPPER, INGALLS, KAY, LOVELACE, MOORE, NEUMANN; + public static final Train CODD, DIJKSTRA, EVANS, FOWLER, GOSLING, HOPPER, INGALLS, KAY, LOVELACE, MOORE, NEUMANN, + OCKHAM; static { @@ -63,11 +64,15 @@ public class ReleaseTrains { new Module(JDBC, "2.0"), // new Module(R2DBC, "1.1")) // .filterModules(module -> !module.getProject().equals(GEMFIRE)) - .withIterations(new Train.Iterations(M1, M2, M3, M4, RC1, RC2, GA)); + .withIterations(new Train.Iterations(M1, M2, M3, M4, RC1, RC2, GA, SR1, SR2, SR3, SR4, SR5)); + + OCKHAM = NEUMANN.next("Ockham", Transition.MINOR).withCalver("2020.0.0") + .withIterations(new Train.Iterations(M1, M2, M3, M4, RC1, RC2, GA, SR1, SR2, SR3, SR4, SR5)); // Trains - TRAINS = Arrays.asList(CODD, DIJKSTRA, EVANS, FOWLER, GOSLING, HOPPER, INGALLS, KAY, LOVELACE, MOORE, NEUMANN); + TRAINS = Arrays.asList(CODD, DIJKSTRA, EVANS, FOWLER, GOSLING, HOPPER, INGALLS, KAY, LOVELACE, MOORE, NEUMANN, + OCKHAM); } private static Train codd() { diff --git a/release-tools/src/main/java/org/springframework/data/release/model/Tracker.java b/release-tools/src/main/java/org/springframework/data/release/model/Tracker.java index 8b871f2..ff54f65 100644 --- a/release-tools/src/main/java/org/springframework/data/release/model/Tracker.java +++ b/release-tools/src/main/java/org/springframework/data/release/model/Tracker.java @@ -32,7 +32,7 @@ public enum Tracker { private final String ticketPattern; - public static final String releaseTicketSummary(ModuleIteration moduleIteration) { + public static String releaseTicketSummary(ModuleIteration moduleIteration) { return "Release " + moduleIteration.getMediumVersionString(); } } diff --git a/release-tools/src/main/java/org/springframework/data/release/model/Train.java b/release-tools/src/main/java/org/springframework/data/release/model/Train.java index 186b6d5..37d13d5 100644 --- a/release-tools/src/main/java/org/springframework/data/release/model/Train.java +++ b/release-tools/src/main/java/org/springframework/data/release/model/Train.java @@ -37,6 +37,7 @@ import java.util.stream.Stream; import org.apache.commons.io.IOUtils; import org.springframework.data.util.Streamable; +import org.springframework.lang.Nullable; import org.springframework.util.Assert; /** @@ -49,6 +50,7 @@ public class Train implements Streamable { private final String name;; private final Modules modules; + private @Nullable Version calver; private @With Iterations iterations; private @With boolean alwaysUseBranch; @@ -57,7 +59,7 @@ public class Train implements Streamable { } public Train(String name, Collection modules) { - this(name, Modules.of(modules), Iterations.DEFAULT, false); + this(name, Modules.of(modules), null, Iterations.DEFAULT, false); } /* @@ -106,17 +108,18 @@ public class Train implements Streamable { public Train next(String name, Transition transition, Module... additionalModules) { - Set collect = Stream.concat(modules.stream(), Stream.of(additionalModules)).// + Set modules = Stream.concat(this.modules.stream(), Stream.of(additionalModules)).// map(module -> Arrays.stream(additionalModules).// reduce(module.next(transition), (it, additionalModule) -> it.hasSameProjectAs(additionalModule) ? additionalModule : it)) .collect(Collectors.toSet()); - return new Train(name, collect); + return new Train(name, Modules.of(modules), calver, iterations, alwaysUseBranch); } public Train filterModules(Predicate filterPredicate) { - return new Train(name, getModules().stream().filter(filterPredicate).collect(Collectors.toList())); + return new Train(name, Modules.of(getModules().stream().filter(filterPredicate).collect(Collectors.toList())), + calver, iterations, alwaysUseBranch); } /** @@ -161,6 +164,14 @@ public class Train implements Streamable { return ArtifactVersion.of(new ModuleIteration(module, new TrainIteration(this, iteration))); } + public boolean usesCalver() { + return calver != null; + } + + public Train withCalver(String calverVersion) { + return new Train(name, modules, Version.parse(calverVersion), iterations, alwaysUseBranch); + } + /* * (non-Javadoc) * @see java.lang.Object#toString() diff --git a/release-tools/src/main/java/org/springframework/data/release/model/TrainIteration.java b/release-tools/src/main/java/org/springframework/data/release/model/TrainIteration.java index 52f181e..efb3d7d 100644 --- a/release-tools/src/main/java/org/springframework/data/release/model/TrainIteration.java +++ b/release-tools/src/main/java/org/springframework/data/release/model/TrainIteration.java @@ -64,12 +64,61 @@ public class TrainIteration implements Streamable { return train.getModuleIteration(module.getProject(), previousIteration); } + public String getName() { + + if (getTrain().usesCalver()) { + return getCalver().toMajorMinorBugfix(); + } + + return getTrain().getName(); + } + + public String getReleaseTrainNameAndVersion() { + + if (getTrain().usesCalver()) { + + if (getIteration().isMilestone() || getIteration().isReleaseCandidate()) { + return String.format("%s-%s", getCalver(), iteration); + } + + return getCalver().toString(); + } + + if (iteration.isGAIteration()) { + return String.format("%s-RELEASE", getTrain().getName()); + } + + return String.format("%s-%s", getTrain().getName(), iteration); + } + /* * (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { - return String.format("%s %s", train.getName(), iteration.getName()); + return String.format("%s %s", getName(), iteration.getName()); + } + + public Version getCalver() { + + Version version = getTrain().getCalver(); + + if (getIteration().isServiceIteration()) { + return version.withBugfix(getIteration().getBugfixValue()); + } + + return version; + } + + public String getNextBugfixName() { + + Version version = getTrain().getCalver(); + int currentBugfixLevel = 0; + if (getIteration().isServiceIteration()) { + currentBugfixLevel = getIteration().getBugfixValue(); + } + + return version.withBugfix(currentBugfixLevel + 1).toString(); } } diff --git a/release-tools/src/main/java/org/springframework/data/release/sagan/MaintainedVersion.java b/release-tools/src/main/java/org/springframework/data/release/sagan/MaintainedVersion.java index 42f5b62..f5c85f6 100644 --- a/release-tools/src/main/java/org/springframework/data/release/sagan/MaintainedVersion.java +++ b/release-tools/src/main/java/org/springframework/data/release/sagan/MaintainedVersion.java @@ -51,7 +51,8 @@ class MaintainedVersion implements Comparable { Assert.notNull(module, "Module must not be null!"); Assert.notNull(train, "Train must not be null!"); - ArtifactVersion snapshotVersion = ArtifactVersion.of(module.getVersion()).getSnapshotVersion(); + ArtifactVersion snapshotVersion = ArtifactVersion.of(module.getVersion()).withModifierFormat(train.usesCalver()) + .getSnapshotVersion(); return MaintainedVersion.of(module.getProject(), snapshotVersion, train); } diff --git a/release-tools/src/main/java/org/springframework/data/release/sagan/ProjectMetadata.java b/release-tools/src/main/java/org/springframework/data/release/sagan/ProjectMetadata.java index 3fe66dc..e7c415e 100644 --- a/release-tools/src/main/java/org/springframework/data/release/sagan/ProjectMetadata.java +++ b/release-tools/src/main/java/org/springframework/data/release/sagan/ProjectMetadata.java @@ -20,6 +20,7 @@ import java.util.Locale; import org.springframework.data.release.build.MavenArtifact; import org.springframework.data.release.model.ArtifactVersion; import org.springframework.data.release.model.Projects; +import org.springframework.data.release.model.Train; import org.springframework.util.Assert; import com.fasterxml.jackson.annotation.JsonInclude; @@ -143,18 +144,33 @@ class ProjectMetadata { } /** - * Return the version to use. For the build project thats the release train name, for everything else the artifact + * Return the version to use. For the build project that's the release train name, for everything else the artifact * version. * * @return */ public String getVersion() { - if (Projects.BUILD.equals(version.getProject())) { - return String.format("%s-%s", version.getTrain().getName(), version.getVersion().getReleaseTrainSuffix()); + ArtifactVersion version = this.version.getVersion(); + + if (Projects.BUILD.equals(this.version.getProject())) { + + Train train = this.version.getTrain(); + + if (train.usesCalver()) { + + if (version.isBugFixVersion() || version.isReleaseVersion()) { + return train.getCalver().toMajorMinorBugfix(); + } + + return String.format("%s-%s", train.getName(), version.getReleaseTrainSuffix()); + } + + return String.format("%s-%s", train.getName(), + version.isReleaseVersion() && !version.isBugFixVersion() ? "RELEASE" : version.getReleaseTrainSuffix()); } - return version.getVersion().toString(); + return version.toString(); } public class Repository { diff --git a/release-tools/src/test/java/org/springframework/data/release/build/MavenIntegrationTests.java b/release-tools/src/test/java/org/springframework/data/release/build/MavenIntegrationTests.java index c7fd20d..fce142f 100644 --- a/release-tools/src/test/java/org/springframework/data/release/build/MavenIntegrationTests.java +++ b/release-tools/src/test/java/org/springframework/data/release/build/MavenIntegrationTests.java @@ -75,7 +75,6 @@ class MavenIntegrationTests extends AbstractIntegrationTests { "/project/profiles/profile[id=\"distribute\"]/dependencies/dependency[artifactId=\"spring-data-build-resources\"]/version"); assertThat(xPathEvaluator.asString()).isEqualToIgnoringCase("1.2.0.RELEASE"); - } @Test @@ -87,15 +86,11 @@ class MavenIntegrationTests extends AbstractIntegrationTests { pom.setRepositoryId("spring-libs-snapshot", "spring-libs-release"); pom.setRepositoryUrl("spring-libs-release", "https://repo.spring.io/libs-release"); - - // System.out.println(projection.asString(pom)); } @Test void findsSnapshotDependencies() throws Exception { Pom pom = projection.io().file(workspace.getFile("bom/pom.xml", Projects.BUILD)).read(Pom.class); - - System.out.println(pom.getSnapshotDependencies()); } } diff --git a/release-tools/src/test/java/org/springframework/data/release/issues/github/GitHubIssueTrackerIntegrationTests.java b/release-tools/src/test/java/org/springframework/data/release/issues/github/GitHubIssueTrackerIntegrationTests.java index 4b660ec..0955b9f 100644 --- a/release-tools/src/test/java/org/springframework/data/release/issues/github/GitHubIssueTrackerIntegrationTests.java +++ b/release-tools/src/test/java/org/springframework/data/release/issues/github/GitHubIssueTrackerIntegrationTests.java @@ -84,14 +84,14 @@ class GitHubIssueTrackerIntegrationTests extends AbstractIntegrationTests { void ignoresUnknownTicketsByTicketId() { Collection tickets = github.findTickets(Projects.BUILD, Collections.singletonList("123")); - assertThat(tickets).hasSize(0); + assertThat(tickets).isEmpty(); } @Test // #5 void emptyResultWithEmptyTicketIds() { Collection tickets = github.findTickets(Projects.COMMONS, Collections.emptyList()); - assertThat(tickets).hasSize(0); + assertThat(tickets).isEmpty(); } @Test // #5 @@ -110,7 +110,7 @@ class GitHubIssueTrackerIntegrationTests extends AbstractIntegrationTests { mockGetMilestonesWith("emptyMilestones.json"); assertThatIllegalArgumentException().isThrownBy(() -> github.getReleaseTicketFor(BUILD_HOPPER_RC1)) - .withMessageContaining("No milestone for Spring Data Build found containing 1.8 RC1!"); + .withMessageContaining("No milestone for Spring Data Build found containing 1.8 RC1 (Hopper)!"); } @Test // #5 @@ -157,7 +157,7 @@ class GitHubIssueTrackerIntegrationTests extends AbstractIntegrationTests { mockGetMilestonesWith("emptyMilestones.json"); assertThatIllegalArgumentException().isThrownBy(() -> github.createReleaseTicket(moduleIteration)) - .withMessageContaining("No milestone for Spring Data Build found containing 1.8 RC1!"); + .withMessageContaining("No milestone for Spring Data Build found containing 1.8 RC1 (Hopper)!"); } @Test // #5 diff --git a/release-tools/src/test/java/org/springframework/data/release/issues/github/GithubMilestoneUnitTests.java b/release-tools/src/test/java/org/springframework/data/release/issues/github/GithubMilestoneUnitTests.java index 33ab619..7c87c39 100644 --- a/release-tools/src/test/java/org/springframework/data/release/issues/github/GithubMilestoneUnitTests.java +++ b/release-tools/src/test/java/org/springframework/data/release/issues/github/GithubMilestoneUnitTests.java @@ -44,13 +44,25 @@ class GithubMilestoneUnitTests { assertIterationVersion(Iteration.SR4, "1.8.4 (Dijkstra SR4)"); } + @Test + void rendersGithubCalverCorrectly() { + + ModuleIteration m1 = ReleaseTrains.OCKHAM.getModuleIteration(Projects.COMMONS, Iteration.M1); + ModuleIteration rc1 = ReleaseTrains.OCKHAM.getModuleIteration(Projects.COMMONS, Iteration.RC1); + ModuleIteration ga = ReleaseTrains.OCKHAM.getModuleIteration(Projects.COMMONS, Iteration.GA); + + assertThat(new GithubMilestone(m1).getDescription()).isEqualTo("2020.0.0-M1"); + assertThat(new GithubMilestone(rc1).getDescription()).isEqualTo("2020.0.0-RC1"); + assertThat(new GithubMilestone(ga).getDescription()).isEqualTo("2020.0.0"); + } + @Test void usesCustomModuleIterationStartVersion() { ModuleIteration module = ReleaseTrains.DIJKSTRA.getModuleIteration(Projects.ELASTICSEARCH, Iteration.M1); GithubMilestone version = new GithubMilestone(module); - assertThat(version.toString()).isEqualTo("1.0 M1 (Dijkstra)"); + assertThat(version).hasToString("1.0 M1 (Dijkstra)"); } @Test @@ -59,7 +71,7 @@ class GithubMilestoneUnitTests { ModuleIteration module = ReleaseTrains.DIJKSTRA.getModuleIteration(Projects.ELASTICSEARCH, Iteration.RC1); GithubMilestone version = new GithubMilestone(module); - assertThat(version.toString()).isEqualTo("1.0 RC1 (Dijkstra)"); + assertThat(version).hasToString("1.0 RC1 (Dijkstra)"); } @Test @@ -76,6 +88,6 @@ class GithubMilestoneUnitTests { ModuleIteration module = ReleaseTrains.DIJKSTRA.getModuleIteration(Projects.COMMONS, iteration); GithubMilestone version = new GithubMilestone(module); - assertThat(version.toString()).isEqualTo(expected); + assertThat(version).hasToString(expected); } } diff --git a/release-tools/src/test/java/org/springframework/data/release/issues/jira/JiraConnectorIntegrationTests.java b/release-tools/src/test/java/org/springframework/data/release/issues/jira/JiraConnectorIntegrationTests.java index e15f447..34181db 100644 --- a/release-tools/src/test/java/org/springframework/data/release/issues/jira/JiraConnectorIntegrationTests.java +++ b/release-tools/src/test/java/org/springframework/data/release/issues/jira/JiraConnectorIntegrationTests.java @@ -22,6 +22,7 @@ import static org.assertj.core.api.Assumptions.*; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.Optional; import org.junit.jupiter.api.BeforeEach; @@ -91,14 +92,15 @@ class JiraConnectorIntegrationTests extends AbstractIntegrationTests { mockSearchWith("emptyTickets.json"); Collection tickets = jira.findTickets(Projects.COMMONS, Arrays.asList("XYZ-1", "UNKOWN-1")); - assertThat(tickets).hasSize(0); + assertThat(tickets).isEmpty(); } @Test // #5 void emptyResultWithEmptyTicketIds() { - Collection tickets = jira.findTickets(Projects.COMMONS, Arrays.asList()); - assertThat(tickets).hasSize(0); + Collection tickets = jira.findTickets(Projects.COMMONS, Collections + .emptyList()); + assertThat(tickets).isEmpty(); } @Test // #5 @@ -126,7 +128,7 @@ class JiraConnectorIntegrationTests extends AbstractIntegrationTests { Optional optional = jira.findJiraReleaseVersion(REST_HOPPER_RC1); - assertThat(optional.isPresent()).isTrue(); + assertThat(optional).isPresent(); assertThat(optional.get().getName()).isEqualTo("2.5 RC1 (Hopper)"); } @@ -216,7 +218,7 @@ class JiraConnectorIntegrationTests extends AbstractIntegrationTests { mockGetProjectVersionsWith("emptyReleaseVersions.json", moduleIteration.getProjectKey()); assertThatIllegalStateException().isThrownBy(() -> jira.createReleaseTicket(moduleIteration)) - .withMessageContaining("Did not find a release version for Spring Data REST 2.5 RC1"); + .withMessageContaining("No release version for Spring Data REST found containing 2.5 RC1 (Hopper)!"); } @Test // #5 diff --git a/release-tools/src/test/java/org/springframework/data/release/issues/jira/JiraVersionUnitTests.java b/release-tools/src/test/java/org/springframework/data/release/issues/jira/JiraVersionUnitTests.java index ccaa3f5..7ffc48f 100644 --- a/release-tools/src/test/java/org/springframework/data/release/issues/jira/JiraVersionUnitTests.java +++ b/release-tools/src/test/java/org/springframework/data/release/issues/jira/JiraVersionUnitTests.java @@ -18,7 +18,6 @@ package org.springframework.data.release.issues.jira; import static org.assertj.core.api.Assertions.*; import org.junit.jupiter.api.Test; - import org.springframework.data.release.model.Iteration; import org.springframework.data.release.model.ModuleIteration; import org.springframework.data.release.model.Projects; @@ -28,6 +27,7 @@ import org.springframework.data.release.model.ReleaseTrains; * Unit tests for {@link JiraVersion}. * * @author Oliver Gierke + * @author Mark Paluch */ class JiraVersionUnitTests { @@ -44,13 +44,25 @@ class JiraVersionUnitTests { assertIterationVersion(Iteration.SR4, "1.8.4 (Dijkstra SR4)"); } + @Test + void rendersGithubCalverCorrectly() { + + ModuleIteration m1 = ReleaseTrains.OCKHAM.getModuleIteration(Projects.COMMONS, Iteration.M1); + ModuleIteration rc1 = ReleaseTrains.OCKHAM.getModuleIteration(Projects.COMMONS, Iteration.RC1); + ModuleIteration ga = ReleaseTrains.OCKHAM.getModuleIteration(Projects.COMMONS, Iteration.GA); + + assertThat(new JiraVersion(m1).getDescription()).isEqualTo("2020.0.0-M1"); + assertThat(new JiraVersion(rc1).getDescription()).isEqualTo("2020.0.0-RC1"); + assertThat(new JiraVersion(ga).getDescription()).isEqualTo("2020.0.0"); + } + @Test void usesCustomModuleIterationStartVersion() { ModuleIteration module = ReleaseTrains.DIJKSTRA.getModuleIteration(Projects.ELASTICSEARCH, Iteration.M1); JiraVersion version = new JiraVersion(module); - assertThat(version.toString()).isEqualTo("1.0 M1 (Dijkstra)"); + assertThat(version).hasToString("1.0 M1 (Dijkstra)"); } @Test @@ -59,7 +71,7 @@ class JiraVersionUnitTests { ModuleIteration module = ReleaseTrains.DIJKSTRA.getModuleIteration(Projects.ELASTICSEARCH, Iteration.RC1); JiraVersion version = new JiraVersion(module); - assertThat(version.toString()).isEqualTo("1.0 RC1 (Dijkstra)"); + assertThat(version).hasToString("1.0 RC1 (Dijkstra)"); } @Test @@ -76,6 +88,6 @@ class JiraVersionUnitTests { ModuleIteration module = ReleaseTrains.DIJKSTRA.getModuleIteration(Projects.COMMONS, iteration); JiraVersion version = new JiraVersion(module); - assertThat(version.toString()).isEqualTo(expected); + assertThat(version).hasToString(expected); } } diff --git a/release-tools/src/test/java/org/springframework/data/release/issues/jira/TicketsUnitTests.java b/release-tools/src/test/java/org/springframework/data/release/issues/jira/TicketsUnitTests.java index 62c2f39..1a93c77 100644 --- a/release-tools/src/test/java/org/springframework/data/release/issues/jira/TicketsUnitTests.java +++ b/release-tools/src/test/java/org/springframework/data/release/issues/jira/TicketsUnitTests.java @@ -65,6 +65,29 @@ class TicketsUnitTests { assertThat(releaseTicket).isEqualTo(ticket); } + @Test + void getReleaseTicketReturnsCalverReleaseTicket() { + + Tickets tickets = new Tickets( + Collections.singletonList(new Ticket("1234", "Release 2.4 GA (2020.0.0)", JiraTicketStatus.of(false, "", "")))); + + Ticket releaseTicket = tickets + .getReleaseTicket(ReleaseTrains.OCKHAM.getModuleIteration(Projects.JPA, Iteration.GA)); + assertThat(releaseTicket).isNotNull(); + + tickets = new Tickets( + Collections.singletonList(new Ticket("1234", "Release 2.4 M1 (2020.0.0)", JiraTicketStatus.of(false, "", "")))); + + releaseTicket = tickets.getReleaseTicket(ReleaseTrains.OCKHAM.getModuleIteration(Projects.JPA, Iteration.M1)); + assertThat(releaseTicket).isNotNull(); + + tickets = new Tickets( + Collections.singletonList(new Ticket("1234", "Release 2.4.1 (2020.0.1)", JiraTicketStatus.of(false, "", "")))); + + releaseTicket = tickets.getReleaseTicket(ReleaseTrains.OCKHAM.getModuleIteration(Projects.JPA, Iteration.SR1)); + assertThat(releaseTicket).isNotNull(); + } + @Test void getReleaseTicketThrowsExceptionWithoutAReleaseTicket() { diff --git a/release-tools/src/test/java/org/springframework/data/release/model/ArtifactVersionUnitTests.java b/release-tools/src/test/java/org/springframework/data/release/model/ArtifactVersionUnitTests.java index dbcc24e..486d6a1 100644 --- a/release-tools/src/test/java/org/springframework/data/release/model/ArtifactVersionUnitTests.java +++ b/release-tools/src/test/java/org/springframework/data/release/model/ArtifactVersionUnitTests.java @@ -21,6 +21,8 @@ import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; /** + * Unit tests for {@link ArtifactVersion}. + * * @author Oliver Gierke */ class ArtifactVersionUnitTests { @@ -33,19 +35,21 @@ class ArtifactVersionUnitTests { @Test void parsesReleaseVersionCorrectly() { - ArtifactVersion version = ArtifactVersion.of("1.4.5.RELEASE"); + assertThat(ArtifactVersion.of("1.4.5.RELEASE").isReleaseVersion()).isTrue(); + assertThat(ArtifactVersion.of("1.4.5.RELEASE").getNextDevelopmentVersion()).isEqualTo(ArtifactVersion.of("1.4.6.BUILD-SNAPSHOT")); - assertThat(version.isReleaseVersion()).isTrue(); - assertThat(version.getNextDevelopmentVersion()).isEqualTo(ArtifactVersion.of("1.4.6.BUILD-SNAPSHOT")); + assertThat(ArtifactVersion.of("1.4.5").isReleaseVersion()).isTrue(); + assertThat(ArtifactVersion.of("1.4.5").getNextDevelopmentVersion()).isEqualTo(ArtifactVersion.of("1.4.6-SNAPSHOT")); } @Test void createsMilestoneVersionCorrectly() { - ArtifactVersion version = ArtifactVersion.of("1.4.5.M1"); + assertThat(ArtifactVersion.of("1.4.5.M1").isReleaseVersion()).isFalse(); + assertThat(ArtifactVersion.of("1.4.5.M1").isMilestoneVersion()).isTrue(); - assertThat(version.isReleaseVersion()).isFalse(); - assertThat(version.isMilestoneVersion()).isTrue(); + assertThat(ArtifactVersion.of("1.4.5-M1").isReleaseVersion()).isFalse(); + assertThat(ArtifactVersion.of("1.4.5-M1").isMilestoneVersion()).isTrue(); } @Test @@ -54,7 +58,7 @@ class ArtifactVersionUnitTests { ArtifactVersion version = ArtifactVersion.of(Version.of(1, 4, 5)); assertThat(version.isReleaseVersion()).isTrue(); - assertThat(version.toString()).isEqualTo("1.4.5.RELEASE"); + assertThat(version).hasToString("1.4.5.RELEASE"); } @Test @@ -64,7 +68,7 @@ class ArtifactVersionUnitTests { ArtifactVersion version = ArtifactVersion.of(oneFourMilestoneOne); assertThat(version.isMilestoneVersion()).isTrue(); - assertThat(version.toString()).isEqualTo("1.4.0.M1"); + assertThat(version).hasToString("1.4.0.M1"); } @Test @@ -74,7 +78,7 @@ class ArtifactVersionUnitTests { ArtifactVersion version = ArtifactVersion.of(oneFourGA); assertThat(version.isReleaseVersion()).isTrue(); - assertThat(version.toString()).isEqualTo("1.4.0.RELEASE"); + assertThat(version).hasToString("1.4.0.RELEASE"); } @Test @@ -84,7 +88,7 @@ class ArtifactVersionUnitTests { ArtifactVersion version = ArtifactVersion.of(oneFourServiceReleaseTwo); assertThat(version.isReleaseVersion()).isTrue(); - assertThat(version.toString()).isEqualTo("1.4.2.RELEASE"); + assertThat(version).hasToString("1.4.2.RELEASE"); } @Test diff --git a/release-tools/src/test/java/org/springframework/data/release/model/CalverVersionUnitTests.java b/release-tools/src/test/java/org/springframework/data/release/model/CalverVersionUnitTests.java deleted file mode 100644 index ca8dfd6..0000000 --- a/release-tools/src/test/java/org/springframework/data/release/model/CalverVersionUnitTests.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2020 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.data.release.model; - -import static org.assertj.core.api.Assertions.*; - -import org.junit.jupiter.api.Test; - -/** - * Unit tests for {@link Calver}. - * - * @author Mark Paluch - */ -class CalverVersionUnitTests { - - @Test - void shouldParseRelease() { - - Calver version = Calver.parse("2020.0.1"); - - assertThat(version.getYear()).isEqualTo(2020); - assertThat(version.getMinor()).isEqualTo(0); - assertThat(version.getMicro()).isEqualTo(1); - } - - @Test - void shouldParseM1Release() { - - Calver version = Calver.parse("2020.0.1-M1"); - - assertThat(version.getYear()).isEqualTo(2020); - assertThat(version.getMinor()).isEqualTo(0); - assertThat(version.getMicro()).isEqualTo(1); - assertThat(version.getModifier()).isEqualTo(Iteration.M1); - } - - @Test - void shouldCompareReleasesCorrectly() { - - Calver version = Calver.parse("2020.0.1-RC2"); - - assertThat(version).isGreaterThan(Calver.parse("2020.0.0-RC2")); - assertThat(version).isLessThan(Calver.parse("2020.0.2-RC2")); - assertThat(version).isLessThan(Calver.parse("2020.1.0-RC2")); - assertThat(version).isLessThan(Calver.parse("2021.0.0-RC2")); - - assertThat(version).isGreaterThan(Calver.parse("2020.0.1-RC1")); - assertThat(version).isLessThan(Calver.parse("2020.0.1")); - - assertThat(Calver.parse("2020.0.1")).isEqualTo(Calver.parse("2020.0.1")); - assertThat(Calver.parse("2020.0.1")).isLessThan(Calver.parse("2020.0.1-SR1")); - assertThat(Calver.parse("2020.0.1")).isGreaterThan(Calver.parse("2020.0.1-M1")); - } - - @Test - void shouldParseSnapshot() { - - Calver version = Calver.parse("2020.0.1-SNAPSHOT"); - - assertThat(version.getYear()).isEqualTo(2020); - assertThat(version.getMinor()).isEqualTo(0); - assertThat(version.getMicro()).isEqualTo(1); - assertThat(version.getModifier()).isEqualTo(new Iteration("SNAPSHOT", null)); - } -} diff --git a/release-tools/src/test/java/org/springframework/data/release/model/SimpleIterationVersion.java b/release-tools/src/test/java/org/springframework/data/release/model/SimpleIterationVersion.java index a242456..a6de335 100644 --- a/release-tools/src/test/java/org/springframework/data/release/model/SimpleIterationVersion.java +++ b/release-tools/src/test/java/org/springframework/data/release/model/SimpleIterationVersion.java @@ -31,4 +31,13 @@ public class SimpleIterationVersion implements IterationVersion { public boolean isBranchVersion() { return iteration.isServiceIteration(); } + + /* + * (non-Javadoc) + * @see org.springframework.data.release.model.IterationVersion#usesModifierVersionFormat() + */ + @Override + public boolean usesModifierVersionFormat() { + return false; + } } diff --git a/release-tools/src/test/java/org/springframework/data/release/sagan/SaganOperationsIntegrationTests.java b/release-tools/src/test/java/org/springframework/data/release/sagan/SaganOperationsIntegrationTests.java index 8e09e41..fa0e1a8 100644 --- a/release-tools/src/test/java/org/springframework/data/release/sagan/SaganOperationsIntegrationTests.java +++ b/release-tools/src/test/java/org/springframework/data/release/sagan/SaganOperationsIntegrationTests.java @@ -37,7 +37,7 @@ class SaganOperationsIntegrationTests extends AbstractIntegrationTests { @Test void detectVersionsToUpdate() { - sagan.findVersions(ReleaseTrains.LOVELACE, ReleaseTrains.KAY, ReleaseTrains.INGALLS, ReleaseTrains.HOPPER) + sagan.findVersions(ReleaseTrains.OCKHAM, ReleaseTrains.NEUMANN, ReleaseTrains.MOORE, ReleaseTrains.LOVELACE) .forEach((project, versions) -> { System.out.println(project.getName());