Create aggregator issue in Spring Data Build for all-repositories ticket creation.
Closes #87
This commit is contained in:
@@ -116,15 +116,31 @@ public interface IssueTracker extends Plugin<SupportedProject> {
|
||||
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.
|
||||
|
||||
@@ -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<ModuleIteration> isBuildProject = module -> module.getProject() == Projects.BUILD;
|
||||
|
||||
List<Ticket> 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<Ticket> 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"));
|
||||
}
|
||||
|
||||
@@ -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()));
|
||||
|
||||
@@ -37,7 +37,7 @@ import org.springframework.util.Assert;
|
||||
@With
|
||||
class GitHubWriteIssue implements GitHubIssue {
|
||||
|
||||
String number, title, state;
|
||||
String number, title, body, state;
|
||||
List<Object> assignees;
|
||||
Long milestone;
|
||||
List<String> 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) {
|
||||
|
||||
Reference in New Issue
Block a user