Skip to content

Commit

Permalink
Add heuristics (#37)
Browse files Browse the repository at this point in the history
  • Loading branch information
lucian-ioan authored Apr 27, 2022
1 parent f22951c commit f466f6b
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 5 deletions.
75 changes: 74 additions & 1 deletion internal/github/find-pr.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,74 @@ package github

import (
"context"
"errors"
"fmt"
"regexp"
"strconv"

"github.com/google/go-github/v32/github"
)

type Strategy interface {
FindPullRequestID(pr *github.PullRequest) (int, error)
}

var ErrStrategyFailed = errors.New("strategy failed")

type BackportPRNumber struct {
Strategy
}

func (s *BackportPRNumber) FindPullRequestID(pr *github.PullRequest) (int, error) {
patterns := []string{`backport #(\d+)`, `cherry-pick of #(\d+)`, `cherry-pick of PR #(\d+)`}
rDigit, _ := regexp.Compile(`(\d+)`)

for _, label := range pr.Labels {
if label.GetName() == "backport" {
for _, p := range patterns {
regexPattern, _ := regexp.Compile(p)
backport := regexPattern.FindString(pr.GetTitle())
if backport == "" {
backport = regexPattern.FindString(*pr.Body)
}

PRNumber, err := strconv.Atoi(rDigit.FindString(backport))
if err == nil {
return PRNumber, err
}
}
}
}
return -1, ErrStrategyFailed
}

type PRNumber struct {
Strategy
}

func (s *PRNumber) FindPullRequestID(pr *github.PullRequest) (int, error) {
if pr.Number != nil {
return pr.GetNumber(), nil
}
return -1, ErrStrategyFailed
}

func TestStrategies(pr *github.PullRequest, strategies ...Strategy) (int, error) {
var (
prID int
err error
)

for _, s := range strategies {
prID, err = s.FindPullRequestID(pr)
if err == nil {
break
}
}

return prID, err
}

type PRForCommit struct {
CommitHash string `json:"commit"`
PullRequestID int `json:"pull-request"`
Expand All @@ -29,10 +94,18 @@ func FindPR(ctx context.Context, c *Client, owner, repo, commit string) (FoundPR
Items: make([]PRForCommit, len(prs)),
}

backportStrategy := &BackportPRNumber{}
prNumberStrategy := &PRNumber{}

for i, pr := range prs {
prID, err := TestStrategies(pr, backportStrategy, prNumberStrategy)
if err != nil {
return FoundPRs{}, fmt.Errorf("failed testing strategies: %w", err)
}

respData.Items[i] = PRForCommit{
CommitHash: commit,
PullRequestID: pr.GetNumber(),
PullRequestID: prID,
}
}

Expand Down
11 changes: 7 additions & 4 deletions internal/github/find-pr_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,17 @@ func TestFindPR_backport(t *testing.T) {
res, err := github.FindPR(ctx, c, "elastic", "beats", "fe25c73907336fc462d5e6e059d3cd86512484fe")
require.NoError(t, err)
require.Len(t, res.Items, 4)
// not a backport: https://github.com/elastic/beats/pull/31396
require.Equal(t, 31396, res.Items[0].PullRequestID)
require.Equal(t, 31417, res.Items[1].PullRequestID)
require.Equal(t, 31382, res.Items[2].PullRequestID)
require.Equal(t, 31343, res.Items[3].PullRequestID)
// backport: https://github.com/elastic/beats/pull/31417 => source: https://github.com/elastic/beats/issues/31013
require.Equal(t, 31013, res.Items[1].PullRequestID)
// backport: https://github.com/elastic/beats/pull/31396 => source: https://github.com/elastic/beats/issues/31369
require.Equal(t, 31369, res.Items[2].PullRequestID)
// backport: https://github.com/elastic/beats/pull/31343 => source: https://github.com/elastic/beats/pull/31279
require.Equal(t, 31279, res.Items[3].PullRequestID)
}

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

Expand Down

0 comments on commit f466f6b

Please sign in to comment.