Create aggregator issue in Spring Data Build for all-repositories ticket creation.

Closes #87
This commit is contained in:
Mark Paluch
2024-06-20 14:48:54 +02:00
parent 35439d59dd
commit 89acc2c34a
4 changed files with 59 additions and 22 deletions

View File

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

View File

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

View File

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

View File

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