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