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)
11
12var jobSpecs = map[string]string{
13	"mirror": "@every 10m",
14}
15
16// mirrorJob runs the (pull) mirror job task.
17func (s *Server) mirrorJob() func() {
18	cfg := s.Config
19	b := cfg.Backend
20	logger := s.logger
21	return func() {
22		repos, err := b.Repositories()
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(cfg.DataPath, "ssh", "known_hosts"),
48							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}