mirror.go

 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}