mirror of
https://github.com/goreleaser/goreleaser.git
synced 2025-01-10 03:47:03 +02:00
3c7a63979c
This now works for files added to the source archive **after** the `git archive` command is run. During the `git archive`, it seems that the `tar` is still using some format that doesn't support utf-8 by default. Tomorrow I'll look more into it. see https://pkg.go.dev/archive/tar#Format closes #3812 --------- Signed-off-by: Carlos A Becker <caarlos0@users.noreply.github.com> Co-Authored-By: Mohammed Al Sahaf <msaa1990@gmail.com>
247 lines
6.8 KiB
Go
247 lines
6.8 KiB
Go
package sourcearchive
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/goreleaser/goreleaser/internal/artifact"
|
|
"github.com/goreleaser/goreleaser/internal/testctx"
|
|
"github.com/goreleaser/goreleaser/internal/testlib"
|
|
"github.com/goreleaser/goreleaser/pkg/config"
|
|
"github.com/goreleaser/goreleaser/pkg/context"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestArchive(t *testing.T) {
|
|
for _, format := range []string{"tar.gz", "tar", "zip"} {
|
|
t.Run(format, func(t *testing.T) {
|
|
tmp := testlib.Mktmp(t)
|
|
require.NoError(t, os.Mkdir("dist", 0o744))
|
|
|
|
testlib.GitInit(t)
|
|
require.NoError(t, os.WriteFile("code.rb", []byte("not really code"), 0o655))
|
|
require.NoError(t, os.WriteFile("code.py", []byte("print 1"), 0o655))
|
|
require.NoError(t, os.WriteFile("README.md", []byte("# my dope fake project"), 0o655))
|
|
require.NoError(t, os.WriteFile("ملف.go", []byte("محتوى عربي"), 0o655))
|
|
require.NoError(t, os.WriteFile("🤔.patch", []byte("thinking"), 0o655))
|
|
require.NoError(t, os.WriteFile(".gitignore", []byte(`
|
|
added-later.txt
|
|
ignored.txt
|
|
code.txt
|
|
subfolder/
|
|
`), 0o655))
|
|
|
|
require.NoError(t, os.WriteFile(".gitattributes", []byte(`
|
|
.VERSION export-subst
|
|
`), 0o655))
|
|
require.NoError(t, os.WriteFile(".VERSION", []byte("$Format:%d$"), 0o655))
|
|
testlib.GitAdd(t)
|
|
testlib.GitCommit(t, "feat: first")
|
|
testlib.GitTag(t, "v1.0.0")
|
|
require.NoError(t, os.WriteFile("added-later.txt", []byte("this file was added later"), 0o655))
|
|
require.NoError(t, os.WriteFile("ignored.md", []byte("never added"), 0o655))
|
|
require.NoError(t, os.WriteFile("code.txt", []byte("not really code"), 0o655))
|
|
require.NoError(t, os.WriteFile("ملف.txt", []byte("محتوى عربي"), 0o655))
|
|
require.NoError(t, os.WriteFile("🤝", []byte("it works"), 0o655))
|
|
require.NoError(t, os.MkdirAll("subfolder", 0o755))
|
|
require.NoError(t, os.WriteFile("subfolder/file.md", []byte("a file within a folder, added later"), 0o655))
|
|
|
|
t.Run("with extra files", func(t *testing.T) {
|
|
doVerifyTestArchive(
|
|
t,
|
|
testctx.NewWithCfg(
|
|
config.Project{
|
|
ProjectName: "foo",
|
|
Dist: "dist",
|
|
Source: config.Source{
|
|
Format: format,
|
|
Enabled: true,
|
|
PrefixTemplate: "{{ .ProjectName }}-{{ .Version }}/",
|
|
Files: []config.File{
|
|
{Source: "*.txt"},
|
|
{Source: "subfolder/*"},
|
|
},
|
|
},
|
|
},
|
|
testctx.WithCommit("HEAD"),
|
|
testctx.WithVersion("1.0.0"),
|
|
testctx.WithCurrentTag("v1.0.0"),
|
|
),
|
|
tmp,
|
|
format,
|
|
[]string{
|
|
"foo-1.0.0/",
|
|
"foo-1.0.0/.VERSION",
|
|
"foo-1.0.0/.gitattributes",
|
|
"foo-1.0.0/.gitignore",
|
|
"foo-1.0.0/README.md",
|
|
"foo-1.0.0/added-later.txt",
|
|
"foo-1.0.0/code.py",
|
|
"foo-1.0.0/code.rb",
|
|
"foo-1.0.0/code.txt",
|
|
"foo-1.0.0/subfolder/file.md",
|
|
"foo-1.0.0/ملف.go",
|
|
"foo-1.0.0/ملف.txt",
|
|
"foo-1.0.0/🤔.patch",
|
|
},
|
|
)
|
|
})
|
|
|
|
t.Run("simple", func(t *testing.T) {
|
|
doVerifyTestArchive(
|
|
t,
|
|
testctx.NewWithCfg(
|
|
config.Project{
|
|
ProjectName: "foo",
|
|
Dist: "dist",
|
|
Source: config.Source{
|
|
Format: format,
|
|
Enabled: true,
|
|
PrefixTemplate: "{{ .ProjectName }}-{{ .Version }}/",
|
|
},
|
|
},
|
|
testctx.WithCommit("HEAD"),
|
|
testctx.WithVersion("1.0.0"),
|
|
testctx.WithCurrentTag("v1.0.0"),
|
|
),
|
|
tmp,
|
|
format,
|
|
[]string{
|
|
"foo-1.0.0/",
|
|
"foo-1.0.0/.VERSION",
|
|
"foo-1.0.0/.gitattributes",
|
|
"foo-1.0.0/.gitignore",
|
|
"foo-1.0.0/README.md",
|
|
"foo-1.0.0/code.py",
|
|
"foo-1.0.0/code.rb",
|
|
"foo-1.0.0/ملف.go",
|
|
"foo-1.0.0/🤔.patch",
|
|
},
|
|
)
|
|
})
|
|
})
|
|
}
|
|
}
|
|
|
|
func doVerifyTestArchive(tb testing.TB, ctx *context.Context, tmp, format string, expected []string) {
|
|
tb.Helper()
|
|
require.NoError(tb, Pipe{}.Default(ctx))
|
|
require.NoError(tb, Pipe{}.Run(ctx))
|
|
|
|
artifacts := ctx.Artifacts.List()
|
|
require.Len(tb, artifacts, 1)
|
|
require.Equal(tb, artifact.Artifact{
|
|
Type: artifact.UploadableSourceArchive,
|
|
Name: "foo-1.0.0." + format,
|
|
Path: "dist/foo-1.0.0." + format,
|
|
Extra: map[string]interface{}{
|
|
artifact.ExtraFormat: format,
|
|
},
|
|
}, *artifacts[0])
|
|
path := filepath.Join(tmp, "dist", "foo-1.0.0."+format)
|
|
stat, err := os.Stat(path)
|
|
require.NoError(tb, err)
|
|
require.Greater(tb, stat.Size(), int64(100))
|
|
|
|
require.ElementsMatch(tb, expected, testlib.LsArchive(tb, path, format))
|
|
|
|
version := testlib.GetFileFromArchive(tb, path, format, "foo-1.0.0/.VERSION")
|
|
require.Equal(tb, " (HEAD -> main, tag: v1.0.0)", string(version))
|
|
}
|
|
|
|
func TestInvalidFormat(t *testing.T) {
|
|
ctx := testctx.NewWithCfg(config.Project{
|
|
Dist: t.TempDir(),
|
|
ProjectName: "foo",
|
|
Source: config.Source{
|
|
Format: "7z",
|
|
Enabled: true,
|
|
PrefixTemplate: "{{ .ProjectName }}-{{ .Version }}/",
|
|
},
|
|
})
|
|
require.NoError(t, Pipe{}.Default(ctx))
|
|
require.EqualError(t, Pipe{}.Run(ctx), "invalid source archive format: 7z")
|
|
}
|
|
|
|
func TestDefault(t *testing.T) {
|
|
ctx := testctx.New()
|
|
require.NoError(t, Pipe{}.Default(ctx))
|
|
require.Equal(t, config.Source{
|
|
NameTemplate: "{{ .ProjectName }}-{{ .Version }}",
|
|
Format: "tar.gz",
|
|
}, ctx.Config.Source)
|
|
}
|
|
|
|
func TestInvalidNameTemplate(t *testing.T) {
|
|
ctx := testctx.NewWithCfg(config.Project{
|
|
Source: config.Source{
|
|
Enabled: true,
|
|
NameTemplate: "{{ .foo }-asdda",
|
|
},
|
|
})
|
|
require.NoError(t, Pipe{}.Default(ctx))
|
|
testlib.RequireTemplateError(t, Pipe{}.Run(ctx))
|
|
}
|
|
|
|
func TestInvalidInvalidFileTemplate(t *testing.T) {
|
|
testlib.Mktmp(t)
|
|
require.NoError(t, os.Mkdir("dist", 0o744))
|
|
|
|
testlib.GitInit(t)
|
|
require.NoError(t, os.WriteFile("code.txt", []byte("not really code"), 0o655))
|
|
testlib.GitAdd(t)
|
|
testlib.GitCommit(t, "feat: first")
|
|
|
|
ctx := testctx.NewWithCfg(config.Project{
|
|
ProjectName: "foo",
|
|
Dist: "dist",
|
|
Source: config.Source{
|
|
Format: "tar.gz",
|
|
Enabled: true,
|
|
Files: []config.File{
|
|
{Source: "{{.Test}"},
|
|
},
|
|
},
|
|
})
|
|
ctx.Git.FullCommit = "HEAD"
|
|
ctx.Version = "1.0.0"
|
|
require.NoError(t, Pipe{}.Default(ctx))
|
|
testlib.RequireTemplateError(t, Pipe{}.Run(ctx))
|
|
}
|
|
|
|
func TestInvalidPrefixTemplate(t *testing.T) {
|
|
ctx := testctx.NewWithCfg(config.Project{
|
|
Dist: t.TempDir(),
|
|
Source: config.Source{
|
|
Enabled: true,
|
|
PrefixTemplate: "{{ .ProjectName }/",
|
|
},
|
|
})
|
|
require.NoError(t, Pipe{}.Default(ctx))
|
|
testlib.RequireTemplateError(t, Pipe{}.Run(ctx))
|
|
}
|
|
|
|
func TestDisabled(t *testing.T) {
|
|
require.True(t, Pipe{}.Skip(testctx.New()))
|
|
}
|
|
|
|
func TestSkip(t *testing.T) {
|
|
t.Run("skip", func(t *testing.T) {
|
|
require.True(t, Pipe{}.Skip(testctx.New()))
|
|
})
|
|
|
|
t.Run("dont skip", func(t *testing.T) {
|
|
ctx := testctx.NewWithCfg(config.Project{
|
|
Source: config.Source{
|
|
Enabled: true,
|
|
},
|
|
})
|
|
require.False(t, Pipe{}.Skip(ctx))
|
|
})
|
|
}
|
|
|
|
func TestString(t *testing.T) {
|
|
require.NotEmpty(t, Pipe{}.String())
|
|
}
|