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}