Updates to match new primary repo.

This commit is contained in:
2023-10-02 14:38:49 -04:00
parent db5da9bb48
commit 8f7b16a9ae
13 changed files with 545 additions and 229 deletions

View File

@@ -1,7 +1,7 @@
package main
import (
"log"
"fmt"
"regexp"
"strconv"
"strings"
@@ -9,34 +9,53 @@ import (
"github.com/andygrunwald/go-jira"
)
const (
JIRA_URL = "https://jirawms.mda.ca"
)
type IssueReader struct {
auth jira.BasicAuthTransport //auth data
client *jira.Client //jira client
score map[string]int //score information
auth jira.BasicAuthTransport //auth data
client *jira.Client //jira client
score map[string]int //score information
settings *DashSettings
available bool //flag letting us know if the client is currentl available
}
func NewIssueReader(user, pass string) *IssueReader {
func NewIssueReader(user, pass string, s *DashSettings) *IssueReader {
ir := &IssueReader{
auth: jira.BasicAuthTransport{
Username: strings.TrimSpace(user),
Password: strings.TrimSpace(pass),
},
score: make(map[string]int),
}
var err error
ir.client, err = jira.NewClient(ir.auth.Client(), strings.TrimSpace(JIRA_URL))
if err != nil {
log.Fatal(err)
score: make(map[string]int),
settings: s,
available: false,
}
ir.Reconnect()
return ir
}
func (i *IssueReader) Reconnect() {
i.client = nil
if i.settings.Jira.Url != "" {
var err error
i.client, err = jira.NewClient(i.auth.Client(), strings.TrimSpace(i.settings.Jira.Url))
if err != nil {
DashLogger.Log(fmt.Sprintf("%v", err))
i.available = false
} else {
i.available = true
}
}
}
// forcibly drops the client (recoverable only through manual reconnection)
func (i *IssueReader) DropClient() {
i.client = nil
i.available = false
}
func (i *IssueReader) IsAvailable() bool {
return i.available
}
func (i *IssueReader) GetScores() map[string]int {
return i.score
}
@@ -48,19 +67,34 @@ func (i *IssueReader) ZeroScores() {
}
func (i *IssueReader) BuildBountyJQL() string {
var epiclink string
epiclink = "("
for k, epicid := range i.settings.Jira.Epics {
epiclink = epiclink + `"Epic Link" = ` + epicid
if k != len(i.settings.Jira.Epics)-1 {
epiclink = epiclink + " OR "
}
}
epiclink = epiclink + ")"
query := fmt.Sprintf(`project=%s AND %s AND Status = Accepted`, i.settings.Jira.Project, epiclink)
return query
}
func (i *IssueReader) RefreshScores() map[string]int {
i.ZeroScores()
poIssues, er := i.GetAllIssues(i.client, GetBountyJQL())
poIssues, er := i.GetAllIssues(i.client, i.BuildBountyJQL())
if er != nil {
log.Fatal(er)
}
//run through each to check if we've got bounty points to award
for _, issue := range poIssues {
teamId := i.ParseCustomTeamField(issue.Fields.Unknowns[CUSTOM_FIELD_TEAM])
i.ExtractScoreFromComments(teamId, issue.Key)
DashLogger.Log(fmt.Sprintf("%v\n", er))
} else {
i.ZeroScores()
//run through each to check if we've got bounty points to award
for _, issue := range poIssues {
teamId := i.ParseCustomTeamField(issue.Fields.Unknowns[i.settings.Jira.Teamfield])
i.ExtractScoreFromComments(teamId, issue.Key)
}
}
return i.GetScores()
@@ -80,7 +114,7 @@ func (i *IssueReader) ExtractScoreFromComments(teamId string, key string) {
if i.IsValidTeam(teamId) {
is, _, err := i.client.Issue.Get(key, nil)
if err != nil {
log.Fatal(err)
DashLogger.Fatal(err)
}
comments := is.Fields.Comments.Comments
@@ -95,7 +129,7 @@ func (i *IssueReader) ExtractScoreFromComments(teamId string, key string) {
// check if s exists in Scrum Teams list
func (i *IssueReader) IsValidTeam(s string) bool {
for _, t := range GetTeamNames() {
for _, t := range i.settings.Teams {
if strings.Compare(strings.ToLower(s), strings.ToLower(t)) == 0 {
return true
}
@@ -106,14 +140,14 @@ func (i *IssueReader) IsValidTeam(s string) bool {
// given a jira.Comment, find and extract the associated PO Bounty points
func (i *IssueReader) ExtractBountyFromComment(c *jira.Comment) int {
result := 0
re := regexp.MustCompile(`POB: (\d+)`)
re := regexp.MustCompile(i.settings.Criteria.Pattern)
if c != nil {
matches := re.FindStringSubmatch(c.Body)
//we're expecting exactly one principle match and one submatch (2 entries total)
if len(matches) == 2 {
//our returned matches must be larger than the specified match index
if len(matches) > i.settings.Criteria.MatchId {
//submatch must be an integer, or else we simply don't update the result
a, err := strconv.Atoi(matches[1])
a, err := strconv.Atoi(matches[i.settings.Criteria.MatchId])
if err == nil {
result = a
}
@@ -126,7 +160,7 @@ func (i *IssueReader) ExtractBountyFromComment(c *jira.Comment) int {
// given a specific jira.Comment, find if it was authored by someone int he POList
func (i *IssueReader) CommentAuthorIsPO(c *jira.Comment) bool {
if c != nil {
for _, p := range GetPOList() {
for _, p := range i.settings.ProductOwners {
if c.Author.Name == p {
return true
}
@@ -137,6 +171,12 @@ func (i *IssueReader) CommentAuthorIsPO(c *jira.Comment) bool {
// retrieve all issues as per searchString JQL
func (i *IssueReader) GetAllIssues(client *jira.Client, searchString string) ([]jira.Issue, error) {
if client == nil {
i.available = false
return nil, nil
}
last := 0
var issues []jira.Issue
for {