provision storage outside of builder
3 files changed, 51 insertions(+), 30 deletions(-)
M cmd/build/main.go → cmd/build/main.go
@@ -6,6 +6,7 @@ "os" "go.alanpearce.eu/website/internal/builder" "go.alanpearce.eu/website/internal/config" + "go.alanpearce.eu/website/internal/storage/files" "go.alanpearce.eu/website/internal/vcs" "go.alanpearce.eu/x/log"@@ -15,33 +16,47 @@ ) const branch = "main" +type Options struct { + *builder.Options + Destination string `conf:"default:./public,short:d,flag:dest"` + Compress bool `conf:"default:true"` +} + func main() { - builderOptions := &builder.Options{} - if help, err := conf.Parse("", builderOptions); err != nil { + options := &Options{} + if help, err := conf.Parse("", options); err != nil { if errors.Is(err, conf.ErrHelpWanted) { fmt.Println(help) os.Exit(1) } panic("error parsing configuration: " + err.Error()) } - log := log.Configure(!builderOptions.Development) + log := log.Configure(!options.Development) repo, _, err := vcs.CloneOrOpen(&vcs.Options{ - LocalPath: builderOptions.Source, - RemoteURL: builderOptions.VCSRemoteURL, + LocalPath: options.Source, + RemoteURL: options.VCSRemoteURL, Branch: branch, }, log.Named("vcs")) if err != nil { panic("could not open repository: " + err.Error()) } - builderOptions.Repo = repo + options.Repo = repo + + storage, err := files.NewWriter(options.Destination, log.Named("storage"), &files.Options{ + Compress: options.Compress, + }) + if err != nil { + panic("could not create storage: " + err.Error()) + } + options.Storage = storage log.Debug("starting build process") - cfg, err := config.GetConfig(builderOptions.Source, log) + cfg, err := config.GetConfig(options.Source, log) if err != nil { log.Error("could not read config", "error", err) } - _, err = builder.BuildSite(builderOptions, cfg, log) + _, err = builder.BuildSite(options.Options, cfg, log) if err != nil { log.Error("could not build site", "error", err) os.Exit(1)
M internal/builder/builder.go → internal/builder/builder.go
@@ -2,7 +2,6 @@ package builder import ( "context" - "database/sql" "fmt" "io" "os"@@ -16,7 +15,6 @@ "go.alanpearce.eu/website/internal/config" "go.alanpearce.eu/website/internal/content" "go.alanpearce.eu/website/internal/sitemap" "go.alanpearce.eu/website/internal/storage" - "go.alanpearce.eu/website/internal/storage/sqlite" "go.alanpearce.eu/website/internal/vcs" "go.alanpearce.eu/website/templates" "go.alanpearce.eu/x/log"@@ -26,11 +24,12 @@ "gitlab.com/tozd/go/errors" ) type Options struct { - Source string `conf:"default:.,short:s,flag:src"` - Development bool `conf:"default:false,flag:dev"` - VCSRemoteURL config.URL `conf:"default:https://git.alanpearce.eu/website"` - DB *sql.DB `conf:"-"` - Repo *vcs.Repository `conf:"-"` + Source string `conf:"default:.,short:s,flag:src"` + Development bool `conf:"default:false,flag:dev"` + VCSRemoteURL config.URL `conf:"default:https://git.alanpearce.eu/website"` + + Storage storage.Writer `conf:"-"` + Repo *vcs.Repository `conf:"-"` } type Result struct {@@ -63,7 +62,6 @@ return nil } func build( - storage storage.Writer, options *Options, config *config.Config, log *log.Logger,@@ -71,6 +69,7 @@ ) (*Result, error) { ctx := context.TODO() buf := new(buffer.Buffer) joinSource := joinSourcePath(options.Source) + storage := options.Storage r := &Result{ Hashes: make([]string, 0),@@ -281,13 +280,5 @@ cfg.EnableGoatCounter = !options.Development templates.Init() - var storage storage.Writer - storage, err := sqlite.NewWriter(options.DB, log.Named("storage"), &sqlite.Options{ - Compress: true, - }) - if err != nil { - return nil, errors.WithMessage(err, "could not create storage writer") - } - - return build(storage, options, cfg, log) + return build(options, cfg, log) }
M internal/website/website.go → internal/website/website.go
@@ -90,9 +90,16 @@ cfg.BaseURL = opts.BaseURL } - builderOptions.DB, err = sqlite.OpenDB(opts.DBPath) + db, err := sqlite.OpenDB(opts.DBPath) if err != nil { return nil, errors.WithMessage(err, "could not open database") + } + + builderOptions.Storage, err = sqlite.NewWriter(db, log.Named("storage"), &sqlite.Options{ + Compress: true, + }) + if err != nil { + return nil, errors.WithMessage(err, "could not create storage writer") } website.Domain = cfg.BaseURL.Hostname()@@ -124,15 +131,23 @@ } go fw.Start(func(filename string) { log.Info("rebuilding site", "changed_file", filename) - builderOptions.DB.Close() - builderOptions.DB, err = sqlite.OpenDB(opts.DBPath) + db.Close() + db, err = sqlite.OpenDB(opts.DBPath) if err != nil { log.Error("error opening database", "error", err) } - website.reader, err = sqlite.NewReader(builderOptions.DB, log.Named("reader")) + website.reader, err = sqlite.NewReader(db, log.Named("reader")) if err != nil { log.Error("error creating sqlite reader", "error", err) } + builderOptions.Storage, err = sqlite.NewWriter( + db, + log.Named("storage"), + &sqlite.Options{}, + ) + if err != nil { + log.Error("error creating sqlite writer", "error", err) + } err := rebuild(builderOptions, cfg, log) if err != nil {@@ -142,7 +157,7 @@ opts.LiveReload.Reload() }) } - website.reader, err = sqlite.NewReader(builderOptions.DB, log.Named("reader")) + website.reader, err = sqlite.NewReader(db, log.Named("reader")) if err != nil { return nil, errors.WithMessage(err, "error creating sqlite reader") }