From c0379ed858792b63c58d4afadbc1234703a5ba03 Mon Sep 17 00:00:00 2001 From: Dominik Schulz Date: Wed, 28 Mar 2018 15:55:05 +0200 Subject: [PATCH] feat: Provide time template func This commit adds a customizable time function to the release name template. --- docs/123-release.md | 2 ++ internal/client/name.go | 17 +++++++++++++++ internal/client/name_test.go | 40 ++++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 internal/client/name_test.go diff --git a/docs/123-release.md b/docs/123-release.md index e538f5bb9..9bc26199c 100644 --- a/docs/123-release.md +++ b/docs/123-release.md @@ -31,6 +31,8 @@ release: # - ProjectName # - Tag # - Version (Git tag without `v` prefix) + # There is also a template function "time" that takes a Go time format + # string to insert a formated timestamp into the release name. # Default is `` name_template: "{{.ProjectName}}-v{{.Version}}" ``` diff --git a/internal/client/name.go b/internal/client/name.go index 1e0382e0b..709f3038e 100644 --- a/internal/client/name.go +++ b/internal/client/name.go @@ -3,14 +3,20 @@ package client import ( "bytes" "text/template" + "time" "github.com/goreleaser/goreleaser/context" ) +var ( + timeNow = time.Now +) + func releaseTitle(ctx *context.Context) (string, error) { var out bytes.Buffer t, err := template.New("github"). Option("missingkey=error"). + Funcs(mkFuncMap()). Parse(ctx.Config.Release.NameTemplate) if err != nil { return "", err @@ -24,3 +30,14 @@ func releaseTitle(ctx *context.Context) (string, error) { }) return out.String(), err } + +func mkFuncMap() template.FuncMap { + return template.FuncMap{ + "time": func(s ...string) (string, error) { + if len(s) < 1 { + return "", nil + } + return timeNow().Format(s[0]), nil + }, + } +} diff --git a/internal/client/name_test.go b/internal/client/name_test.go new file mode 100644 index 000000000..bd0565d0b --- /dev/null +++ b/internal/client/name_test.go @@ -0,0 +1,40 @@ +package client + +import ( + "testing" + "time" + + "github.com/goreleaser/goreleaser/config" + "github.com/goreleaser/goreleaser/context" + "github.com/stretchr/testify/assert" +) + +func TestFuncMap(t *testing.T) { + timeNow = func() time.Time { + return time.Date(2018, 12, 11, 10, 9, 8, 7, time.UTC) + } + var ctx = context.New(config.Project{ + ProjectName: "proj", + }) + for _, tc := range []struct { + Template string + Name string + Output string + }{ + { + Template: `{{ time "2006-01-02" }}`, + Name: "YYYY-MM-DD", + Output: "2018-12-11", + }, + { + Template: `{{ time "01/02/2006" }}`, + Name: "MM/DD/YYYY", + Output: "12/11/2018", + }, + } { + ctx.Config.Release.NameTemplate = tc.Template + out, err := releaseTitle(ctx) + assert.NoError(t, err) + assert.Equal(t, tc.Output, out) + } +}