This commit is contained in:
2024-08-01 18:10:45 +02:00
parent f48a5b62f5
commit 641885a2d7
2 changed files with 256 additions and 49 deletions

View File

@@ -10,6 +10,7 @@ import (
"path"
"regexp"
"slices"
"sort"
"strconv"
"strings"
"time"
@@ -60,35 +61,50 @@ func getObsProjectAssociatedWithPr(baseProject string, pr *models.PullRequest) s
)
}
type BuildStatusSummary string
const BuildUnresolveable = BuildStatusSummary("unresolveable")
const BuildBuilding = BuildStatusSummary("building")
const BuildFailed = BuildStatusSummary("failed")
const BuildSuccess = BuildStatusSummary("success")
/*
'published' => 'Repository has been published',
'publishing' => 'Repository is being created right now',
'unpublished' => 'Build finished, but repository publishing is disabled',
'building' => 'Build jobs exist for the repository',
'finished' => 'Build jobs have been processed, new repository is not yet created',
'blocked' => 'No build possible at the moment, waiting for jobs in other repositories',
'broken' => 'The repository setup is broken, build or publish not possible',
'scheduling' => 'The repository state is being calculated right now'
*/
type BuildStatus struct {
Status BuildStatusSummary
Detail string
}
var buildStatus map[string]BuildStatus
func processBuildStatusUpdate() {
}
func processBuildStatus(project, refProject *common.BuildResultList) BuildStatusSummary {
return BuildBuilding
type BuildStatusSummary int
const (
BuildStatusSummarySuccess = 1
BuildStatusSummaryFailed = 2
BuildStatusSummaryBuilding = 3
BuildStatusSummaryUnknown = 4
)
func processBuildStatus(h *common.RequestHandler, project, refProject *common.BuildResultList) BuildStatusSummary {
targetResults := project.Result
if _, finished := project.BuildResultSummary(); !finished {
return BuildStatusSummaryBuilding
}
if _, finished := refProject.BuildResultSummary(); !finished {
h.LogError("refProject not finished building??")
return BuildStatusSummaryUnknown
}
// the repositories should be setup equally between the projects. We
// need to verify that packages that are building in `refProject` are not
// failing in the `project`
BuildResultSorter := func(a, b common.BuildResult) int {
if c := strings.Compare(a.Project, b.Project); c != 0 {
return c
}
if c := strings.Compare(a.Repository, b.Repository); c != 0 {
return c
}
if c := strings.Compare(a.Arch, b.Arch); c != 0 {
return c
}
panic("Should not happen -- BuiltResultSorter equal repos?")
}
slices.SortFunc(project.Result, BuildResultSorter)
slices.SortFunc(refProject.Result, BuildResultSorter)
return BuildStatusSummaryUnknown
}
func startBuild(h *common.RequestHandler, pr *models.PullRequest, obsClient *common.ObsClient) error {
@@ -267,16 +283,19 @@ func processPullNotification(h *common.RequestHandler, thread *models.Notificati
}
h.Log("repo content fetching ...")
refProject := string(h.GitCatFile(dir, pr.Head.Sha, "project.build"))
// buildPrjBytes, err := h.GetPullRequestFileContent(pr, "project.build")
refPrj := string(bytes.TrimSpace(h.GitCatFile(dir, pr.Head.Sha, "project.build")))
if len(refPrj) < 1 {
_, err := h.AddReviewComment(pr, common.ReviewStateRequestChanges, "Cannot find reference project")
if err != nil {
h.LogPlainError(err)
return
}
h.LogError("Cannot find reference project for %s PR#%d", pr.Base.Name, pr.Index)
return
}
if h.HasError() {
h.LogPlainError(h.Error)
/*
_, err := h.AddReviewComment(pr, common.ReviewStateRequestChanges, "Cannot find reference project")
if err != nil {
h.LogPlainError(err)
}
*/
return
}
@@ -287,33 +306,32 @@ func processPullNotification(h *common.RequestHandler, thread *models.Notificati
// recreate missing project
h.LogError("missing OBS project ... recreating '%s': %v", obsProject, err)
startBuild(h, pr, obsClient)
return
}
h.LogError("failed fetching build status for '%s': %v", obsProject, err)
return
}
refProjectResult, err := obsClient.BuildStatus(refProject)
refProjectResult, err := obsClient.BuildStatus(refPrj, prjResult.GetPackageList()...)
if err != nil {
h.LogError("failed fetching ref project status for '%s': %v", refProject, err)
h.LogError("failed fetching ref project status for '%s': %v", refPrj, err)
}
buildStatus := processBuildStatus(prjResult, refProjectResult)
buildStatus := processBuildStatus(h, prjResult, refProjectResult)
switch buildStatus {
case BuildSuccess:
case BuildStatusSummarySuccess:
_, err := h.AddReviewComment(pr, common.ReviewStateApproved, "Build successful")
if err != nil {
h.LogPlainError(err)
}
case BuildFailed:
case BuildStatusSummaryFailed:
_, err := h.AddReviewComment(pr, common.ReviewStateRequestChanges, "Build failed")
if err != nil {
h.LogPlainError(err)
}
case BuildBuilding:
}
// waiting for build results -- nothing to do
// waiting for build results
// project := getObsProjectAssociatedWithPr(obsClient.HomeProject, pr)
case common.ReviewStateApproved:
// done, mark notification as read
h.Log("processing request for success build ...")