diff --git a/buildqueue/worker.go b/buildqueue/worker.go index 86a7abc..70be664 100644 --- a/buildqueue/worker.go +++ b/buildqueue/worker.go @@ -82,15 +82,7 @@ func StartPackageQueueWorker(ctx context.Context) { }() } -func StartQueueWorker(ctx context.Context) { - go processQueue(ctx) -} - -func StartStatusWorker(ctx context.Context) { - go processStatus(ctx) -} - -func processStatus(ctx context.Context) { +func processQueueAndStatus(ctx context.Context) { for { select { case <-ctx.Done(): @@ -98,74 +90,59 @@ func processStatus(ctx context.Context) { default: q := GetQueue() itemsToRemove := make([]string, 0) + buildingFound := false + q.ForEach(func(k string, item domain.BuildQueueItem) bool { - if item.Status != domain.Building { - return true - } - complete, err := CheckIfBuildComplete(ctx, item) - if err != nil && !complete { - slog.Error("unable to check if build is complete: " + err.Error()) - } - if complete { - if err != nil { - item.Source.Packages.ForEach(func(k string, v domain.PackageInfo) bool { - v.Status = domain.Error - v.LastBuildStatus = domain.Error - item.Source.Packages.Set(k, v) - return true - }) + if item.Status == domain.Building { + buildingFound = true + complete, err := CheckIfBuildComplete(ctx, item) + if err != nil && !complete { + slog.Error("unable to check if build is complete: " + err.Error()) + } + if complete { + if err != nil { + updatePackageStatus(&item, domain.Error, domain.Error) + } else { + updatePackageStatus(&item, domain.Current, domain.Built) + } packages.UpdateSourcePackage(item.Source) itemsToRemove = append(itemsToRemove, k) - return true } - item.Source.Packages.ForEach(func(k string, v domain.PackageInfo) bool { - v.Status = domain.Current - v.LastBuildStatus = domain.Built - v.Version = item.BuildVersion - v.NewVersion = "" - item.Source.Packages.Set(k, v) - return true - }) - packages.UpdateSourcePackage(item.Source) - itemsToRemove = append(itemsToRemove, k) - return true } return true }) + for _, item := range itemsToRemove { Remove(item) } + + if !buildingFound { + err := ProcessNext() + if err != nil { + slog.Error("unable to process queue: " + err.Error()) + } + } + time.Sleep(10 * time.Second) } } } -func processQueue(ctx context.Context) { - for { - select { - case <-ctx.Done(): - return - default: - q := GetQueue() - buildingFound := false - q.ForEach(func(k string, item domain.BuildQueueItem) bool { - if item.Status == domain.Building { - buildingFound = true - return false - } - return true - }) - if buildingFound { - time.Sleep(30 * time.Second) - continue - } - err := ProcessNext() - if err != nil { - slog.Error("unable to process queue: " + err.Error()) - } +func updatePackageStatus(item *domain.BuildQueueItem, status domain.PackageStatus, buildStatus domain.PackageStatus) { + item.Source.Packages.ForEach(func(k string, v domain.PackageInfo) bool { + v.Status = status + v.LastBuildStatus = domain.PackageStatus(buildStatus) + if status == domain.Current { + v.Version = item.BuildVersion + v.NewVersion = "" } - time.Sleep(30 * time.Second) - } + item.Source.Packages.Set(k, v) + return true + }) +} + +func StartQueueAndStatusWorker(ctx context.Context) { + go processQueueAndStatus(ctx) } func CheckIfBuildComplete(ctx context.Context, item domain.BuildQueueItem) (bool, error) { diff --git a/server.go b/server.go index 9f83141..4fe9c0f 100644 --- a/server.go +++ b/server.go @@ -65,8 +65,7 @@ func runServer(ctx context.Context) error { slog.Info("packages loaded in " + time.Since(start).String()) buildqueue.StartPackageQueueWorker(ctx) - buildqueue.StartQueueWorker(ctx) - buildqueue.StartStatusWorker(ctx) + buildqueue.StartQueueAndStatusWorker(ctx) cfg := fiber.Config{ JSONEncoder: json.Marshal,