diff --git a/common/git_utils.go b/common/git_utils.go index a7e76e2..720173d 100644 --- a/common/git_utils.go +++ b/common/git_utils.go @@ -904,6 +904,7 @@ func (e *GitHandlerImpl) GitSubmoduleList(gitPath, commitId string) (submoduleLi for _, te := range tree.items { if te.isTree() { trees[p+te.name+"/"] = te.hash + submoduleList[p+te.name] = te.hash } else if te.isSubmodule() { submoduleList[p+te.name] = te.hash } diff --git a/obs-staging-bot/main.go b/obs-staging-bot/main.go index fd14c37..68275d5 100644 --- a/obs-staging-bot/main.go +++ b/obs-staging-bot/main.go @@ -26,6 +26,7 @@ import ( "net/url" "os" "path" + "path/filepath" "regexp" "runtime/debug" "slices" @@ -109,161 +110,67 @@ const ( BuildStatusSummaryUnknown = 4 ) -func ProcessBuildStatus(project, refProject *common.BuildResultList) BuildStatusSummary { - if _, finished := refProject.BuildResultSummary(); !finished { - common.LogDebug("refProject not finished building??") - return BuildStatusSummaryUnknown - } - +func ProcessBuildStatus(project *common.BuildResultList) BuildStatusSummary { if _, finished := project.BuildResultSummary(); !finished { common.LogDebug("Still building...") return BuildStatusSummaryBuilding } - // 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.Repository, b.Repository); c != 0 { - return c - } - if c := strings.Compare(a.Arch, b.Arch); c != 0 { - return c - } + //slices.SortFunc(project.Result, BuildResultSorter) - panic("Should not happen -- BuiltResultSorter equal repos?") - } - slices.SortFunc(project.Result, BuildResultSorter) - if refProject == nil { - // just return if buid finished and have some successes, since new package - common.LogInfo("New package. Only need some success...") - SomeSuccess := false - for i := 0; i < len(project.Result); i++ { - repoRes := project.Result[i] - repoResStatus, ok := common.ObsRepoStatusDetails[repoRes.Code] - if !ok { - common.LogDebug("cannot find code:", repoRes.Code) - return BuildStatusSummaryUnknown - } - if !repoResStatus.Finished { - return BuildStatusSummaryBuilding - } - - for _, pkg := range repoRes.Status { - pkgStatus, ok := common.ObsBuildStatusDetails[pkg.Code] - if !ok { - common.LogInfo("Unknown package build status:", pkg.Code, "for", pkg.Package) - common.LogDebug("Details:", pkg.Details) - } - - if pkgStatus.Success { - SomeSuccess = true - } - } - } - - if SomeSuccess { - return BuildStatusSummarySuccess - } - return BuildStatusSummaryFailed - } - - slices.SortFunc(refProject.Result, BuildResultSorter) - - common.LogDebug("comparing results", len(project.Result), "vs. ref", len(refProject.Result)) - SomeSuccess := false + common.LogDebug("build results", len(project.Result)) for i := 0; i < len(project.Result); i++ { common.LogDebug("searching for", project.Result[i].Repository, "/", project.Result[i].Arch) j := 0 found: - for ; j < len(refProject.Result); j++ { - if project.Result[i].Repository != refProject.Result[j].Repository || - project.Result[i].Arch != refProject.Result[j].Arch { - continue - } - + for j = 0; j < len(project.Result); j++ { common.LogDebug(" found match for @ idx:", j) - res, success := ProcessRepoBuildStatus(project.Result[i].Status, refProject.Result[j].Status) + res := ProcessRepoBuildStatus(project.Result[i].Status) switch res { case BuildStatusSummarySuccess: - SomeSuccess = SomeSuccess || success break found + case BuildStatusSummaryFailed: + return BuildStatusSummaryFailed default: return res } } - - if j >= len(refProject.Result) { - common.LogDebug("Cannot find results...") - common.LogDebug(project.Result[i]) - common.LogDebug(refProject.Result) - return BuildStatusSummaryUnknown - } } - if SomeSuccess { - return BuildStatusSummarySuccess - } - - return BuildStatusSummaryFailed + return BuildStatusSummarySuccess } -func ProcessRepoBuildStatus(results, ref []*common.PackageBuildStatus) (status BuildStatusSummary, SomeSuccess bool) { - PackageBuildStatusSorter := func(a, b *common.PackageBuildStatus) int { - return strings.Compare(a.Package, b.Package) - } +func ProcessRepoBuildStatus(results []*common.PackageBuildStatus) (status BuildStatusSummary) { + + PackageBuildStatusSorter := func(a, b *common.PackageBuildStatus) int { + return strings.Compare(a.Package, b.Package) + } - common.LogDebug("******** REF: ") - data, _ := xml.MarshalIndent(ref, "", " ") - common.LogDebug(string(data)) common.LogDebug("******* RESULTS: ") - data, _ = xml.MarshalIndent(results, "", " ") + data, _ := xml.MarshalIndent(results, "", " ") common.LogDebug(string(data)) common.LogDebug("*******") // compare build result slices.SortFunc(results, PackageBuildStatusSorter) - slices.SortFunc(ref, PackageBuildStatusSorter) - j := 0 - SomeSuccess = false for i := 0; i < len(results); i++ { res, ok := common.ObsBuildStatusDetails[results[i].Code] if !ok { common.LogInfo("unknown package result code:", results[i].Code, "for package:", results[i].Package) - return BuildStatusSummaryUnknown, SomeSuccess + return BuildStatusSummaryUnknown } if !res.Finished { - return BuildStatusSummaryBuilding, SomeSuccess + return BuildStatusSummaryBuilding } if !res.Success { - // not failed if reference project also failed for same package here - for ; j < len(results) && strings.Compare(results[i].Package, ref[j].Package) < 0; j++ { - } - - if j < len(results) && results[i].Package == ref[j].Package { - refRes, ok := common.ObsBuildStatusDetails[ref[j].Code] - if !ok { - common.LogInfo("unknown ref package result code:", ref[j].Code, "package:", ref[j].Package) - return BuildStatusSummaryUnknown, SomeSuccess - } - - if !refRes.Finished { - common.LogDebug("Not finished building in reference project?") - } - - if refRes.Success { - return BuildStatusSummaryFailed, SomeSuccess - } - } - } else { - SomeSuccess = true + return BuildStatusSummaryFailed } } - return BuildStatusSummarySuccess, SomeSuccess + return BuildStatusSummarySuccess } func GenerateObsPrjMeta(git common.Git, gitea common.Gitea, pr *models.PullRequest, stagingPrj, buildPrj string, stagingMasterPrj string) (*common.ProjectMeta, error) { @@ -322,9 +229,9 @@ func GenerateObsPrjMeta(git common.Git, gitea common.Gitea, pr *models.PullReque common.LogError("error fetching project meta for", buildPrj, ". Err:", err) return nil, err } + common.LogInfo("Meta: ", meta) // generate new project with paths pointinig back to original repos - // disable publishing meta.Name = stagingPrj meta.Description = fmt.Sprintf(`Pull request build job PR#%d to branch %s of %s/%s`, @@ -339,7 +246,10 @@ func GenerateObsPrjMeta(git common.Git, gitea common.Gitea, pr *models.PullReque urlPkg := make([]string, 0, len(modifiedOrNew)) for _, pkg := range modifiedOrNew { - urlPkg = append(urlPkg, "onlybuild="+url.QueryEscape(pkg)) + // FIXME: skip manifest subdirectories itself + // strip any leading directory name and just hand over last directory as package name + onlybuilds := strings.Split(pkg, "/") + urlPkg = append(urlPkg, "onlybuild="+url.QueryEscape(onlybuilds[len(onlybuilds)-1])) } meta.ScmSync = pr.Head.Repo.CloneURL + "?" + strings.Join(urlPkg, "&") + "#" + pr.Head.Sha if len(meta.ScmSync) >= 65535 { @@ -824,10 +734,13 @@ func ProcessPullRequest(gitea common.Gitea, org, repo string, id int64) (bool, e if !stagingConfig.RebuildAll { for pkg, headOid := range headSubmodules { if baseOid, exists := baseSubmodules[pkg]; !exists || baseOid != headOid { + if pkg != "rpms" && pkg != "dependencies" { + _, spkg := filepath.Split(pkg) if exists { - modifiedPackages = append(modifiedPackages, pkg) + modifiedPackages = append(modifiedPackages, spkg) } else { - newPackages = append(newPackages, pkg) + newPackages = append(newPackages, spkg) + } } common.LogDebug(pkg, ":", baseOid, "->", headOid) } @@ -931,15 +844,11 @@ func ProcessPullRequest(gitea common.Gitea, org, repo string, id int64) (bool, e gitea.AddComment(pr, msg) } - baseResult, err := ObsClient.LastBuildResults(stagingConfig.ObsProject, modifiedPackages...) - if err != nil { - common.LogError("failed fetching ref project status for", stagingConfig.ObsProject, ":", err) - } stagingResult, err := ObsClient.BuildStatus(stagingProject) if err != nil { common.LogError("failed fetching stage project status for", stagingProject, ":", err) } - buildStatus := ProcessBuildStatus(stagingResult, baseResult) + buildStatus := ProcessBuildStatus(stagingResult) done := false switch buildStatus { diff --git a/workflow-direct/main.go b/workflow-direct/main.go index 041ae56..fde24b4 100644 --- a/workflow-direct/main.go +++ b/workflow-direct/main.go @@ -107,7 +107,7 @@ func processConfiguredRepositoryAction(action *common.RepositoryWebhookEvent, co common.LogError(" - ", action.Repository.Name, "repo is not sha256. Ignoring.") return } - common.PanicOnError(git.GitExec(gitPrj, "submodule", "--quiet", "add", "--depth", "1", action.Repository.Clone_Url, action.Repository.Name)) + common.PanicOnError(git.GitExec(gitPrj, "submodule", "--quiet", "add", "--depth", "1", "../" + action.Repository.Name, action.Repository.Name)) defer git.GitExecQuietOrPanic(gitPrj, "submodule", "deinit", "--all", "-f") branch := strings.TrimSpace(git.GitExecWithOutputOrPanic(path.Join(gitPrj, action.Repository.Name), "branch", "--show-current")) @@ -198,7 +198,7 @@ func processConfiguredPushAction(action *common.PushWebhookEvent, config *common } if stat, err := os.Stat(filepath.Join(git.GetPath(), gitPrj, action.Repository.Name)); err != nil { - git.GitExecOrPanic(gitPrj, "submodule", "--quiet", "add", "--depth", "1", action.Repository.Clone_Url, action.Repository.Name) + git.GitExecOrPanic(gitPrj, "submodule", "--quiet", "add", "--depth", "1", "../" + action.Repository.Name, action.Repository.Name) common.LogDebug("Pushed to package that is not part of the project. Re-adding...", err) } else if !stat.IsDir() { common.LogError("Pushed to a package that is not a submodule but exists in the project. Ignoring.") @@ -402,7 +402,7 @@ next_repo: } // add repository to git project - common.PanicOnError(git.GitExec(gitPrj, "submodule", "--quiet", "add", "--depth", "1", r.CloneURL, r.Name)) + common.PanicOnError(git.GitExec(gitPrj, "submodule", "--quiet", "add", "--depth", "1", "../" + r.Name, r.Name)) curBranch := strings.TrimSpace(git.GitExecWithOutputOrPanic(path.Join(gitPrj, r.Name), "branch", "--show-current")) if branch != curBranch { diff --git a/workflow-pr/pr_processor.go b/workflow-pr/pr_processor.go index 6128c95..a0c81b4 100644 --- a/workflow-pr/pr_processor.go +++ b/workflow-pr/pr_processor.go @@ -443,11 +443,11 @@ func (pr *PRProcessor) Process(req *models.PullRequest) error { if _, ok := err.(*repository.RepoMergePullRequestConflict); !ok { common.PanicOnError(err) } - } else { - Gitea.AddComment(pr.PR, "Closing here because the associated Project PR has been closed.") - Gitea.UpdatePullRequest(org, repo, idx, &models.EditPullRequestOption{ - State: "closed", - }) +// } else { +// Gitea.AddComment(pr.PR, "Closing here because the associated Project PR has been closed.") +// Gitea.UpdatePullRequest(org, repo, idx, &models.EditPullRequestOption{ +// State: "closed", +// }) } } } @@ -460,10 +460,10 @@ func (pr *PRProcessor) Process(req *models.PullRequest) error { continue } } - } - if err = pr.UpdatePrjGitPR(prset); err != nil { - return err + if err = pr.UpdatePrjGitPR(prset); err != nil { + return err + } } }