128 lines
2.5 KiB
Go
128 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"slices"
|
|
"strings"
|
|
"sync"
|
|
"time"
|
|
|
|
"src.opensuse.org/autogits/common"
|
|
)
|
|
|
|
var WatchedRepos []string
|
|
var mutex sync.Mutex
|
|
|
|
var StatusUpdateCh chan StatusUpdateMsg = make(chan StatusUpdateMsg)
|
|
|
|
var statusMutex sync.RWMutex
|
|
var CurrentStatus map[string]*common.BuildResultList = make(map[string]*common.BuildResultList)
|
|
|
|
type StatusUpdateMsg struct {
|
|
ObsProject string
|
|
Result *common.BuildResultList
|
|
}
|
|
|
|
func GetCurrentStatus(project string) *common.BuildResultList {
|
|
statusMutex.RLock()
|
|
|
|
if ret, found := CurrentStatus[project]; found {
|
|
statusMutex.RUnlock()
|
|
return ret
|
|
}
|
|
|
|
res, err := obs.BuildStatus(project)
|
|
statusMutex.RUnlock()
|
|
statusMutex.Lock()
|
|
defer statusMutex.Unlock()
|
|
|
|
if err != nil {
|
|
return res
|
|
}
|
|
CurrentStatus[project] = res
|
|
|
|
now := time.Now().Unix()
|
|
CurrentStatus[project].LastUpdate = now
|
|
for _, r := range res.Result {
|
|
r.LastUpdate = now
|
|
for _, p := range r.Status {
|
|
p.LastUpdate = now
|
|
}
|
|
slices.SortFunc(r.Status, packageSort)
|
|
}
|
|
slices.SortFunc(res.Result, repoSort)
|
|
return res
|
|
}
|
|
|
|
|
|
func updatePrjPackage(prjState *common.BuildResultList, pkg string, now int64, pkgState *common.BuildResultList) {
|
|
for prjState.
|
|
Result[0].Status[0].Package
|
|
}
|
|
|
|
func extractPackageBuildStatus(prjState *common.BuildResultList, pkg string) []*common.PackageBuildStatus {
|
|
|
|
}
|
|
|
|
func GetDetailedPackageBuildStatus(prj, pkg string) []*common.PackageBuildStatus {
|
|
statusMutex.RLock()
|
|
now := time.Now().Unix()
|
|
|
|
cachedPrj, found := CurrentStatus[prj]
|
|
if found {
|
|
statusMutex.Unlock()
|
|
if now-cachedPrj.LastUpdate < 60 {
|
|
return extractPackageBuildStatus(cachedPrj, pkg)
|
|
}
|
|
}
|
|
|
|
ret, err := obs.BuildStatus(prj, pkg)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
statusMutex.Lock()
|
|
defer statusMutex.Unlock()
|
|
|
|
updatePrjPackage(cachedPrj, pkg, now, ret)
|
|
return extractPackageBuildStatus(cachedPrj, pkg)
|
|
}
|
|
|
|
func GetDetailedBuildStatus(prj, pkg, repo, arch string) *common.PackageBuildStatus {
|
|
prjStatus := GetCurrentStatus(prj)
|
|
if prjStatus == nil {
|
|
return nil
|
|
}
|
|
|
|
for _, r := range prjStatus.Result {
|
|
if r.Arch == arch && r.Repository == repo {
|
|
for _, status := range r.Status {
|
|
if status.Package == pkg {
|
|
return &status
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func ProcessUpdates() {
|
|
for {
|
|
msg := <-StatusUpdateCh
|
|
|
|
statusMutex.Lock()
|
|
CurrentStatus[msg.ObsProject] = msg.Result
|
|
|
|
drainedChannel:
|
|
for {
|
|
select {
|
|
case msg = <-StatusUpdateCh:
|
|
CurrentStatus[msg.ObsProject] = msg.Result
|
|
default:
|
|
statusMutex.Unlock()
|
|
break drainedChannel
|
|
}
|
|
}
|
|
}
|
|
}
|