diff --git a/obs-staging-bot/main.go b/obs-staging-bot/main.go index 68275d5..9c494c5 100644 --- a/obs-staging-bot/main.go +++ b/obs-staging-bot/main.go @@ -19,6 +19,7 @@ package main */ import ( + "bufio" "encoding/xml" "errors" "flag" @@ -173,6 +174,35 @@ func ProcessRepoBuildStatus(results []*common.PackageBuildStatus) (status BuildS return BuildStatusSummarySuccess } +func GetPackageBuildStatus(project *common.BuildResultList, packageName string) (bool, BuildStatusSummary) { + err := true + + for _, result := range project.Result { + for _, pkgStatus := range result.Status { + if pkgStatus.Package == packageName { + err = false + + res, ok := common.ObsBuildStatusDetails[pkgStatus.Code] + if !ok { + common.LogInfo("unknown package result code:", pkgStatus.Code, "for package:", pkgStatus.Package) + return err, BuildStatusSummaryUnknown + } + + if !res.Finished { + return err, BuildStatusSummaryBuilding + } + + if !res.Success { + return err, BuildStatusSummaryFailed + } + return err, BuildStatusSummarySuccess + } + } + } + + return err, BuildStatusSummaryUnknown +} + func GenerateObsPrjMeta(git common.Git, gitea common.Gitea, pr *models.PullRequest, stagingPrj, buildPrj string, stagingMasterPrj string) (*common.ProjectMeta, error) { common.LogDebug("repo content fetching ...") err := FetchPrGit(git, pr) @@ -593,6 +623,24 @@ func SetStatus(gitea common.Gitea, org, repo, hash string, status *models.Commit return err } +func commentOnPackagePR(gitea common.Gitea, org string, repo string, prNum int64, msg string) { + if IsDryRun { + common.LogInfo("Would comment on package PR %s/%s#%d: %s", org, repo, prNum, msg) + return + } + + pr, err := gitea.GetPullRequest(org, repo, prNum) + if err != nil { + common.LogError("Failed to get package PR %s/%s#%d: %v", org, repo, prNum, err) + return + } + + err = gitea.AddComment(pr, msg) + if err != nil { + common.LogError("Failed to comment on package PR %s/%s#%d: %v", org, repo, prNum, err) + } +} + func ProcessPullRequest(gitea common.Gitea, org, repo string, id int64) (bool, error) { dir, err := os.MkdirTemp(os.TempDir(), BotName) common.PanicOnError(err) @@ -848,10 +896,12 @@ func ProcessPullRequest(gitea common.Gitea, org, repo string, id int64) (bool, e if err != nil { common.LogError("failed fetching stage project status for", stagingProject, ":", err) } - buildStatus := ProcessBuildStatus(stagingResult) + + _, packagePRs := common.ExtractDescriptionAndPRs(bufio.NewScanner(strings.NewReader(pr.Body))) done := false - switch buildStatus { + overallBuildStatus := ProcessBuildStatus(stagingResult) + switch overallBuildStatus { case BuildStatusSummarySuccess: status.Status = common.CommitStatus_Success done = true @@ -871,7 +921,40 @@ func ProcessPullRequest(gitea common.Gitea, org, repo string, id int64) (bool, e } } } - common.LogInfo("Build status:", buildStatus) + + missingPkgs := []string{} + + for _, packagePR := range packagePRs { + missing, packageBuildStatus := GetPackageBuildStatus(stagingResult, packagePR.Repo) + if missing { + missingPkgs = append(missingPkgs, packagePR.Repo) + continue + } + var msg string + switch packageBuildStatus { + case BuildStatusSummarySuccess: + msg = "Build successful" + case BuildStatusSummaryFailed: + msg = "Build failed" + default: + continue + } + commentOnPackagePR(gitea, packagePR.Org, packagePR.Repo, packagePR.Num, msg) + } + + if len(missingPkgs) > 0 { + msg := "The following packages were not found in the staging project:\n" + for _, pkg := range missingPkgs { + msg = msg + " - " + pkg + "\n" + } + common.LogInfo(msg) + err := gitea.AddComment(pr, msg) + if err != nil { + common.LogError(err) + } + } + + common.LogInfo("Build status:", overallBuildStatus) if !IsDryRun { if err = SetStatus(gitea, org, repo, pr.Head.Sha, status); err != nil { return false, err