diff --git a/src/main/java/org/springframework/data/release/issues/IssueTracker.java b/src/main/java/org/springframework/data/release/issues/IssueTracker.java index 23ae965..7a90b63 100644 --- a/src/main/java/org/springframework/data/release/issues/IssueTracker.java +++ b/src/main/java/org/springframework/data/release/issues/IssueTracker.java @@ -116,15 +116,31 @@ public interface IssueTracker extends Plugin { void createReleaseTicket(ModuleIteration module); /** - * Creates a ticket for the given {@link ModuleIteration} and summary {@code text}. + * Creates a ticket for the given {@link ModuleIteration} and summary {@code subject}. * * @param module must not be {@literal null}. - * @param text the text to use. + * @param subject the subject to use. * @param ticketType the ticket type. * @param assignToCurrentUser * @return the created ticket. */ - Ticket createTicket(ModuleIteration module, String text, TicketType ticketType, boolean assignToCurrentUser); + default Ticket createTicket(ModuleIteration module, String subject, TicketType ticketType, + boolean assignToCurrentUser) { + return createTicket(module, subject, "", ticketType, assignToCurrentUser); + } + + /** + * Creates a ticket for the given {@link ModuleIteration} and summary {@code subject}. + * + * @param module must not be {@literal null}. + * @param subject the subject to use. + * @param description the description to use. + * @param ticketType the ticket type. + * @param assignToCurrentUser + * @return the created ticket. + */ + Ticket createTicket(ModuleIteration module, String subject, String description, TicketType ticketType, + boolean assignToCurrentUser); /** * Assigns the ticket to the current user. diff --git a/src/main/java/org/springframework/data/release/issues/IssueTrackerCommands.java b/src/main/java/org/springframework/data/release/issues/IssueTrackerCommands.java index 20f450e..9e6123c 100644 --- a/src/main/java/org/springframework/data/release/issues/IssueTrackerCommands.java +++ b/src/main/java/org/springframework/data/release/issues/IssueTrackerCommands.java @@ -22,6 +22,8 @@ import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.experimental.FieldDefaults; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.Executor; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -132,12 +134,31 @@ public class IssueTrackerCommands extends TimedCommand { @CliCommand(value = "tracker create tickets") public String createTickets(@CliOption(key = "iteration", mandatory = true) TrainIteration iteration, - @CliOption(key = "text", mandatory = true) String text) { + @CliOption(key = "subject", mandatory = true) String subject, + @CliOption(key = "description", mandatory = false) String description) { - return iteration.stream().// - map(module -> getTrackerFor(module).createTicket(module, text, IssueTracker.TicketType.Task, false)) - .collect(Tickets.toTicketsCollector()) - .toString(); + Predicate isBuildProject = module -> module.getProject() == Projects.BUILD; + + List tickets = iteration.stream() // + .filter(isBuildProject.negate()) // + .map(module -> getTrackerFor(module).createTicket(module, subject, IssueTracker.TicketType.Task, false)) + .collect(Collectors.toList()); + + StringBuilder body = new StringBuilder(); + + for (Ticket ticket : tickets) { + body.append("- [ ] ").append(ticket.getUrl()).append("\n"); + } + + ModuleIteration module = iteration.getModule(Projects.BUILD); + Ticket buildTicket = getTrackerFor(module).createTicket(module, subject, body.toString(), + IssueTracker.TicketType.Task, false); + + List allTickets = new ArrayList<>(); + allTickets.add(buildTicket); + allTickets.addAll(tickets); + + return new Tickets(allTickets).toString(); } @CliCommand("tracker open-tickets") @@ -169,11 +190,9 @@ public class IssueTrackerCommands extends TimedCommand { return getTicketsForProject(iteration, Projects.requiredByName(moduleName), ticketPredicate); } - return ExecutionUtils.runAndReturn(executor, iteration, - moduleIteration -> { - return getTicketsForProject(iteration, moduleIteration.getModule().getProject(), ticketPredicate); - }) - .stream() // + return ExecutionUtils.runAndReturn(executor, iteration, moduleIteration -> { + return getTicketsForProject(iteration, moduleIteration.getModule().getProject(), ticketPredicate); + }).stream() // .filter(StringUtils::hasText) // .collect(Collectors.joining("\n")); } diff --git a/src/main/java/org/springframework/data/release/issues/github/GitHub.java b/src/main/java/org/springframework/data/release/issues/github/GitHub.java index 6c5ea18..7df5b5a 100644 --- a/src/main/java/org/springframework/data/release/issues/github/GitHub.java +++ b/src/main/java/org/springframework/data/release/issues/github/GitHub.java @@ -259,19 +259,20 @@ public class GitHub extends GitHubSupport implements IssueTracker { logger.log(moduleIteration, "Creating release ticket…"); - doCreateTicket(moduleIteration, Tracker.releaseTicketSummary(moduleIteration), TicketType.Task, false); + doCreateTicket(moduleIteration, Tracker.releaseTicketSummary(moduleIteration), null, TicketType.Task, false); } @Override - public Ticket createTicket(ModuleIteration moduleIteration, String text, TicketType ticketType, + public Ticket createTicket(ModuleIteration moduleIteration, String subject, String description, TicketType ticketType, boolean assignToCurrentUser) { logger.log(moduleIteration, "Creating ticket…"); - return doCreateTicket(moduleIteration, text, ticketType, assignToCurrentUser); + return doCreateTicket(moduleIteration, subject, description, ticketType, assignToCurrentUser); } - private Ticket doCreateTicket(ModuleIteration moduleIteration, String text, TicketType ticketType, + private Ticket doCreateTicket(ModuleIteration moduleIteration, String subject, String description, + TicketType ticketType, boolean assignToCurrentUser) { String repositoryName = GitProject.of(moduleIteration).getRepositoryName(); @@ -279,7 +280,8 @@ public class GitHub extends GitHubSupport implements IssueTracker { Label label = TICKET_LABELS.get(ticketType); - GitHubWriteIssue gitHubIssue = GitHubWriteIssue.of(text, milestone).withLabel(label.getName()); + GitHubWriteIssue gitHubIssue = GitHubWriteIssue.of(subject, milestone).withBody(description) + .withLabel(label.getName()); if (assignToCurrentUser) { gitHubIssue = gitHubIssue.withAssignees(Collections.singletonList(properties.getUsername())); diff --git a/src/main/java/org/springframework/data/release/issues/github/GitHubWriteIssue.java b/src/main/java/org/springframework/data/release/issues/github/GitHubWriteIssue.java index 3422fe0..6746a88 100644 --- a/src/main/java/org/springframework/data/release/issues/github/GitHubWriteIssue.java +++ b/src/main/java/org/springframework/data/release/issues/github/GitHubWriteIssue.java @@ -37,7 +37,7 @@ import org.springframework.util.Assert; @With class GitHubWriteIssue implements GitHubIssue { - String number, title, state; + String number, title, body, state; List assignees; Long milestone; List labels; @@ -48,17 +48,17 @@ class GitHubWriteIssue implements GitHubIssue { } public static GitHubWriteIssue of(String title, Milestone milestone) { - return new GitHubWriteIssue(null, title, null, null, milestone.getNumber(), null); + return new GitHubWriteIssue(null, title, null, null, null, milestone.getNumber(), null); } public static GitHubWriteIssue assignedTo(String username) { Assert.hasText(username, "Username must not be null or empty!"); - return new GitHubWriteIssue(null, null, null, Collections.singletonList(username), null, null); + return new GitHubWriteIssue(null, null, null, null, Collections.singletonList(username), null, null); } public GitHubWriteIssue close() { - return new GitHubWriteIssue(this.number, this.title, "closed", this.assignees, null, null); + return new GitHubWriteIssue(this.number, this.title, "closed", null, this.assignees, null, null); } public GitHubWriteIssue withLabel(String labelName) {