Skip to content

Commit 289e13d

Browse files
committed
Sync team labels from issues to PRs when PRs are opened
Signed-off-by: stianst <stianst@gmail.com>
1 parent 96149fa commit 289e13d

3 files changed

Lines changed: 88 additions & 0 deletions

File tree

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package org.keycloak.gh.bot;
2+
3+
import io.quarkiverse.githubapp.event.PullRequest;
4+
import org.jboss.logging.Logger;
5+
import org.keycloak.gh.bot.utils.CommitUtils;
6+
import org.kohsuke.github.*;
7+
import org.slf4j.LoggerFactory;
8+
9+
import java.io.IOException;
10+
import java.util.HashSet;
11+
import java.util.List;
12+
import java.util.Set;
13+
import java.util.stream.Collectors;
14+
15+
public class SyncPRTeamLabels {
16+
17+
private static final Logger logger = Logger.getLogger(SyncPRTeamLabels.class);
18+
private static final org.slf4j.Logger log = LoggerFactory.getLogger(SyncPRTeamLabels.class);
19+
20+
void onOpen(@PullRequest.Opened GHEventPayload.PullRequest payload) throws IOException {
21+
GHPullRequest pullRequest = payload.getPullRequest();
22+
List<String> commitMessages = pullRequest.listCommits().toList().stream().map(i -> i.getCommit().getMessage()).toList();
23+
24+
Set<String> teamLabelsToAdd = new HashSet<>();
25+
26+
for (String commitMessage : commitMessages) {
27+
Integer issuerNumber = CommitUtils.getIssuerNumber(commitMessage);
28+
if (issuerNumber != null) {
29+
GHRepository repository = payload.getRepository();
30+
GHIssue issue = repository.getIssue(issuerNumber);
31+
logger.infov("PR {0} {1} linked to issue {2} {3}", pullRequest.getNumber(), pullRequest.getTitle(), issue.getNumber(), issue.getTitle());
32+
33+
issue.getLabels().stream().map(GHLabel::getName).filter(l -> l.startsWith("team/")).forEach(teamLabelsToAdd::add);
34+
}
35+
}
36+
37+
if (!teamLabelsToAdd.isEmpty()) {
38+
logger.infov("Adding labels {0} to PR {1}", String.join(",", teamLabelsToAdd), pullRequest.getNumber());
39+
pullRequest.addLabels(teamLabelsToAdd.toArray(new String[0]));
40+
} else {
41+
logger.infov("No team labels found for PR {0}", pullRequest.getNumber());
42+
}
43+
}
44+
45+
46+
47+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.keycloak.gh.bot.utils;
2+
3+
import java.util.regex.Matcher;
4+
import java.util.regex.Pattern;
5+
6+
public class CommitUtils {
7+
8+
private static final Pattern LINKED_ISSUE_PATTERN = Pattern.compile("(([c|C]loses)|([f|F]ixes)|([r|R]esolves)) #([0-9]*)");
9+
10+
public static Integer getIssuerNumber(String commitMessage) {
11+
Matcher matcher = LINKED_ISSUE_PATTERN.matcher(commitMessage);
12+
if (matcher.find() && matcher.groupCount() == 5) {
13+
try {
14+
return Integer.valueOf(matcher.group(5));
15+
} catch (NumberFormatException e) {
16+
}
17+
}
18+
return null;
19+
}
20+
21+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.keycloak.gh.bot.utils;
2+
3+
import org.junit.jupiter.api.Assertions;
4+
import org.junit.jupiter.api.Test;
5+
6+
public class CommitUtilsTest {
7+
8+
@Test
9+
public void testCloses() {
10+
Assertions.assertEquals(1232456, CommitUtils.getIssuerNumber("This is some commit message\nCloses #1232456 and something else"));
11+
Assertions.assertEquals(1232456, CommitUtils.getIssuerNumber("This is some commit message\ncloses #1232456 and something else"));
12+
Assertions.assertEquals(1232456, CommitUtils.getIssuerNumber("This is some commit message\nFixes #1232456 and something else\nSomething else"));
13+
Assertions.assertEquals(1232456, CommitUtils.getIssuerNumber("This is some commit message\nfixes #1232456 and something else\nSomething else"));
14+
Assertions.assertEquals(1232456, CommitUtils.getIssuerNumber("Resolves #1232456 and something else\nSomething else"));
15+
Assertions.assertEquals(1232456, CommitUtils.getIssuerNumber("resolves #1232456 and something else\nSomething else"));
16+
Assertions.assertNull(CommitUtils.getIssuerNumber("Some message\nResolves 1232456"));
17+
Assertions.assertNull(CommitUtils.getIssuerNumber("Some message\nResolves: #1232456"));
18+
}
19+
20+
}

0 commit comments

Comments
 (0)