jobs.go

 1package server
 2
 3import (
 4	"fmt"
 5	"path/filepath"
 6	"runtime"
 7
 8	"github.com/charmbracelet/soft-serve/git"
 9	"github.com/charmbracelet/soft-serve/internal/sync"
10	"github.com/charmbracelet/soft-serve/server/backend"
11)
12
13var jobSpecs = map[string]string{
14	"mirror": "@every 10m",
15}
16
17// mirrorJob runs the (pull) mirror job task.
18func (s *Server) mirrorJob() func() {
19	b := backend.FromContext(s.ctx)
20	logger := s.logger
21	return func() {
22		repos, err := b.Repositories(s.ctx, 1, 10)
23		if err != nil {
24			logger.Error("error getting repositories", "err", err)
25			return
26		}
27
28		// Divide the work up among the number of CPUs.
29		wq := sync.NewWorkPool(s.ctx, runtime.GOMAXPROCS(0),
30			sync.WithWorkPoolLogger(logger.Errorf),
31		)
32
33		logger.Debug("updating mirror repos")
34		for _, repo := range repos {
35			if repo.IsMirror() {
36				r, err := repo.Open()
37				if err != nil {
38					logger.Error("error opening repository", "repo", repo.Name(), "err", err)
39					continue
40				}
41
42				name := repo.Name()
43				wq.Add(name, func() {
44					cmd := git.NewCommand("remote", "update", "--prune")
45					cmd.AddEnvs(
46						fmt.Sprintf(`GIT_SSH_COMMAND=ssh -o UserKnownHostsFile="%s" -o StrictHostKeyChecking=no -i "%s"`,
47							filepath.Join(s.cfg.DataPath, "ssh", "known_hosts"),
48							s.cfg.SSH.ClientKeyPath,
49						),
50					)
51					if _, err := cmd.RunInDir(r.Path); err != nil {
52						logger.Error("error running git remote update", "repo", name, "err", err)
53					}
54
55				})
56			}
57		}
58
59		wq.Run()
60	}
61}