remove buffers in file writer
1 file changed, 38 insertions(+), 84 deletions(-)
changed files
M domain/content/builder/builder.go → domain/content/builder/builder.go
@@ -2,13 +2,13 @@ package builder import ( "fmt" - "io" "os" "path" "path/filepath" "slices" "time" + "alin.ovh/gomponents" "alin.ovh/x/log" "github.com/Southclaws/fault" "github.com/Southclaws/fault/fmsg"@@ -20,7 +20,6 @@ ctemplates "alin.ovh/homestead/domain/content/templates" "alin.ovh/homestead/domain/indieweb/sitemap" vtemplates "alin.ovh/homestead/domain/vanity/templates" "alin.ovh/homestead/domain/web/templates" - "alin.ovh/homestead/shared/buffer" "alin.ovh/homestead/shared/config" "alin.ovh/homestead/shared/storage" "alin.ovh/homestead/shared/vcs"@@ -42,18 +41,12 @@ } } func copyFile(storage storage.Writer, src string, rel string) error { - buf := new(buffer.Buffer) - sf, err := os.Open(src) if err != nil { return fault.Wrap(err) } defer sf.Close() - buf.Reset() - if _, err := io.Copy(buf, sf); err != nil { - return fault.Wrap(err) - } - if err := storage.Write("/"+rel, "", buf); err != nil { + if err := storage.Write("/"+rel, "", sf); err != nil { return fault.Wrap(err) }@@ -65,7 +58,6 @@ options *Options, config *config.Config, log *log.Logger, ) error { - buf := new(buffer.Buffer) joinSource := joinSourcePath(options.Source) stor := options.Storage postDir := "post"@@ -96,25 +88,20 @@ for _, post := range cc.Posts { log.Debug("rendering post", "post", post.Basename) sitemap.AddPath(post.URL, post.Date) - buf.Reset() - if err := ctemplates.PostPage(siteSettings, post).Render(buf); err != nil { - return fault.Wrap(err, fmsg.With("could not render post")) - } - if err := stor.WritePost(post, buf); err != nil { + if err := stor.WritePost(post, ctemplates.PostPage(siteSettings, post)); err != nil { return fault.Wrap(err) } } log.Debug("rendering tags list") - buf.Reset() - if err := ctemplates.TagsPage(siteSettings, ctemplates.TagsPageVars{ - Title: "Tags", - Tags: mapset.Sorted(cc.Tags), - }).Render(buf); err != nil { - return fault.Wrap(err) - } - if err := stor.Write("/tags/", "Tags", buf); err != nil { + err = stor.Write("/tags/", "Tags", + ctemplates.TagsPage(siteSettings, ctemplates.TagsPageVars{ + Title: "Tags", + Tags: mapset.Sorted(cc.Tags), + }), + ) + if err != nil { return fault.Wrap(err) } sitemap.AddPath("/tags/", lastMod)@@ -128,14 +115,13 @@ } } log.Debug("rendering tags page", "tag", tag) url := path.Join("/tags", tag) + "/" - buf.Reset() - if err := ctemplates.TagPage(siteSettings, ctemplates.TagPageVars{ - Tag: tag, - Posts: matchingPosts, - }).Render(buf); err != nil { - return fault.Wrap(err) - } - if err = stor.Write(url, tag, buf); err != nil { + err = stor.Write(url, tag, + ctemplates.TagPage(siteSettings, ctemplates.TagPageVars{ + Tag: tag, + Posts: matchingPosts, + }), + ) + if err != nil { return fault.Wrap(err) } sitemap.AddPath(url, matchingPosts[0].Date)@@ -151,29 +137,22 @@ ) if err != nil { return fault.Wrap(err, fmsg.With("could not render tag feed page")) } - buf.Reset() - if _, err := feed.WriteTo(buf); err != nil { - return fault.Wrap(err) - } file := &storage.File{ Title: title, LastModified: matchingPosts[0].Date, Path: path.Join("/tags", tag, "atom.xml"), FSPath: path.Join("/tags", tag, "atom.xml"), } - if err := stor.WriteFile(file, buf); err != nil { + if err := stor.WriteFile(file, feed); err != nil { return fault.Wrap(err) } } log.Debug("rendering list page") - buf.Reset() - if err := ctemplates.ListPage(siteSettings, ctemplates.ListPageVars{ + listPage := ctemplates.ListPage(siteSettings, ctemplates.ListPageVars{ Posts: cc.Posts, - }).Render(buf); err != nil { - return fault.Wrap(err) - } - if err := stor.Write(path.Join("/", postDir)+"/", "Posts", buf); err != nil { + }) + if err := stor.Write(path.Join("/", postDir)+"/", "Posts", listPage); err != nil { return fault.Wrap(err) } sitemap.AddPath(path.Join("/", postDir)+"/", lastMod)@@ -183,17 +162,13 @@ feed, err := template.RenderFeed(config.Title, config, cc.Posts, "feed") if err != nil { return fault.Wrap(err, fmsg.With("could not render feed")) } - buf.Reset() - if _, err := feed.WriteTo(buf); err != nil { - return fault.Wrap(err) - } file := &storage.File{ Title: config.Title, LastModified: cc.Posts[0].Date, Path: "/atom.xml", FSPath: "/atom.xml", } - if err := stor.WriteFile(file, buf); err != nil { + if err := stor.WriteFile(file, feed); err != nil { return fault.Wrap(err) }@@ -205,37 +180,30 @@ for _, e := range tplFiles { filename := e.Name() - buf.Reset() log.Debug("rendering template file", "filename", filename) - if err := template.CopyFile(filename, buf); err != nil { - return fault.Wrap( - err, - fmsg.With(fmt.Sprintf("could not copy file %s", filename)), - ) + f, err := templates.Files.Open(filename) + if err != nil { + return fault.Wrap(err) } - if err := stor.Write("/"+filename, "", buf); err != nil { + if err := stor.Write("/"+filename, "", templates.MakeWriterTo(f)); err != nil { return fault.Wrap(err) } } for _, post := range cc.Pages { - buf.Reset() log.Debug("rendering page", "source", post.Input, "path", post.URL) + var page gomponents.Node if post.URL == "/" { - if err := ctemplates.Homepage(siteSettings, ctemplates.HomepageVars{ + page = ctemplates.Homepage(siteSettings, ctemplates.HomepageVars{ Email: config.PublicEmail, Me: config.RelMe, Posts: cc.Posts, - }, post).Render(buf); err != nil { - return fault.Wrap(err) - } + }, post) } else { - if err := ctemplates.Page(siteSettings, post).Render(buf); err != nil { - return fault.Wrap(err) - } + page = ctemplates.Page(siteSettings, post) } file := stor.NewFileFromPost(post) - if err := stor.WriteFile(file, buf); err != nil { + if err := stor.WriteFile(file, page.(gomponents.NodeWriter)); err != nil { return fault.Wrap(err) } }@@ -244,26 +212,18 @@ // it would be nice to set LastMod here, but using the latest post // date would be wrong as the homepage has its own content file // without a date, which could be newer sitemap.AddPath("/", time.Time{}) - if err := buf.SeekStart(); err != nil { - return fault.Wrap(err) - } log.Debug("rendering sitemap") - buf.Reset() - if _, err := sitemap.WriteTo(buf); err != nil { - return fault.Wrap(err) - } - if err := stor.Write("/sitemap.xml", "sitemap", buf); err != nil { + if err := stor.Write("/sitemap.xml", "sitemap", sitemap); err != nil { return fault.Wrap(err) } log.Debug("rendering robots.txt") - buf.Reset() - err = template.RenderRobotsTXT(config.BaseURL, buf) + robots, err := template.RenderRobotsTXT(config.BaseURL) if err != nil { return fault.Wrap(err) } - if err := stor.Write("/robots.txt", "", buf); err != nil { + if err := stor.Write("/robots.txt", "", robots); err != nil { return fault.Wrap(err) }@@ -278,20 +238,14 @@ } log.Debug("rendering go packages") for _, p := range config.Go.Packages { - buf.Reset() - if err := vtemplates.GoPackagePage(siteSettings, &config.Go, p).Render(buf); err != nil { - return fault.Wrap(err) - } - if err := stor.Write(fmt.Sprintf("/go/%s.html", p), siteSettings.Title, buf); err != nil { + page := vtemplates.GoPackagePage(siteSettings, &config.Go, p) + if err := stor.Write(fmt.Sprintf("/go/%s.html", p), siteSettings.Title, page); err != nil { return fault.Wrap(err) } } - buf.Reset() - if err := vtemplates.GoPackageListPage(siteSettings, &config.Go).Render(buf); err != nil { - return fault.Wrap(err) - } - if err := stor.Write("/go/", siteSettings.Title, buf); err != nil { + page := vtemplates.GoPackageListPage(siteSettings, &config.Go) + if err := stor.Write("/go/", siteSettings.Title, page); err != nil { return fault.Wrap(err) }