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}