1package server
 2
 3import (
 4	"fmt"
 5	"path/filepath"
 6
 7	"github.com/charmbracelet/soft-serve/git"
 8)
 9
10var (
11	jobSpecs = map[string]string{
12		"mirror": "@every 10m",
13	}
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		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						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}