diff --git a/src/main/java/org/springframework/data/release/git/GiCommands.java b/src/main/java/org/springframework/data/release/git/GitCommands.java similarity index 97% rename from src/main/java/org/springframework/data/release/git/GiCommands.java rename to src/main/java/org/springframework/data/release/git/GitCommands.java index a98956b..0afaf99 100644 --- a/src/main/java/org/springframework/data/release/git/GiCommands.java +++ b/src/main/java/org/springframework/data/release/git/GitCommands.java @@ -32,7 +32,7 @@ import org.springframework.util.StringUtils; */ @Component @RequiredArgsConstructor(onConstructor = @__(@Autowired)) -class GiCommands implements CommandMarker { +public class GitCommands implements CommandMarker { private final GitOperations git; diff --git a/src/main/java/org/springframework/data/release/jira/GitHubIssue.java b/src/main/java/org/springframework/data/release/jira/GitHubIssue.java index 7e0edde..10578d5 100644 --- a/src/main/java/org/springframework/data/release/jira/GitHubIssue.java +++ b/src/main/java/org/springframework/data/release/jira/GitHubIssue.java @@ -17,6 +17,8 @@ package org.springframework.data.release.jira; import lombok.Data; +import org.springframework.data.release.model.ModuleIteration; + /** * @author Oliver Gierke */ @@ -25,4 +27,12 @@ class GitHubIssue { private String number; private String title; + + public String getId() { + return "#".concat(number); + } + + public boolean isReleaseTicket(ModuleIteration module) { + return title.contains("Release") && title.contains(module.getVersionString()); + } } diff --git a/src/main/java/org/springframework/data/release/jira/GitHubIssueTracker.java b/src/main/java/org/springframework/data/release/jira/GitHubIssueTracker.java index 4a7c7b4..552ede0 100644 --- a/src/main/java/org/springframework/data/release/jira/GitHubIssueTracker.java +++ b/src/main/java/org/springframework/data/release/jira/GitHubIssueTracker.java @@ -25,6 +25,7 @@ import java.util.Map; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.core.ParameterizedTypeReference; @@ -33,6 +34,7 @@ import org.springframework.data.release.git.GitServer; import org.springframework.data.release.model.Iteration; import org.springframework.data.release.model.ModuleIteration; import org.springframework.data.release.model.Project; +import org.springframework.data.release.model.Projects; import org.springframework.data.release.model.ReleaseTrains; import org.springframework.data.release.model.Tracker; import org.springframework.data.release.model.TrainIteration; @@ -58,27 +60,36 @@ class GitHubIssueTracker implements IssueTracker { private final RestOperations operations; private final Logger logger; + /* + * (non-Javadoc) + * @see org.springframework.data.release.jira.IssueTracker#getReleaseTicketFor(org.springframework.data.release.model.ModuleIteration) + */ + @Override + @Cacheable("release-tickets") + public Ticket getReleaseTicketFor(ModuleIteration module) { + + for (GitHubIssue issue : getIssuesFor(module)) { + if (issue.isReleaseTicket(module)) { + return new Ticket(issue.getId(), issue.getTitle()); + } + } + + throw new IllegalArgumentException(String.format("Could not find a release ticket for %s!", module)); + } + /* * (non-Javadoc) * @see org.springframework.data.release.jira.IssueTracker#getChangelogFor(org.springframework.data.release.model.ModuleIteration) */ @Override + @Cacheable("changelogs") public Changelog getChangelogFor(ModuleIteration module) { - String repositoryName = new GitProject(module.getProject(), new GitServer()).getRepositoryName(); - - GitHubMilestone milestone = findMilestone(module, repositoryName); - - Map parameters = new HashMap<>(); - parameters.put("repoName", repositoryName); - parameters.put("id", milestone.getNumber()); - - List issues = operations.exchange(URI_TEMPLATE, HttpMethod.GET, null, ISSUES_TYPE, parameters) - .getBody(); + List issues = getIssuesFor(module); List tickets = new ArrayList<>(issues.size()); for (GitHubIssue issue : issues) { - tickets.add(new Ticket("#" + issue.getNumber(), issue.getTitle())); + tickets.add(new Ticket(issue.getId(), issue.getTitle())); } logger.log(module, "Created changelog with %s entries.", tickets.size()); @@ -95,6 +106,19 @@ class GitHubIssueTracker implements IssueTracker { return project.uses(Tracker.GITHUB); } + private List getIssuesFor(ModuleIteration module) { + + String repositoryName = new GitProject(module.getProject(), new GitServer()).getRepositoryName(); + + GitHubMilestone milestone = findMilestone(module, repositoryName); + + Map parameters = new HashMap<>(); + parameters.put("repoName", repositoryName); + parameters.put("id", milestone.getNumber()); + + return operations.exchange(URI_TEMPLATE, HttpMethod.GET, null, ISSUES_TYPE, parameters).getBody(); + } + private GitHubMilestone findMilestone(ModuleIteration module, String repositoryName) { for (String state : Arrays.asList("close", "open")) { @@ -132,12 +156,15 @@ class GitHubIssueTracker implements IssueTracker { try (ConfigurableApplicationContext context = new ClassPathXmlApplicationContext( "META-INF/spring/spring-shell-plugin.xml")) { - GitHubIssueTracker tracker = context.getBean(GitHubIssueTracker.class); + IssueTracker tracker = context.getBean("gitHubIssueTracker", IssueTracker.class); TrainIteration iteration = new TrainIteration(ReleaseTrains.CODD, Iteration.SR2); - Changelog changelog = tracker.getChangelogFor(iteration.getModule("Build")); + ModuleIteration module = iteration.getModule(Projects.BUILD); + Changelog changelog = tracker.getChangelogFor(module); System.out.println(changelog); + + System.out.println(tracker.getReleaseTicketFor(module)); } } } diff --git a/src/main/java/org/springframework/data/release/jira/IssueTracker.java b/src/main/java/org/springframework/data/release/jira/IssueTracker.java index 9af5a21..cce5634 100644 --- a/src/main/java/org/springframework/data/release/jira/IssueTracker.java +++ b/src/main/java/org/springframework/data/release/jira/IssueTracker.java @@ -24,5 +24,13 @@ import org.springframework.plugin.core.Plugin; */ public interface IssueTracker extends Plugin { + /** + * Returns the {@link Ticket} that tracks modifications in the context of a release. + * + * @param module the module to lookup the {@link Ticket} for. + * @return + */ + Ticket getReleaseTicketFor(ModuleIteration module); + Changelog getChangelogFor(ModuleIteration iteration); } diff --git a/src/main/java/org/springframework/data/release/jira/Jira.java b/src/main/java/org/springframework/data/release/jira/Jira.java index 3faf275..6ac1e81 100644 --- a/src/main/java/org/springframework/data/release/jira/Jira.java +++ b/src/main/java/org/springframework/data/release/jira/Jira.java @@ -175,6 +175,7 @@ class Jira implements JiraConnector { * @see org.springframework.data.release.jira.JiraConnector#getChangelogFor(org.springframework.data.release.model.Module, org.springframework.data.release.model.Iteration) */ @Override + @Cacheable("changelogs") public Changelog getChangelogFor(ModuleIteration module) { Map parameters = new HashMap<>(); 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 45af741..21b638f 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,6 @@ package org.springframework.data.release.jira; import org.springframework.data.release.model.Iteration; -import org.springframework.data.release.model.ModuleIteration; import org.springframework.data.release.model.Train; import org.springframework.data.release.model.TrainIteration; @@ -27,8 +26,6 @@ public interface JiraConnector extends IssueTracker { void reset(); - Ticket getReleaseTicketFor(ModuleIteration iteration); - /** * Returns all {@link Tickets} for the given {@link Train} and {@link Iteration}. *