1
0
mirror of https://github.com/goreleaser/goreleaser.git synced 2025-03-17 20:47:50 +02:00

fix: tmpl always copy before modifying (#5200)

this is just to prevent some gotchas when using `templ` internally.
This commit is contained in:
Carlos Alexandro Becker 2024-10-14 23:59:26 -03:00 committed by GitHub
parent 7f50679c4b
commit 91525f763c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 54 additions and 25 deletions

View File

@ -4,6 +4,7 @@ package tmpl
import (
"bytes"
"fmt"
"maps"
"path/filepath"
"regexp"
"strings"
@ -141,6 +142,16 @@ func New(ctx *context.Context) *Template {
}
}
// WithExtraFields allows to add new more custom fields to the template.
// It will override fields with the same name.
func (t *Template) WithExtraFields(f Fields) *Template {
tt := t.copying()
for k, v := range f {
tt.fields[k] = v
}
return tt
}
// WithEnvS overrides template's env field with the given KEY=VALUE list of
// environment variables.
func (t *Template) WithEnvS(envs []string) *Template {
@ -157,35 +168,28 @@ func (t *Template) WithEnvS(envs []string) *Template {
// WithEnv overrides template's env field with the given environment map.
func (t *Template) WithEnv(e map[string]string) *Template {
t.fields[env] = context.Env(e)
return t
}
// WithExtraFields allows to add new more custom fields to the template.
// It will override fields with the same name.
func (t *Template) WithExtraFields(f Fields) *Template {
for k, v := range f {
t.fields[k] = v
}
return t
return t.WithExtraFields(Fields{
env: context.Env(e),
})
}
// WithArtifact populates Fields from the artifact.
func (t *Template) WithArtifact(a *artifact.Artifact) *Template {
t.fields[osKey] = a.Goos
t.fields[arch] = a.Goarch
t.fields[amd64] = a.Goamd64
t.fields[go386] = a.Go386
t.fields[arm] = a.Goarm
t.fields[arm64] = a.Goarm64
t.fields[mips] = a.Gomips
t.fields[ppc64] = a.Goppc64
t.fields[riscv64] = a.Goriscv64
t.fields[binary] = artifact.ExtraOr(*a, binary, t.fields[projectName].(string))
t.fields[artifactName] = a.Name
t.fields[artifactExt] = artifact.ExtraOr(*a, artifact.ExtraExt, "")
t.fields[artifactPath] = a.Path
return t
return t.WithExtraFields(Fields{
osKey: a.Goos,
arch: a.Goarch,
amd64: a.Goamd64,
go386: a.Go386,
arm: a.Goarm,
arm64: a.Goarm64,
mips: a.Gomips,
ppc64: a.Goppc64,
riscv64: a.Goriscv64,
binary: artifact.ExtraOr(*a, binary, t.fields[projectName].(string)),
artifactName: a.Name,
artifactExt: artifact.ExtraOr(*a, artifact.ExtraExt, ""),
artifactPath: a.Path,
})
}
func (t *Template) WithBuildOptions(opts build.Options) *Template {
@ -284,6 +288,14 @@ func (t *Template) envOrDefault(name, value string) string {
return s
}
func (t *Template) copying() *Template {
tpl := &Template{
fields: Fields{},
}
maps.Copy(tpl.fields, t.fields)
return tpl
}
type ExpectedSingleEnvErr struct{}
func (e ExpectedSingleEnvErr) Error() string {

View File

@ -471,3 +471,20 @@ func TestWithBuildOptions(t *testing.T) {
require.NoError(t, err)
require.Equal(t, "name_./path_.ext_target_os_arch_amd64_arm_mips", out)
}
func TestReuseTpl(t *testing.T) {
tp := New(testctx.New()).WithExtraFields(Fields{
"foo": "bar",
})
s1, err := tp.Apply("{{.foo}}")
require.NoError(t, err)
require.Equal(t, "bar", s1)
s2, err := tp.WithExtraFields(Fields{"foo": "not-bar"}).Apply("{{.foo}}")
require.NoError(t, err)
require.Equal(t, "not-bar", s2)
s3, err := tp.Apply("{{.foo}}")
require.NoError(t, err)
require.Equal(t, "bar", s3)
}