diff --git a/internal/pipe/archive/archive.go b/internal/pipe/archive/archive.go index 4848c33da58..7cb082362b0 100644 --- a/internal/pipe/archive/archive.go +++ b/internal/pipe/archive/archive.go @@ -13,6 +13,7 @@ import ( "github.com/apex/log" "github.com/campoy/unique" "github.com/mattn/go-zglob" + "github.com/pkg/errors" "github.com/goreleaser/goreleaser/internal/artifact" "github.com/goreleaser/goreleaser/internal/ids" @@ -131,8 +132,9 @@ func create(ctx *context.Context, archive config.Archive, binaries []*artifact.A var log = log.WithField("archive", archivePath) log.Info("creating") - wrap, err := tmpl.New(ctx). - WithArtifact(binaries[0], archive.Replacements). + template := tmpl.New(ctx). + WithArtifact(binaries[0], archive.Replacements) + wrap, err := template. Apply(wrapFolder(archive)) if err != nil { return err @@ -141,7 +143,7 @@ func create(ctx *context.Context, archive config.Archive, binaries []*artifact.A var a = NewEnhancedArchive(archivelib.New(archiveFile), wrap) defer a.Close() // nolint: errcheck - files, err := findFiles(archive) + files, err := findFiles(template, archive) if err != nil { return fmt.Errorf("failed to find files to archive: %s", err.Error()) } @@ -210,11 +212,15 @@ func skip(ctx *context.Context, archive config.Archive, binaries []*artifact.Art return nil } -func findFiles(archive config.Archive) (result []string, err error) { +func findFiles(template *tmpl.Template, archive config.Archive) (result []string, err error) { for _, glob := range archive.Files { - files, err := zglob.Glob(glob) + replaced, err := template.Apply(glob) + if err != nil { + return result, errors.Wrapf(err, "failed to apply template %s", glob) + } + files, err := zglob.Glob(replaced) if err != nil { - return result, fmt.Errorf("globbing failed for pattern %s: %s", glob, err.Error()) + return result, errors.Wrapf(err, "globbing failed for pattern %s", glob) } result = append(result, files...) } diff --git a/internal/pipe/archive/archive_test.go b/internal/pipe/archive/archive_test.go index 162a0cc1cde..c6906d1a60d 100644 --- a/internal/pipe/archive/archive_test.go +++ b/internal/pipe/archive/archive_test.go @@ -4,6 +4,7 @@ import ( "archive/tar" "archive/zip" "compress/gzip" + "fmt" "io" "io/ioutil" "os" @@ -39,10 +40,12 @@ func TestRunPipe(t *testing.T) { createFakeBinary(t, dist, arch, "mybin") } createFakeBinary(t, dist, "windowsamd64", "mybin.exe") - _, err := os.Create(filepath.Join(folder, "README.md")) - require.NoError(t, err) + for _, tt := range []string{"darwin", "linux", "windows"} { + _, err := os.Create(filepath.Join(folder, fmt.Sprintf("README.%s.md", tt))) + require.NoError(t, err) + } require.NoError(t, os.MkdirAll(filepath.Join(folder, "foo", "bar", "foobar"), 0755)) - _, err = os.Create(filepath.Join(filepath.Join(folder, "foo", "bar", "foobar", "blah.txt"))) + _, err := os.Create(filepath.Join(filepath.Join(folder, "foo", "bar", "foobar", "blah.txt"))) require.NoError(t, err) var ctx = context.New( config.Project{ @@ -54,7 +57,7 @@ func TestRunPipe(t *testing.T) { Builds: []string{"default"}, NameTemplate: defaultNameTemplate, Files: []string{ - "README.*", + "README.{{.Os}}.*", "./foo/**/*", }, FormatOverrides: []config.FormatOverride{ @@ -143,16 +146,16 @@ func TestRunPipe(t *testing.T) { if format == "tar.gz" { // Check archive contents - for _, name := range []string{ - "foobar_0.0.1_darwin_amd64.tar.gz", - "foobar_0.0.1_linux_386.tar.gz", - "foobar_0.0.1_linux_armv7.tar.gz", - "foobar_0.0.1_linux_mips_softfloat.tar.gz", + for name, os := range map[string]string{ + "foobar_0.0.1_darwin_amd64.tar.gz": "darwin", + "foobar_0.0.1_linux_386.tar.gz": "linux", + "foobar_0.0.1_linux_armv7.tar.gz": "linux", + "foobar_0.0.1_linux_mips_softfloat.tar.gz": "linux", } { require.Equal( t, []string{ - "README.md", + fmt.Sprintf("README.%s.md", os), "foo/bar", "foo/bar/foobar", "foo/bar/foobar/blah.txt", @@ -166,7 +169,7 @@ func TestRunPipe(t *testing.T) { require.Equal( t, []string{ - "README.md", + "README.windows.md", "foo/bar/foobar/blah.txt", "mybin.exe", }, @@ -372,6 +375,44 @@ func TestRunPipeInvalidNameTemplate(t *testing.T) { require.EqualError(t, Pipe{}.Run(ctx), `template: tmpl:1: unexpected "}" in operand`) } +func TestRunPipeInvalidFilesNameTemplate(t *testing.T) { + folder, back := testlib.Mktmp(t) + defer back() + var dist = filepath.Join(folder, "dist") + require.NoError(t, os.Mkdir(dist, 0755)) + require.NoError(t, os.Mkdir(filepath.Join(dist, "darwinamd64"), 0755)) + _, err := os.Create(filepath.Join(dist, "darwinamd64", "mybin")) + require.NoError(t, err) + var ctx = context.New( + config.Project{ + Dist: dist, + Archives: []config.Archive{ + { + Builds: []string{"default"}, + NameTemplate: "foo", + Format: "zip", + Files: []string{ + "{{.asdsd}", + }, + }, + }, + }, + ) + ctx.Git.CurrentTag = "v0.0.1" + ctx.Artifacts.Add(&artifact.Artifact{ + Goos: "darwin", + Goarch: "amd64", + Name: "mybin", + Path: filepath.Join("dist", "darwinamd64", "mybin"), + Type: artifact.Binary, + Extra: map[string]interface{}{ + "Binary": "mybin", + "ID": "default", + }, + }) + require.EqualError(t, Pipe{}.Run(ctx), `failed to find files to archive: failed to apply template {{.asdsd}: template: tmpl:1: unexpected "}" in operand`) +} + func TestRunPipeInvalidWrapInDirectoryTemplate(t *testing.T) { folder, back := testlib.Mktmp(t) defer back() diff --git a/www/content/archive.md b/www/content/archive.md index 416357a9dc5..772c55a2d6f 100644 --- a/www/content/archive.md +++ b/www/content/archive.md @@ -62,12 +62,12 @@ archives: - goos: windows format: zip - # Additional files/globs you want to add to the archive. + # Additional files/template/globs you want to add to the archive. # Defaults are any files matching `LICENCE*`, `LICENSE*`, # `README*` and `CHANGELOG*` (case-insensitive). files: - LICENSE.txt - - README.md + - README_{{.Os}}.md - CHANGELOG.md - docs/* - design/*.png