diff --git a/pom.xml b/pom.xml index 086a4c8..70b5ec5 100644 --- a/pom.xml +++ b/pom.xml @@ -46,7 +46,7 @@ org.xmlbeam xmlprojector - 1.1.0 + 1.1.4 diff --git a/src/main/java/org/springframework/data/release/announcement/AnnouncementOperations.java b/src/main/java/org/springframework/data/release/announcement/AnnouncementOperations.java index d0975c4..651f8d0 100644 --- a/src/main/java/org/springframework/data/release/announcement/AnnouncementOperations.java +++ b/src/main/java/org/springframework/data/release/announcement/AnnouncementOperations.java @@ -17,6 +17,7 @@ package org.springframework.data.release.announcement; import org.springframework.data.release.cli.StaticResources; import org.springframework.data.release.maven.Artifact; +import org.springframework.data.release.model.ArtifactVersion; import org.springframework.data.release.model.Iteration; import org.springframework.data.release.model.ModuleIteration; import org.springframework.data.release.model.Project; @@ -50,7 +51,12 @@ public class AnnouncementOperations { builder.append("* "); builder.append(project.getFullName()).append(" "); - builder.append(module.getVersion()).append(" ").append(module.getIteration().getName()); + builder.append(ArtifactVersion.from(module).toShortString()); + + if (!iteration.isServiceIteration()) { + builder.append(" ").append(module.getIteration().getName()); + } + builder.append(" - "); Artifact artifact = new Artifact(module); @@ -77,6 +83,6 @@ public class AnnouncementOperations { public static void main(String[] args) { AnnouncementOperations operations = new AnnouncementOperations(); - System.out.println(operations.getProjectBulletpoints(ReleaseTrains.DIJKSTRA, Iteration.M1)); + System.out.println(operations.getProjectBulletpoints(ReleaseTrains.CODD, Iteration.SR2)); } } diff --git a/src/main/java/org/springframework/data/release/cli/JiraCommands.java b/src/main/java/org/springframework/data/release/cli/JiraCommands.java index e357fdd..a764689 100644 --- a/src/main/java/org/springframework/data/release/cli/JiraCommands.java +++ b/src/main/java/org/springframework/data/release/cli/JiraCommands.java @@ -73,11 +73,17 @@ public class JiraCommands implements CommandMarker { } @CliCommand("changelog") - public String changelog(@CliOption(key = { "", "module" }, mandatory = true) String moduleName, @CliOption( - key = { "iteration" }, mandatory = true) String iterationName) { + public String changelog(@CliOption(key = { "", "train" }, mandatory = true) String trainName, // + @CliOption(key = { "iteration" }, mandatory = true) String iterationName, // + @CliOption(key = "module") String moduleName) { - Train dijkstra = ReleaseTrains.DIJKSTRA; - return connector.getChangelogFor(dijkstra, dijkstra.getModule(moduleName), - dijkstra.getIterations().getIterationByName(iterationName)).toString(); + Train train = ReleaseTrains.getTrainByName(trainName); + Iteration iteration = train.getIteration(iterationName); + + if (StringUtils.hasText(moduleName)) { + return connector.getChangelogFor(train.getModuleIteration(iteration, moduleName)).toString(); + } + + return ""; } } diff --git a/src/main/java/org/springframework/data/release/cli/ReleaseCommands.java b/src/main/java/org/springframework/data/release/cli/ReleaseCommands.java index 54eae2d..35f26e5 100644 --- a/src/main/java/org/springframework/data/release/cli/ReleaseCommands.java +++ b/src/main/java/org/springframework/data/release/cli/ReleaseCommands.java @@ -22,6 +22,7 @@ import org.springframework.data.release.git.GitOperations; import org.springframework.data.release.git.Tags; import org.springframework.data.release.maven.MavenOperations; import org.springframework.data.release.maven.Pom; +import org.springframework.data.release.misc.ReleaseOperations; import org.springframework.data.release.model.ArtifactVersion; import org.springframework.data.release.model.Iteration; import org.springframework.data.release.model.Module; @@ -42,6 +43,7 @@ public class ReleaseCommands implements CommandMarker { private final MavenOperations maven; private final GitOperations git; + private final ReleaseOperations misc; @CliCommand("release predict") public String predictTrainAndIteration() throws Exception { @@ -86,7 +88,14 @@ public class ReleaseCommands implements CommandMarker { maven.triggerDistributionBuild(train, iteration); } - @CliCommand("release prepare") + /** + * Prepares the release of the given iteration of the given train. + * + * @param trainName the name of the release train (ignoring case). + * @param iterationName the name of the iteration. + * @throws Exception + */ + @CliCommand(value = "release prepare", help = "Prepares the release of the iteration of the given train.") public void prepare(@CliOption(key = { "", "train" }, mandatory = true) String trainName, @CliOption( key = "iteration", mandatory = true) String iterationName) throws Exception { @@ -94,6 +103,7 @@ public class ReleaseCommands implements CommandMarker { Iteration iteration = train.getIteration(iterationName); git.prepare(train, iteration); + misc.prepareChangelogs(train, iteration); for (Module module : train) { maven.prepareProject(train, iteration, module.getProject()); diff --git a/src/main/java/org/springframework/data/release/git/GiCommands.java b/src/main/java/org/springframework/data/release/git/GiCommands.java index 1eb786e..da7c504 100644 --- a/src/main/java/org/springframework/data/release/git/GiCommands.java +++ b/src/main/java/org/springframework/data/release/git/GiCommands.java @@ -61,4 +61,18 @@ public class GiCommands implements CommandMarker { return StringUtils.collectionToDelimitedString(git.getTags(project).asList(), "\n"); } + + @CliCommand("git reset") + public void reset(@CliOption(key = { "", "train" }, mandatory = true) String trainName, @CliOption(key = "iteration", + mandatory = true) String iterationName) throws Exception { + git.reset(ReleaseTrains.getTrainByName(trainName)); + } + + @CliCommand("git prepare") + public void prepare(@CliOption(key = { "", "train" }, mandatory = true) String trainName, @CliOption( + key = "iteration", mandatory = true) String iterationName) throws Exception { + + Train train = ReleaseTrains.getTrainByName(trainName); + git.prepare(train, train.getIteration(iterationName)); + } } diff --git a/src/main/java/org/springframework/data/release/git/GitOperations.java b/src/main/java/org/springframework/data/release/git/GitOperations.java index de4711f..03f026d 100644 --- a/src/main/java/org/springframework/data/release/git/GitOperations.java +++ b/src/main/java/org/springframework/data/release/git/GitOperations.java @@ -36,6 +36,7 @@ import org.springframework.data.release.model.Project; import org.springframework.data.release.model.Train; import org.springframework.shell.support.logging.HandlerUtils; import org.springframework.stereotype.Component; +import org.springframework.util.Assert; import org.springframework.util.StringUtils; /** @@ -57,6 +58,21 @@ public class GitOperations { return new GitProject(project, server); } + /** + * Resets the repositories for all modules of the given {@link Train}. + * + * @param train must not be {@literal null}. + * @throws Exception + */ + public void reset(Train train) throws Exception { + + Assert.notNull(train, "Train must not be null!"); + + for (Module module : train) { + osCommandOperations.executeCommand("git reset --hard", module.getProject()).get(); + } + } + /** * Checks out all projects of the given {@link Train} at the tags for the given {@link Iteration}. * @@ -93,7 +109,7 @@ public class GitOperations { Branch branch = Branch.from(module); - update(module.getProject()); + update(module.getProject()).get(); String checkoutCommand = String.format("git checkout %s", branch); osCommandOperations.executeCommand(checkoutCommand, module.getProject()).get(); diff --git a/src/main/java/org/springframework/data/release/jira/Changelog.java b/src/main/java/org/springframework/data/release/jira/Changelog.java index e8f197f..8397c9a 100644 --- a/src/main/java/org/springframework/data/release/jira/Changelog.java +++ b/src/main/java/org/springframework/data/release/jira/Changelog.java @@ -22,8 +22,8 @@ import lombok.AccessLevel; import lombok.EqualsAndHashCode; import lombok.RequiredArgsConstructor; -import org.springframework.data.release.model.Iteration; -import org.springframework.data.release.model.Module; +import org.springframework.data.release.model.ArtifactVersion; +import org.springframework.data.release.model.ModuleIteration; import org.springframework.format.datetime.DateFormatter; import org.springframework.shell.support.util.OsUtils; @@ -34,8 +34,7 @@ import org.springframework.shell.support.util.OsUtils; @EqualsAndHashCode public class Changelog { - private final Module module; - private final Iteration iteration; + private final ModuleIteration module; private final Tickets tickets; /* @@ -45,7 +44,9 @@ public class Changelog { @Override public String toString() { - String headline = String.format("Changes in version %s (%s)", module.getVersion(), + ArtifactVersion version = ArtifactVersion.from(module); + + String headline = String.format("Changes in version %s (%s)", version, new DateFormatter("YYYY-MM-dd").print(new Date(), Locale.US)); StringBuilder builder = new StringBuilder(headline).append(OsUtils.LINE_SEPARATOR); diff --git a/src/main/java/org/springframework/data/release/jira/JiraConnector.java b/src/main/java/org/springframework/data/release/jira/JiraConnector.java index e30f8d5..22914a1 100644 --- a/src/main/java/org/springframework/data/release/jira/JiraConnector.java +++ b/src/main/java/org/springframework/data/release/jira/JiraConnector.java @@ -16,7 +16,7 @@ package org.springframework.data.release.jira; import org.springframework.data.release.model.Iteration; -import org.springframework.data.release.model.Module; +import org.springframework.data.release.model.ModuleIteration; import org.springframework.data.release.model.Train; /** @@ -39,5 +39,5 @@ public interface JiraConnector { void closeIteration(Train train, Iteration iteration, Credentials credentials); - Changelog getChangelogFor(Train train, Module module, Iteration iteration); + Changelog getChangelogFor(ModuleIteration iteration); } diff --git a/src/main/java/org/springframework/data/release/jira/JiraVersion.java b/src/main/java/org/springframework/data/release/jira/JiraVersion.java index b2fea87..64a622f 100644 --- a/src/main/java/org/springframework/data/release/jira/JiraVersion.java +++ b/src/main/java/org/springframework/data/release/jira/JiraVersion.java @@ -19,6 +19,7 @@ import lombok.Value; import org.springframework.data.release.model.Iteration; import org.springframework.data.release.model.Module; +import org.springframework.data.release.model.ModuleIteration; import org.springframework.data.release.model.Train; /** @@ -31,6 +32,13 @@ class JiraVersion { private final Train train; private final Iteration iteration; + public JiraVersion(ModuleIteration moduleIteration) { + + this.module = moduleIteration.getModule(); + this.iteration = moduleIteration.getIteration(); + this.train = moduleIteration.getTrain(); + } + /* * (non-Javadoc) * @see java.lang.Object#toString() diff --git a/src/main/java/org/springframework/data/release/jira/JqlQuery.java b/src/main/java/org/springframework/data/release/jira/JqlQuery.java index bc71f64..b59806c 100644 --- a/src/main/java/org/springframework/data/release/jira/JqlQuery.java +++ b/src/main/java/org/springframework/data/release/jira/JqlQuery.java @@ -21,7 +21,7 @@ import java.util.List; import lombok.Value; import org.springframework.data.release.model.Iteration; -import org.springframework.data.release.model.Module; +import org.springframework.data.release.model.ModuleIteration; import org.springframework.data.release.model.ReleaseTrains; import org.springframework.data.release.model.Train; import org.springframework.util.StringUtils; @@ -44,18 +44,25 @@ class JqlQuery { return new JqlQuery(String.format("%s ORDER BY %s", query, orderBy)); } + public static JqlQuery from(ModuleIteration iteration) { + + JiraVersion version = new JiraVersion(iteration); + + return new JqlQuery(String.format(PROJECT_VERSION_TEMPLATE, iteration.getProjectKey(), version)); + } + public static JqlQuery from(Train train, Iteration iteration) { List parts = new ArrayList<>(); - for (Module module : train) { + for (ModuleIteration module : train.getModuleIterations(iteration)) { if (ReleaseTrains.BUILD.equals(module.getProject())) { continue; } - JiraVersion version = new JiraVersion(module, train, iteration); - parts.add(String.format(PROJECT_VERSION_TEMPLATE, module.getProject().getKey(), version)); + JiraVersion version = new JiraVersion(module); + parts.add(String.format(PROJECT_VERSION_TEMPLATE, module.getProjectKey(), version)); } return new JqlQuery(StringUtils.collectionToDelimitedString(parts, " OR ")); diff --git a/src/main/java/org/springframework/data/release/jira/RestJiraConnector.java b/src/main/java/org/springframework/data/release/jira/RestJiraConnector.java index 11a74da..812fbb6 100644 --- a/src/main/java/org/springframework/data/release/jira/RestJiraConnector.java +++ b/src/main/java/org/springframework/data/release/jira/RestJiraConnector.java @@ -28,8 +28,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.data.release.model.Iteration; -import org.springframework.data.release.model.Module; -import org.springframework.data.release.model.ReleaseTrains; +import org.springframework.data.release.model.ModuleIteration; import org.springframework.data.release.model.Train; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; @@ -153,10 +152,20 @@ class RestJiraConnector implements JiraConnector { * @see org.springframework.data.release.jira.JiraConnector#getChangelogFor(org.springframework.data.release.model.Module, org.springframework.data.release.model.Iteration) */ @Override - public Changelog getChangelogFor(Train train, Module module, Iteration iteration) { + public Changelog getChangelogFor(ModuleIteration module) { - Tickets tickets = getTicketsFor(ReleaseTrains.DIJKSTRA, iteration, null); + Map parameters = new HashMap<>(); + parameters.put("jql", JqlQuery.from(module)); + parameters.put("fields", "summary,fixVersions"); + parameters.put("startAt", 0); - return new Changelog(module, iteration, tickets); + JiraIssues issues = operations.getForObject(SEARCH_TEMPLATE, JiraIssues.class, parameters); + List tickets = new ArrayList<>(); + + for (JiraIssue issue : issues) { + tickets.add(new Ticket(issue.getKey(), issue.getFields().getSummary())); + } + + return new Changelog(module, new Tickets(tickets, tickets.size())); } } diff --git a/src/main/java/org/springframework/data/release/maven/Artifact.java b/src/main/java/org/springframework/data/release/maven/Artifact.java index cfc41a4..7727d42 100644 --- a/src/main/java/org/springframework/data/release/maven/Artifact.java +++ b/src/main/java/org/springframework/data/release/maven/Artifact.java @@ -15,6 +15,8 @@ */ package org.springframework.data.release.maven; +import lombok.Getter; + import org.springframework.data.release.model.ArtifactVersion; import org.springframework.data.release.model.ModuleIteration; import org.springframework.data.release.model.ReleaseTrains; @@ -31,7 +33,7 @@ public class Artifact { private final ModuleIteration module; private final Repository repository; - private final ArtifactVersion version; + private final @Getter ArtifactVersion version; /** * Creates a new {@link Artifact} for the given {@link ModuleIteration}. diff --git a/src/main/java/org/springframework/data/release/maven/MavenConfig.java b/src/main/java/org/springframework/data/release/maven/MavenConfig.java index ac38b82..7e10646 100644 --- a/src/main/java/org/springframework/data/release/maven/MavenConfig.java +++ b/src/main/java/org/springframework/data/release/maven/MavenConfig.java @@ -17,14 +17,11 @@ package org.springframework.data.release.maven; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.data.release.model.ArtifactVersion; import org.xmlbeam.ProjectionFactory; import org.xmlbeam.XBProjector; import org.xmlbeam.XBProjector.Flags; import org.xmlbeam.config.DefaultXMLFactoriesConfig; import org.xmlbeam.config.DefaultXMLFactoriesConfig.NamespacePhilosophy; -import org.xmlbeam.types.DefaultTypeConverter; -import org.xmlbeam.types.TypeConverter; /** * @author Oliver Gierke @@ -35,38 +32,12 @@ class MavenConfig { @Bean public ProjectionFactory projectionFactory() { - TypeConverter converter = new DefaultTypeConverter().setConversionForType(ArtifactVersion.class, - new ArtifactVersionConverter()); - DefaultXMLFactoriesConfig config = new DefaultXMLFactoriesConfig(); config.setNamespacePhilosophy(NamespacePhilosophy.AGNOSTIC); + config.setOmitXMLDeclaration(false); XBProjector projector = new XBProjector(config, Flags.TO_STRING_RENDERS_XML); - projector.config().setTypeConverter(converter); return projector; } - - /** - * Custom converter to be able to use {@link ArtifactVersion} directly from within an XmlBeam projection. - * - * @author Oliver Gierke - */ - private static class ArtifactVersionConverter extends DefaultTypeConverter.Conversion { - - private static final long serialVersionUID = 1L; - - public ArtifactVersionConverter() { - super(null); - } - - /* - * (non-Javadoc) - * @see org.xmlbeam.types.DefaultTypeConverter.Conversion#convert(java.lang.String) - */ - @Override - public ArtifactVersion convert(String data) { - return ArtifactVersion.parse(data); - } - } } diff --git a/src/main/java/org/springframework/data/release/maven/MavenOperations.java b/src/main/java/org/springframework/data/release/maven/MavenOperations.java index ad61b18..4098ad0 100644 --- a/src/main/java/org/springframework/data/release/maven/MavenOperations.java +++ b/src/main/java/org/springframework/data/release/maven/MavenOperations.java @@ -43,6 +43,7 @@ import org.xmlbeam.io.XBFileIO; @RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class MavenOperations { + private static final String COMMONS_VERSION_PROPERTY = "springdata.commons"; private static final Logger LOGGER = HandlerUtils.getLogger(MavenOperations.class); private static final String POM_XML = "pom.xml"; @@ -56,29 +57,38 @@ public class MavenOperations { return projectionFactory.io().file(file).read(Pom.class); } - public void prepareProject(Train train, Iteration iteration, Project project) throws IOException { + public void prepareProject(Train train, Iteration iteration, final Project project) throws Exception { + + updateBomPom(train, iteration); if (ReleaseTrains.BUILD.equals(project)) { return; } - ArtifactVersion commonsVersion = train.getModuleVersion(ReleaseTrains.COMMONS, iteration); - ArtifactVersion buildVersion = train.getModuleVersion(ReleaseTrains.BUILD, iteration); - Repository repository = new Repository(iteration); + final ArtifactVersion commonsVersion = train.getModuleVersion(ReleaseTrains.COMMONS, iteration); + final ArtifactVersion buildVersion = train.getModuleVersion(ReleaseTrains.BUILD, iteration); + final Repository repository = new Repository(iteration); File file = workspace.getFile(POM_XML, project); - XBFileIO io = projectionFactory.io().file(file); - Pom pom = io.read(Pom.class); - if (!project.equals(ReleaseTrains.COMMONS)) { - pom.setProperty("spring.data.commons", commonsVersion); - } + execute(file, new PomCallback() { - pom.setParentVersion(buildVersion); - pom.setRepositoryId(repository.getSnapshotId(), repository.getId()); - pom.setRepositoryUrl(repository.getId(), repository.getUrl()); + @Override + public Pom doWith(Pom pom) { - io.write(pom); + if (!project.equals(ReleaseTrains.COMMONS)) { + + System.out.println(pom.getProperty(COMMONS_VERSION_PROPERTY)); + pom.setProperty(COMMONS_VERSION_PROPERTY, commonsVersion); + } + + pom.setParentVersion(buildVersion); + pom.setRepositoryId("spring-libs-snapshot", "spring-libs-release"); + pom.setRepositoryUrl(repository.getId(), repository.getUrl()); + + return pom; + } + }); } /** @@ -130,4 +140,39 @@ public class MavenOperations { private boolean isMavenProject(Project project) { return workspace.getFile(POM_XML, project).exists(); } + + private void updateBomPom(final Train train, final Iteration iteration) throws Exception { + + File bomPomFile = workspace.getFile("bom/pom.xml", ReleaseTrains.BUILD); + + execute(bomPomFile, new PomCallback() { + + @Override + public Pom doWith(Pom pom) { + + for (ModuleIteration module : train.getModuleIterations(iteration, ReleaseTrains.BUILD)) { + + Artifact artifact = new Artifact(module); + pom.setDependencyVersion(artifact.getArtifactId(), artifact.getVersion()); + } + + return pom; + } + }); + } + + private void execute(File file, PomCallback callback) throws Exception { + + XBFileIO io = projectionFactory.io().file(file); + Pom pom = io.read(Pom.class); + + pom = callback.doWith(pom); + + io.write(pom); + } + + private interface PomCallback { + + public Pom doWith(Pom pom); + } } diff --git a/src/main/java/org/springframework/data/release/maven/Pom.java b/src/main/java/org/springframework/data/release/maven/Pom.java index 7fe5471..f48b8d5 100644 --- a/src/main/java/org/springframework/data/release/maven/Pom.java +++ b/src/main/java/org/springframework/data/release/maven/Pom.java @@ -34,21 +34,30 @@ public interface Pom { @XBWrite("/project/version") void setVersion(String version); - @XBRead("/project/repositories/repository[id=\"spring-libs-snapshot\"]") - Repository getSpringRepository(); - @XBWrite("/project/parent/version") void setParentVersion(ArtifactVersion version); + @XBRead("/project/properties/{0}") + String getProperty(String property); + @XBWrite("/project/properties/{0}") void setProperty(String property, @XBValue ArtifactVersion value); - @XBWrite("/project/repositories/repository[id={0}]/id") + @XBWrite("/project/repositories/repository[id=''{0}'']/id") void setRepositoryId(String oldId, @XBValue String newId); - @XBWrite("/project/repositories/repository[id={0}]/url") + @XBWrite("/project/repositories/repository[id=''{0}'']/url") void setRepositoryUrl(String id, @XBValue String url); + /** + * Sets the version of the dependency with the given artifact identifier to the given {@link ArtifactVersion}. + * + * @param artifactId + * @param version + */ + @XBWrite("/project/dependencies/dependency[artifactId=''{0}'']/version") + Pom setDependencyVersion(String artifactId, @XBValue ArtifactVersion version); + public interface Repository { @XBRead("child::id") diff --git a/src/main/java/org/springframework/data/release/misc/ReleaseOperations.java b/src/main/java/org/springframework/data/release/misc/ReleaseOperations.java new file mode 100644 index 0000000..4053584 --- /dev/null +++ b/src/main/java/org/springframework/data/release/misc/ReleaseOperations.java @@ -0,0 +1,83 @@ +/* + * Copyright 2014 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.misc; + +import java.io.File; +import java.nio.charset.Charset; +import java.util.Scanner; + +import lombok.RequiredArgsConstructor; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.release.io.Workspace; +import org.springframework.data.release.jira.Changelog; +import org.springframework.data.release.jira.JiraConnector; +import org.springframework.data.release.model.Iteration; +import org.springframework.data.release.model.ModuleIteration; +import org.springframework.data.release.model.ReleaseTrains; +import org.springframework.data.release.model.Train; +import org.springframework.stereotype.Component; +import org.springframework.util.Assert; + +import com.google.common.io.Files; + +/** + * @author Oliver Gierke + */ +@Component +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +public class ReleaseOperations { + + private final JiraConnector jira; + private final Workspace workspace; + + /** + * Creates {@link Changelog} instances for all modules of the given {@link Train} and {@link Iteration}. + * + * @param train must not be {@literal null}. + * @param iteration must not be {@literal null}. + * @throws Exception + */ + public void prepareChangelogs(Train train, Iteration iteration) throws Exception { + + Assert.notNull(train, "Release train must not be null!"); + Assert.notNull(iteration, "Iteration must not be null!"); + + for (ModuleIteration module : train.getModuleIterations(iteration, ReleaseTrains.BUILD)) { + + Changelog changelog = jira.getChangelogFor(module); + File file = workspace.getFile("src/main/resources/changelog.txt", module.getProject()); + StringBuilder builder = new StringBuilder(); + + try (Scanner scanner = new Scanner(file)) { + + // Copy headline + builder.append(scanner.nextLine()).append("\n"); + builder.append(scanner.nextLine()).append("\n"); + + // Add new changelog + builder.append(changelog.toString()); + + // Append existing + while (scanner.hasNextLine()) { + builder.append(scanner.nextLine()).append("\n"); + } + } + + Files.write(builder, file, Charset.forName("UTF-8")); + } + } +} diff --git a/src/main/java/org/springframework/data/release/model/ArtifactVersion.java b/src/main/java/org/springframework/data/release/model/ArtifactVersion.java index 85343c7..6034d0f 100644 --- a/src/main/java/org/springframework/data/release/model/ArtifactVersion.java +++ b/src/main/java/org/springframework/data/release/model/ArtifactVersion.java @@ -98,7 +98,7 @@ public class ArtifactVersion implements Comparable { } /** - * Returns the release version for the current a + * Returns the release version for the current one. * * @return */ @@ -106,14 +106,29 @@ public class ArtifactVersion implements Comparable { return new ArtifactVersion(version, RELEASE_SUFFIX); } + /** + * Returns the snapshot version of the current one. + * + * @return + */ public ArtifactVersion getSnapshotVersion() { return new ArtifactVersion(version, SNAPSHOT_SUFFIX); } + /** + * Returns whether the version is a release version. + * + * @return + */ public boolean isReleaseVersion() { return suffix.equals(RELEASE_SUFFIX); } + /** + * Returns whether the version is a milestone version. + * + * @return + */ public boolean isMilestoneVersion() { return suffix.matches(MILESTONE_SUFFIX); } @@ -148,4 +163,13 @@ public class ArtifactVersion implements Comparable { public String toString() { return String.format("%s.%s", version.toMajorMinorBugfix(), suffix); } + + /** + * Returns the {@link String} of the plain version (read: x.y.z, ommitting trailing bugfix zeros). + * + * @return + */ + public String toShortString() { + return version.toString(); + } } diff --git a/src/main/java/org/springframework/data/release/model/Module.java b/src/main/java/org/springframework/data/release/model/Module.java index 5f21ce9..e228bda 100644 --- a/src/main/java/org/springframework/data/release/model/Module.java +++ b/src/main/java/org/springframework/data/release/model/Module.java @@ -43,6 +43,10 @@ public class Module { : new Iteration(customFirstIteration, Iteration.RC1); } + public boolean hasName(String name) { + return project.getName().equalsIgnoreCase(name); + } + public boolean hasCustomFirstIteration() { return customFirstIteration != null; } diff --git a/src/main/java/org/springframework/data/release/model/ModuleIteration.java b/src/main/java/org/springframework/data/release/model/ModuleIteration.java index 190cbe5..62a8e09 100644 --- a/src/main/java/org/springframework/data/release/model/ModuleIteration.java +++ b/src/main/java/org/springframework/data/release/model/ModuleIteration.java @@ -16,6 +16,7 @@ package org.springframework.data.release.model; import lombok.EqualsAndHashCode; +import lombok.Getter; import lombok.RequiredArgsConstructor; /** @@ -25,9 +26,9 @@ import lombok.RequiredArgsConstructor; @EqualsAndHashCode public class ModuleIteration implements IterationVersion { - private final Module module; + private final @Getter Module module; private final Iteration iteration; - private final Train train; + private final @Getter Train train; public ProjectKey getProjectKey() { return module.getProject().getKey(); @@ -46,6 +47,10 @@ public class ModuleIteration implements IterationVersion { return module.getVersion(); } + /* + * (non-Javadoc) + * @see org.springframework.data.release.model.IterationVersion#getIteration() + */ public Iteration getIteration() { return module.hasCustomFirstIteration() ? module.getCustomFirstIteration() : this.iteration; } diff --git a/src/main/java/org/springframework/data/release/model/Train.java b/src/main/java/org/springframework/data/release/model/Train.java index bef5df1..758df5b 100644 --- a/src/main/java/org/springframework/data/release/model/Train.java +++ b/src/main/java/org/springframework/data/release/model/Train.java @@ -92,6 +92,17 @@ public class Train implements Iterable { return new Train(name, nextModules); } + public ModuleIteration getModuleIteration(Iteration iteration, String moduleName) { + + for (Module module : this) { + if (module.hasName(moduleName)) { + return new ModuleIteration(module, iteration, this); + } + } + + return null; + } + public Iterable getModuleIterations(Iteration iteration) { return getModuleIterations(iteration, new Project[0]); } diff --git a/src/test/java/org/springframework/data/release/cli/ReleaseCommandsIntegrationTests.java b/src/test/java/org/springframework/data/release/cli/ReleaseCommandsIntegrationTests.java index 8097e67..9d0b696 100644 --- a/src/test/java/org/springframework/data/release/cli/ReleaseCommandsIntegrationTests.java +++ b/src/test/java/org/springframework/data/release/cli/ReleaseCommandsIntegrationTests.java @@ -18,6 +18,7 @@ package org.springframework.data.release.cli; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; +import org.junit.Ignore; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.release.AbstractIntegrationTests; @@ -33,6 +34,7 @@ public class ReleaseCommandsIntegrationTests extends AbstractIntegrationTests { @Autowired GitOperations git; @Test + @Ignore public void predictsReleasTrainCorrectly() throws Exception { git.update(ReleaseTrains.DIJKSTRA); diff --git a/src/test/java/org/springframework/data/release/git/GitOperationsIntegrationTests.java b/src/test/java/org/springframework/data/release/git/GitOperationsIntegrationTests.java index 5754b2a..1e9af7c 100644 --- a/src/test/java/org/springframework/data/release/git/GitOperationsIntegrationTests.java +++ b/src/test/java/org/springframework/data/release/git/GitOperationsIntegrationTests.java @@ -15,6 +15,7 @@ */ package org.springframework.data.release.git; +import org.junit.Ignore; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.release.AbstractIntegrationTests; @@ -29,11 +30,13 @@ public class GitOperationsIntegrationTests extends AbstractIntegrationTests { @Autowired GitOperations gitOperations; @Test + @Ignore public void testname() throws Exception { gitOperations.update(ReleaseTrains.CODD); } @Test + @Ignore public void showTags() throws Exception { Tags tags = gitOperations.getTags(ReleaseTrains.COMMONS); diff --git a/src/test/java/org/springframework/data/release/jira/JiraVersionUnitTests.java b/src/test/java/org/springframework/data/release/jira/JiraVersionUnitTests.java index 3ee1160..5f10ce0 100644 --- a/src/test/java/org/springframework/data/release/jira/JiraVersionUnitTests.java +++ b/src/test/java/org/springframework/data/release/jira/JiraVersionUnitTests.java @@ -20,10 +20,12 @@ import static org.junit.Assert.*; import org.junit.Test; import org.springframework.data.release.model.Iteration; -import org.springframework.data.release.model.Module; +import org.springframework.data.release.model.ModuleIteration; import org.springframework.data.release.model.ReleaseTrains; /** + * Unit tests for {@link JiraVersion}. + * * @author Oliver Gierke */ public class JiraVersionUnitTests { @@ -44,17 +46,17 @@ public class JiraVersionUnitTests { @Test public void usesCustomModuleIterationStartVersion() { - Module commons = ReleaseTrains.DIJKSTRA.getModule("Elasticsearch"); + ModuleIteration module = ReleaseTrains.DIJKSTRA.getModuleIteration(Iteration.M1, "Elasticsearch"); - JiraVersion version = new JiraVersion(commons, ReleaseTrains.DIJKSTRA, Iteration.M1); + JiraVersion version = new JiraVersion(module); assertThat(version.toString(), is("1.0 M2 (Dijkstra)")); } private void assertIterationVersion(Iteration iteration, String expected) { - Module commons = ReleaseTrains.DIJKSTRA.getModule("Commons"); + ModuleIteration module = ReleaseTrains.DIJKSTRA.getModuleIteration(iteration, "Commons"); - JiraVersion version = new JiraVersion(commons, ReleaseTrains.DIJKSTRA, iteration); + JiraVersion version = new JiraVersion(module); assertThat(version.toString(), is(expected)); } } diff --git a/src/test/java/org/springframework/data/release/maven/MavenVersionUnitTests.java b/src/test/java/org/springframework/data/release/model/ArtifactVersionUnitTests.java similarity index 94% rename from src/test/java/org/springframework/data/release/maven/MavenVersionUnitTests.java rename to src/test/java/org/springframework/data/release/model/ArtifactVersionUnitTests.java index f13edfa..f910cea 100644 --- a/src/test/java/org/springframework/data/release/maven/MavenVersionUnitTests.java +++ b/src/test/java/org/springframework/data/release/model/ArtifactVersionUnitTests.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.data.release.maven; +package org.springframework.data.release.model; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; @@ -22,13 +22,12 @@ import org.junit.Test; import org.springframework.data.release.model.ArtifactVersion; import org.springframework.data.release.model.Iteration; import org.springframework.data.release.model.IterationVersion; -import org.springframework.data.release.model.SimpleIterationVersion; import org.springframework.data.release.model.Version; /** * @author Oliver Gierke */ -public class MavenVersionUnitTests { +public class ArtifactVersionUnitTests { @Test(expected = IllegalArgumentException.class) public void rejectsInvalidVersionSuffix() {