package main
import (
"errors"
"fmt"
"log"
"os"
"path/filepath"
"git.sr.ht/~bitfehler/brant/cli"
"github.com/alexflint/go-arg"
_ "github.com/jackc/pgx/v5/stdlib"
"git.sr.ht/~sircmpwn/core-go/config"
)
type Args struct {
ServiceMeta *cli.Args `arg:"subcommand:meta.sr.ht" help:"run meta.sr.ht migration"`
ServiceGit *cli.Args `arg:"subcommand:git.sr.ht" help:"run git.sr.ht migration"`
ServiceHg *cli.Args `arg:"subcommand:hg.sr.ht" help:"run hg.sr.ht migration"`
ServiceBuilds *cli.Args `arg:"subcommand:builds.sr.ht" help:"run builds.sr.ht migration"`
ServiceTodo *cli.Args `arg:"subcommand:todo.sr.ht" help:"run todo.sr.ht migration"`
ServiceLists *cli.Args `arg:"subcommand:lists.sr.ht" help:"run lists.sr.ht migration"`
ServiceMan *cli.Args `arg:"subcommand:man.sr.ht" help:"run man.sr.ht migration"`
ServiceHub *cli.Args `arg:"subcommand:hub.sr.ht" help:"run hub.sr.ht migration"`
ServicePaste *cli.Args `arg:"subcommand:paste.sr.ht" help:"run paste.sr.ht migration"`
ServicePages *cli.Args `arg:"subcommand:pages.sr.ht" help:"run pages.sr.ht migration"`
}
func (a Args) Epilogue() string {
return "Use `<cmd> --help` for help with individual commands"
}
func main() {
var a Args
p := arg.MustParse(&a)
if p.Subcommand() == nil {
p.WriteHelp(os.Stderr)
os.Exit(1)
}
service := p.SubcommandNames()[0]
var brantArgs *cli.Args
switch {
case a.ServiceMeta != nil:
brantArgs = a.ServiceMeta
case a.ServiceGit != nil:
brantArgs = a.ServiceGit
case a.ServiceHg != nil:
brantArgs = a.ServiceHg
case a.ServiceBuilds != nil:
brantArgs = a.ServiceBuilds
case a.ServiceTodo != nil:
brantArgs = a.ServiceTodo
case a.ServiceLists != nil:
brantArgs = a.ServiceLists
case a.ServiceMan != nil:
brantArgs = a.ServiceMan
case a.ServiceHub != nil:
brantArgs = a.ServiceHub
case a.ServicePaste != nil:
brantArgs = a.ServicePaste
case a.ServicePages != nil:
brantArgs = a.ServicePages
default:
panic(fmt.Errorf("unhandled service: %s", service))
}
cfg := config.LoadFiles()
if brantArgs.DataSourceName == "" {
dbstring, ok := cfg.Get(service, "connection-string")
if !ok {
log.Fatalf("No database configured for %s", service)
}
brantArgs.DataSourceName = dbstring
}
if brantArgs.Directory == "" {
m, err := os.Stat("migrations")
if err != nil && !errors.Is(err, os.ErrNotExist) {
log.Fatalf("Error checking for migrations: %s", err.Error())
}
if err == nil && m.IsDir() {
log.Println("sourcehut-migrate: ./migrations directory found, not defaulting to sr.ht::assets")
} else {
assetsDir := "/usr/share/sourcehut"
if assets, ok := cfg.Get("sr.ht", "assets"); ok {
assetsDir = assets
}
migrations := filepath.Join(assetsDir, "migrations", service)
brantArgs.Directory = migrations
}
}
cli.RunWithArgs(brantArgs)
}