Skip to content

Commit f466f6b

Browse files
authored
Add heuristics (#37)
1 parent f22951c commit f466f6b

File tree

2 files changed

+81
-5
lines changed

2 files changed

+81
-5
lines changed

internal/github/find-pr.go

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,74 @@ package github
66

77
import (
88
"context"
9+
"errors"
910
"fmt"
11+
"regexp"
12+
"strconv"
13+
14+
"github.com/google/go-github/v32/github"
1015
)
1116

17+
type Strategy interface {
18+
FindPullRequestID(pr *github.PullRequest) (int, error)
19+
}
20+
21+
var ErrStrategyFailed = errors.New("strategy failed")
22+
23+
type BackportPRNumber struct {
24+
Strategy
25+
}
26+
27+
func (s *BackportPRNumber) FindPullRequestID(pr *github.PullRequest) (int, error) {
28+
patterns := []string{`backport #(\d+)`, `cherry-pick of #(\d+)`, `cherry-pick of PR #(\d+)`}
29+
rDigit, _ := regexp.Compile(`(\d+)`)
30+
31+
for _, label := range pr.Labels {
32+
if label.GetName() == "backport" {
33+
for _, p := range patterns {
34+
regexPattern, _ := regexp.Compile(p)
35+
backport := regexPattern.FindString(pr.GetTitle())
36+
if backport == "" {
37+
backport = regexPattern.FindString(*pr.Body)
38+
}
39+
40+
PRNumber, err := strconv.Atoi(rDigit.FindString(backport))
41+
if err == nil {
42+
return PRNumber, err
43+
}
44+
}
45+
}
46+
}
47+
return -1, ErrStrategyFailed
48+
}
49+
50+
type PRNumber struct {
51+
Strategy
52+
}
53+
54+
func (s *PRNumber) FindPullRequestID(pr *github.PullRequest) (int, error) {
55+
if pr.Number != nil {
56+
return pr.GetNumber(), nil
57+
}
58+
return -1, ErrStrategyFailed
59+
}
60+
61+
func TestStrategies(pr *github.PullRequest, strategies ...Strategy) (int, error) {
62+
var (
63+
prID int
64+
err error
65+
)
66+
67+
for _, s := range strategies {
68+
prID, err = s.FindPullRequestID(pr)
69+
if err == nil {
70+
break
71+
}
72+
}
73+
74+
return prID, err
75+
}
76+
1277
type PRForCommit struct {
1378
CommitHash string `json:"commit"`
1479
PullRequestID int `json:"pull-request"`
@@ -29,10 +94,18 @@ func FindPR(ctx context.Context, c *Client, owner, repo, commit string) (FoundPR
2994
Items: make([]PRForCommit, len(prs)),
3095
}
3196

97+
backportStrategy := &BackportPRNumber{}
98+
prNumberStrategy := &PRNumber{}
99+
32100
for i, pr := range prs {
101+
prID, err := TestStrategies(pr, backportStrategy, prNumberStrategy)
102+
if err != nil {
103+
return FoundPRs{}, fmt.Errorf("failed testing strategies: %w", err)
104+
}
105+
33106
respData.Items[i] = PRForCommit{
34107
CommitHash: commit,
35-
PullRequestID: pr.GetNumber(),
108+
PullRequestID: prID,
36109
}
37110
}
38111

internal/github/find-pr_test.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,17 @@ func TestFindPR_backport(t *testing.T) {
4141
res, err := github.FindPR(ctx, c, "elastic", "beats", "fe25c73907336fc462d5e6e059d3cd86512484fe")
4242
require.NoError(t, err)
4343
require.Len(t, res.Items, 4)
44+
// not a backport: https://github.com/elastic/beats/pull/31396
4445
require.Equal(t, 31396, res.Items[0].PullRequestID)
45-
require.Equal(t, 31417, res.Items[1].PullRequestID)
46-
require.Equal(t, 31382, res.Items[2].PullRequestID)
47-
require.Equal(t, 31343, res.Items[3].PullRequestID)
46+
// backport: https://github.com/elastic/beats/pull/31417 => source: https://github.com/elastic/beats/issues/31013
47+
require.Equal(t, 31013, res.Items[1].PullRequestID)
48+
// backport: https://github.com/elastic/beats/pull/31396 => source: https://github.com/elastic/beats/issues/31369
49+
require.Equal(t, 31369, res.Items[2].PullRequestID)
50+
// backport: https://github.com/elastic/beats/pull/31343 => source: https://github.com/elastic/beats/pull/31279
51+
require.Equal(t, 31279, res.Items[3].PullRequestID)
4852
}
4953

5054
func TestFindPR_forwardport(t *testing.T) {
51-
t.Skip("this behaviour is not yet implemented")
5255
r, hc := getHttpClient(t)
5356
defer r.Stop() //nolint:errcheck
5457

0 commit comments

Comments
 (0)