jobs.go

 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						// FIXME: upstream keygen appends _ed25519 to the key path.
42						filepath.Join(cfg.DataPath, cfg.SSH.ClientKeyPath)+"_ed25519",
43					),
44				)
45				if _, err := cmd.RunInDir(r.Path); err != nil {
46					logger.Error("error running git remote update", "repo", repo.Name(), "err", err)
47				}
48			}
49		}
50	}
51}