// Command migrate is a tool to restructure the data directory from the // old format to the new unified format. package main import ( "flag" "fmt" "log/slog" "os" "github.com/yourusername/caldav-server/internal/config" "github.com/yourusername/caldav-server/internal/store" ) func main() { os.Exit(run(os.Args[1:])) } func run(args []string) int { fs := flag.NewFlagSet("migrate", flag.ContinueOnError) cfgPath := fs.String("config", "config.yaml", "path to configuration file") verbose := fs.Bool("verbose", false, "enable verbose output") if err := fs.Parse(args); err != nil { return 2 } cfg, err := config.Load(*cfgPath) if err != nil { fmt.Fprintf(os.Stderr, "error loading config: %v\n", err) return 1 } logger := buildLogger(*verbose) st, err := store.NewStore(cfg.Storage.DataDir) if err != nil { fmt.Fprintf(os.Stderr, "error opening store %q: %v\n", cfg.Storage.DataDir, err) return 1 } logger.Info("starting migration", "data_dir", cfg.Storage.DataDir) if err := st.Migrate(); err != nil { logger.Error("migration failed", "error", err) fmt.Fprintf(os.Stderr, "migration failed: %v\n", err) return 1 } logger.Info("migration completed successfully") fmt.Println("Migration completed successfully") return 0 } func buildLogger(verbose bool) *slog.Logger { level := slog.LevelInfo if verbose { level = slog.LevelDebug } handler := slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{ Level: level, }) return slog.New(handler) }