#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.
This commit is contained in:
Mark Paluch
2020-04-30 13:09:48 +02:00
parent 8f55850118
commit 8dfaa014e2
33 changed files with 384 additions and 396 deletions

View File

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

View File

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

View File

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

View File

@@ -73,7 +73,7 @@ class ReleaseCommands extends TimedCommand {
git.prepare(iteration);
build.runPreReleaseChecks(iteration);
// build.runPreReleaseChecks(iteration);
misc.prepareChangelogs(iteration);
misc.updateResources(iteration);

View File

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

View File

@@ -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<Tag> {
}
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());
}
/**

View File

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

View File

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

View File

@@ -29,7 +29,7 @@ class GithubMilestone {
ModuleIteration module;
public String getDescription() {
return module.getTrain().getName() + " " + module.getIteration().getName();
return module.getReleaseVersionString();
}
public Milestone toMilestone() {

View File

@@ -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<JiraReleaseVersion> 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());

View File

@@ -38,7 +38,7 @@ class JiraVersion {
}
public String getDescription() {
return module.getTrain().getName() + " " + module.getIteration().getName();
return module.getReleaseVersionString();
}
public FixVersion toFixVersion() {

View File

@@ -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<ArtifactVersion> {
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<ArtifactVersion> {
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 <version>.<modifier> nor <version>-<modifier> pattern", source));
}
/**
@@ -89,17 +121,18 @@ public class ArtifactVersion implements Comparable<ArtifactVersion> {
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<ArtifactVersion> {
* @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<ArtifactVersion> {
* @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<ArtifactVersion> {
}
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<ArtifactVersion> {
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<ArtifactVersion> {
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<ArtifactVersion> {
*/
@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<ArtifactVersion> {
public String toShortString() {
return version.toString();
}
private String getSnapshotSuffix() {
return modifierFormat ? SNAPSHOT_MODIFIER : SNAPSHOT_SUFFIX;
}
}

View File

@@ -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<Calver> {
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<Integer> 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;
}
}

View File

@@ -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<Iteration> {
public static final Iteration SR24 = new Iteration("SR23", null);

View File

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

View File

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

View File

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

View File

@@ -28,7 +28,8 @@ import java.util.List;
public class ReleaseTrains {
public static final List<Train> 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() {

View File

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

View File

@@ -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<Module> {
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<Module> {
}
public Train(String name, Collection<Module> 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<Module> {
public Train next(String name, Transition transition, Module... additionalModules) {
Set<Module> collect = Stream.concat(modules.stream(), Stream.of(additionalModules)).//
Set<Module> 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<Module> 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<Module> {
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()

View File

@@ -64,12 +64,61 @@ public class TrainIteration implements Streamable<ModuleIteration> {
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();
}
}

View File

@@ -51,7 +51,8 @@ class MaintainedVersion implements Comparable<MaintainedVersion> {
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);
}

View File

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

View File

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

View File

@@ -84,14 +84,14 @@ class GitHubIssueTrackerIntegrationTests extends AbstractIntegrationTests {
void ignoresUnknownTicketsByTicketId() {
Collection<Ticket> tickets = github.findTickets(Projects.BUILD, Collections.singletonList("123"));
assertThat(tickets).hasSize(0);
assertThat(tickets).isEmpty();
}
@Test // #5
void emptyResultWithEmptyTicketIds() {
Collection<Ticket> 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

View File

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

View File

@@ -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<Ticket> tickets = jira.findTickets(Projects.COMMONS, Arrays.asList("XYZ-1", "UNKOWN-1"));
assertThat(tickets).hasSize(0);
assertThat(tickets).isEmpty();
}
@Test // #5
void emptyResultWithEmptyTicketIds() {
Collection<Ticket> tickets = jira.findTickets(Projects.COMMONS, Arrays.asList());
assertThat(tickets).hasSize(0);
Collection<Ticket> tickets = jira.findTickets(Projects.COMMONS, Collections
.emptyList());
assertThat(tickets).isEmpty();
}
@Test // #5
@@ -126,7 +128,7 @@ class JiraConnectorIntegrationTests extends AbstractIntegrationTests {
Optional<JiraReleaseVersion> 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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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