diff --git a/internal/config/config.go b/internal/config/config.go index 3475594..237b2d5 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -7,8 +7,9 @@ import ( "math/rand" "net/url" "reflect" - "strings" "time" + + "github.com/FAU-CDI/wisski-distillery/pkg/pools" ) // Config represents the configuration of a WissKI Distillery. @@ -111,7 +112,8 @@ func (config *Config) CSRFSecret() []byte { // String serializes this configuration into a string func (config Config) String() string { - values := &strings.Builder{} + builder := pools.GetBuilder() + defer pools.ReleaseBuilder(builder) vConfig := reflect.ValueOf(config) tConfig := vConfig.Type() @@ -127,8 +129,8 @@ func (config Config) String() string { continue } - fmt.Fprintf(values, "%s=%v\n", env, vField.Interface()) + fmt.Fprintf(builder, "%s=%v\n", env, vField.Interface()) } - return values.String() + return builder.String() } diff --git a/internal/dis/component/exporter/report.go b/internal/dis/component/exporter/report.go index 349cfef..3663d34 100644 --- a/internal/dis/component/exporter/report.go +++ b/internal/dis/component/exporter/report.go @@ -4,14 +4,16 @@ import ( "encoding/json" "fmt" "io" - "strings" "github.com/FAU-CDI/wisski-distillery/pkg/countwriter" + "github.com/FAU-CDI/wisski-distillery/pkg/pools" ) func (snapshot Snapshot) String() string { - var builder strings.Builder - snapshot.Report(&builder) + builder := pools.GetBuilder() + defer pools.ReleaseBuilder(builder) + + snapshot.Report(builder) return builder.String() } @@ -63,8 +65,10 @@ func (snapshot Snapshot) Report(w io.Writer) (int, error) { // Strings turns this backup into a string for the BackupReport. func (backup Backup) String() string { - var builder strings.Builder - backup.Report(&builder) + builder := pools.GetBuilder() + defer pools.ReleaseBuilder(builder) + + backup.Report(builder) return builder.String() } diff --git a/internal/dis/component/server/home/public.go b/internal/dis/component/server/home/public.go index 9165edb..ac2f9ef 100644 --- a/internal/dis/component/server/home/public.go +++ b/internal/dis/component/server/home/public.go @@ -12,6 +12,7 @@ import ( "github.com/FAU-CDI/wisski-distillery/internal/dis/component/server/templating" "github.com/FAU-CDI/wisski-distillery/internal/status" "github.com/FAU-CDI/wisski-distillery/pkg/httpx" + "github.com/FAU-CDI/wisski-distillery/pkg/pools" ) //go:embed "public.html" @@ -58,13 +59,17 @@ func (home *Home) publicHandler(ctx context.Context) http.Handler { return pc, httpx.ErrNotFound } + // get a builder + builder := pools.GetBuilder() + defer pools.ReleaseBuilder(builder) + // prepare about pc.aboutContext.Instances = home.homeInstances.Get(nil) pc.aboutContext.SelfRedirect = home.Config.SelfRedirect.String() // render the about template - var builder strings.Builder - if err := about.Execute(&builder, pc.aboutContext); err != nil { + + if err := about.Execute(builder, pc.aboutContext); err != nil { return pc, nil } diff --git a/internal/dis/component/server/news/news.go b/internal/dis/component/server/news/news.go index f120074..19b110d 100644 --- a/internal/dis/component/server/news/news.go +++ b/internal/dis/component/server/news/news.go @@ -12,6 +12,7 @@ import ( "github.com/FAU-CDI/wisski-distillery/internal/dis/component" "github.com/FAU-CDI/wisski-distillery/internal/dis/component/server/assets" "github.com/FAU-CDI/wisski-distillery/internal/dis/component/server/templating" + "github.com/FAU-CDI/wisski-distillery/pkg/pools" "github.com/rs/zerolog" "github.com/yuin/goldmark" gmmeta "github.com/yuin/goldmark-meta" @@ -89,7 +90,8 @@ var newsFS embed.FS // Items returns a list of all news items func Items() ([]Item, error) { - var builder strings.Builder + builder := pools.GetBuilder() + defer pools.ReleaseBuilder(builder) files, err := fs.Glob(newsFS, "NEWS/*.md") if err != nil { @@ -99,7 +101,7 @@ func Items() ([]Item, error) { items := make([]Item, len(files)) for i, file := range files { items[i].ID = file[len("NEWS/") : len(file)-len(".md")] - if err := items[i].parse(file, &builder); err != nil { + if err := items[i].parse(file, builder); err != nil { return nil, err } } diff --git a/internal/dis/component/server/templating/base.go b/internal/dis/component/server/templating/base.go index 52ef82f..4ebffea 100644 --- a/internal/dis/component/server/templating/base.go +++ b/internal/dis/component/server/templating/base.go @@ -7,10 +7,10 @@ import ( "html/template" "net/http" "reflect" - "strings" "time" "github.com/FAU-CDI/wisski-distillery/pkg/httpx" + "github.com/FAU-CDI/wisski-distillery/pkg/pools" "github.com/gorilla/csrf" "github.com/rs/zerolog" ) @@ -159,7 +159,9 @@ func (ctx *tContext[C]) renderSafe(name string, t *template.Template, c any) (te } value, err, panicked := func() (value template.HTML, err error, panicked bool) { - var builder strings.Builder + // get a builder + builder := pools.GetBuilder() + defer pools.ReleaseBuilder(builder) defer func() { if panicked { @@ -173,7 +175,7 @@ func (ctx *tContext[C]) renderSafe(name string, t *template.Template, c any) (te }() panicked = true - err = t.Execute(&builder, c) + err = t.Execute(builder, c) panicked = false if err != nil { diff --git a/internal/status/wisski_user.go b/internal/status/wisski_user.go index 44df6f8..569d27c 100644 --- a/internal/status/wisski_user.go +++ b/internal/status/wisski_user.go @@ -7,6 +7,7 @@ import ( "time" "github.com/FAU-CDI/wisski-distillery/internal/phpx" + "github.com/FAU-CDI/wisski-distillery/pkg/pools" "golang.org/x/exp/slices" ) @@ -24,19 +25,20 @@ type DrupalUser struct { } func (du DrupalUser) String() string { - var builder strings.Builder + builder := pools.GetBuilder() + defer pools.ReleaseBuilder(builder) builder.WriteString("DrupalUser{") defer builder.WriteString("}") - fmt.Fprintf(&builder, "UID: %d, ", du.UID) - fmt.Fprintf(&builder, "Name: %q, ", du.Name) + fmt.Fprintf(builder, "UID: %d, ", du.UID) + fmt.Fprintf(builder, "Name: %q, ", du.Name) if du.Mail != "" { - fmt.Fprintf(&builder, "Mail: %q, ", du.Mail) + fmt.Fprintf(builder, "Mail: %q, ", du.Mail) } - fmt.Fprintf(&builder, "Status: %t, ", du.Status) + fmt.Fprintf(builder, "Status: %t, ", du.Status) for _, tn := range []struct { Name string @@ -50,10 +52,10 @@ func (du DrupalUser) String() string { if tn.Time.IsZero() { continue } - fmt.Fprintf(&builder, "%s: %q, ", tn.Name, tn.Time.Format(time.Stamp)) + fmt.Fprintf(builder, "%s: %q, ", tn.Name, tn.Time.Format(time.Stamp)) } - fmt.Fprintf(&builder, "Roles: %s", du.Roles) + fmt.Fprintf(builder, "Roles: %s", du.Roles) return builder.String() } diff --git a/pkg/password/password.go b/pkg/password/password.go index 06ec8b5..0f5e920 100644 --- a/pkg/password/password.go +++ b/pkg/password/password.go @@ -4,7 +4,8 @@ package password import ( "crypto/rand" "math/big" - "strings" + + "github.com/FAU-CDI/wisski-distillery/pkg/pools" ) // NOTE(twiesing): A bunch of scripts cannot properly handle the extra characters in the password. @@ -23,7 +24,8 @@ func Password(length int) (string, error) { } // create a buffer to write the string to! - var password strings.Builder + password := pools.GetBuilder() + defer pools.ReleaseBuilder(password) password.Grow(length) for i := 0; i < length; i++ {