GitRoot
Craft your forge, Build your project, Grow your community freely
1// SPDX-FileCopyrightText: 2026 Romain Maneschi <romain@gitroot.dev>
2//
3// SPDX-License-Identifier: EUPL-1.2
4
5package scheduler
6
7import (
8 "context"
9 "time"
10
11 "github.com/adhocore/gronx"
12 "github.com/samber/oops"
13 "gitroot.dev/server/logger"
14 "gitroot.dev/server/plugin"
15)
16
17type task struct {
18 cronExpr string
19 repoName string
20 pluginPurl string
21 pluginRun *plugin.PluginRun
22 nextRun time.Time
23}
24
25func (m *Manager) findScheduleInProject(ctx context.Context, repoName string) ([]*task, error) {
26 m.logger.Info("search for task to schedule", logger.NewLoggerPair("repoName", repoName))
27 repo, err := m.repoManager.Open(ctx, repoName)
28 if err != nil {
29 return nil, oops.Wrapf(err, "can't open repository")
30 }
31 defer repo.Close()
32
33 filecontent, err := repo.ContentPluginsConf()
34 if err != nil {
35 return nil, oops.Wrapf(err, "can't get content plugins conf")
36 }
37 confPlugins, err := plugin.ParsePlugins(filecontent, true)
38 if err != nil {
39 return nil, oops.Wrapf(err, "can't parse plugins conf")
40 }
41 allSchedule := []*task{}
42 for _, pluginConf := range confPlugins {
43 if pluginConf.Active {
44 for _, pluginRun := range pluginConf.Run {
45 if pluginRun.Schedule != "" {
46 m.logger.Info("found task to schedule", logger.NewLoggerPair("repoName", repo.Name()), logger.NewLoggerPair("plugin", pluginConf.PURL))
47 nextTime, err := gronx.NextTick(pluginRun.Schedule, false)
48 if err != nil {
49 m.logger.Error("invalid cron expr", err, logger.NewLoggerPair("expr", pluginRun.Schedule), logger.NewLoggerPair("repoName", repo.Name()), logger.NewLoggerPair("plugin", pluginConf.PURL))
50 continue
51 }
52 allSchedule = append(allSchedule, &task{
53 cronExpr: pluginRun.Schedule,
54 repoName: repo.Name(),
55 pluginPurl: pluginConf.PURL.String(),
56 pluginRun: &pluginRun,
57 nextRun: nextTime,
58 })
59 }
60 }
61 }
62 }
63 return allSchedule, nil
64}