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}