Monorepo for Tangled
tangled.org
1package main
2
3import (
4 "context"
5 "log/slog"
6 "os"
7 "os/signal"
8 "syscall"
9
10 "github.com/carlmjohnson/versioninfo"
11 "github.com/urfave/cli/v3"
12 "tangled.org/core/knotmirror"
13 "tangled.org/core/knotmirror/config"
14 "tangled.org/core/knotmirror/db"
15 "tangled.org/core/knotmirror/migrate"
16 "tangled.org/core/log"
17)
18
19func main() {
20 if err := run(os.Args); err != nil {
21 slog.Error("error running knotmirror", "err", err)
22 os.Exit(-1)
23 }
24}
25
26func run(args []string) error {
27 ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
28 defer cancel()
29
30 logger := log.New("knotmirror")
31 slog.SetDefault(logger)
32 ctx = log.IntoContext(ctx, logger)
33
34 app := cli.Command{
35 Name: "knotmirror",
36 Usage: "knot mirroring service",
37 Version: versioninfo.Short(),
38 }
39 app.Flags = []cli.Flag{}
40 app.Commands = []*cli.Command{
41 {
42 Name: "serve",
43 Usage: "run the knotmirror daemon",
44 Action: runKnotMirror,
45 Flags: []cli.Flag{},
46 },
47 {
48 Name: "migrate-disk",
49 Usage: "rename mirror dirs from {did}/{rkey} -> {repo_did}; daemon must be stopped",
50 Action: runMigrateDisk,
51 Flags: []cli.Flag{},
52 },
53 }
54 return app.Run(ctx, args)
55}
56
57func runKnotMirror(ctx context.Context, cmd *cli.Command) error {
58 logger := log.FromContext(ctx)
59 cfg, err := config.Load(ctx)
60 if err != nil {
61 return err
62 }
63
64 logger.Debug("config loaded:", "config", cfg)
65 return knotmirror.Run(ctx, cfg)
66}
67
68func runMigrateDisk(ctx context.Context, cmd *cli.Command) error {
69 logger := log.FromContext(ctx)
70 cfg, err := config.Load(ctx)
71 if err != nil {
72 return err
73 }
74 database, err := db.Make(ctx, cfg.DbUrl, 4)
75 if err != nil {
76 return err
77 }
78 defer database.Close()
79
80 stats, err := migrate.RenameDisk(ctx, cfg.GitRepoBasePath, database, logger)
81 logger.Info("migrate-disk complete", "stats", stats.String())
82 return err
83}