package main import ( "log" "slices" "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() defer statusMutex.RUnlock() if ret, found := CurrentStatus[project]; found { return ret } else { go WatchObsProject(obs, project) 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 } } } } func WatchObsProject(obs common.ObsStatusFetcherWithState, ObsProject string) { old_state := "" mutex.Lock() if pos, found := slices.BinarySearch(WatchedRepos, ObsProject); found { mutex.Unlock() return } else { WatchedRepos = slices.Insert(WatchedRepos, pos, ObsProject) mutex.Unlock() } LogDebug("+ watching", ObsProject) opts := common.BuildResultOptions{} for { state, err := obs.BuildStatusWithState(ObsProject, &opts) if err != nil { log.Println(" *** Error fetching build for", ObsProject, err) time.Sleep(time.Minute) } else { opts.OldState = state.State LogDebug(" --> update", ObsProject, " => ", old_state) StatusUpdateCh <- StatusUpdateMsg{ObsProject: ObsProject, Result: state} } } }