1package server
2
3import (
4 "fmt"
5 "path/filepath"
6
7 "github.com/charmbracelet/soft-serve/git"
8 "github.com/charmbracelet/soft-serve/server/config"
9)
10
11var (
12 jobSpecs = map[string]string{
13 "mirror": "@every 10m",
14 }
15)
16
17// mirrorJob runs the (pull) mirror job task.
18func mirrorJob(cfg *config.Config) func() {
19 b := cfg.Backend
20 logger := logger.WithPrefix("server.mirrorJob")
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 for _, repo := range repos {
29 if repo.IsMirror() {
30 logger.Info("updating mirror", "repo", repo.Name())
31 r, err := repo.Open()
32 if err != nil {
33 logger.Error("error opening repository", "repo", repo.Name(), "err", err)
34 continue
35 }
36
37 cmd := git.NewCommand("remote", "update", "--prune")
38 cmd.AddEnvs(
39 fmt.Sprintf(`GIT_SSH_COMMAND=ssh -o UserKnownHostsFile="%s" -o StrictHostKeyChecking=no -i "%s"`,
40 filepath.Join(cfg.DataPath, "ssh", "known_hosts"),
41 filepath.Join(cfg.DataPath, cfg.SSH.ClientKeyPath),
42 ),
43 )
44 if _, err := cmd.RunInDir(r.Path); err != nil {
45 logger.Error("error running git remote update", "repo", repo.Name(), "err", err)
46 }
47 }
48 }
49 }
50}