mirror of
https://github.com/goreleaser/goreleaser.git
synced 2025-03-19 20:57:53 +02:00
Maybe 3rd time is the charm! This makes the CI build run on windows too, and fix broken tests/featuers on Windows. Most of the changes are related to ignoring certain tests on windows, or making sure to use the right path separators. More work to do in the future, probably! #4293 --------- Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>
215 lines
5.1 KiB
Go
215 lines
5.1 KiB
Go
package tar
|
|
|
|
import (
|
|
"archive/tar"
|
|
"io"
|
|
"io/fs"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/goreleaser/goreleaser/v2/internal/testlib"
|
|
"github.com/goreleaser/goreleaser/v2/pkg/config"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestTarFile(t *testing.T) {
|
|
tmp := t.TempDir()
|
|
f, err := os.Create(filepath.Join(tmp, "test.tar"))
|
|
require.NoError(t, err)
|
|
defer f.Close()
|
|
archive := New(f)
|
|
defer archive.Close()
|
|
|
|
require.Error(t, archive.Add(config.File{
|
|
Source: "../testdata/nope.txt",
|
|
Destination: "nope.txt",
|
|
}))
|
|
require.NoError(t, archive.Add(config.File{
|
|
Source: "../testdata/foo.txt",
|
|
Destination: "foo.txt",
|
|
}))
|
|
require.NoError(t, archive.Add(config.File{
|
|
Source: "../testdata/sub1",
|
|
Destination: "sub1",
|
|
}))
|
|
require.NoError(t, archive.Add(config.File{
|
|
Source: "../testdata/sub1/bar.txt",
|
|
Destination: "sub1/bar.txt",
|
|
}))
|
|
require.NoError(t, archive.Add(config.File{
|
|
Source: "../testdata/sub1/executable",
|
|
Destination: "sub1/executable",
|
|
}))
|
|
require.NoError(t, archive.Add(config.File{
|
|
Source: "../testdata/sub1/sub2",
|
|
Destination: "sub1/sub2",
|
|
}))
|
|
require.NoError(t, archive.Add(config.File{
|
|
Source: "../testdata/sub1/sub2/subfoo.txt",
|
|
Destination: "sub1/sub2/subfoo.txt",
|
|
}))
|
|
require.NoError(t, archive.Add(config.File{
|
|
Source: "../testdata/regular.txt",
|
|
Destination: "regular.txt",
|
|
}))
|
|
require.NoError(t, archive.Add(config.File{
|
|
Source: "../testdata/link.txt",
|
|
Destination: "link.txt",
|
|
}))
|
|
|
|
require.ErrorIs(t, archive.Add(config.File{
|
|
Source: "../testdata/regular.txt",
|
|
Destination: "link.txt",
|
|
}), fs.ErrExist)
|
|
|
|
require.NoError(t, archive.Close())
|
|
require.Error(t, archive.Add(config.File{
|
|
Source: "tar.go",
|
|
Destination: "tar.go",
|
|
}))
|
|
require.NoError(t, f.Close())
|
|
|
|
f, err = os.Open(f.Name())
|
|
require.NoError(t, err)
|
|
defer f.Close()
|
|
|
|
info, err := f.Stat()
|
|
require.NoError(t, err)
|
|
require.Lessf(t, info.Size(), int64(10000), "archived file should be smaller than %d", info.Size())
|
|
|
|
var paths []string
|
|
r := tar.NewReader(f)
|
|
for {
|
|
next, err := r.Next()
|
|
if err == io.EOF {
|
|
break
|
|
}
|
|
require.NoError(t, err)
|
|
paths = append(paths, next.Name)
|
|
if testlib.IsWindows() {
|
|
// both of the following checks don't work on windows.
|
|
continue
|
|
}
|
|
if next.Name == "sub1/executable" {
|
|
require.NotEqualf(
|
|
t,
|
|
0,
|
|
next.FileInfo().Mode()&0o111,
|
|
"expected executable perms, got %s",
|
|
next.FileInfo().Mode().String(),
|
|
)
|
|
}
|
|
if next.Name == "link.txt" {
|
|
require.Equal(t, "regular.txt", next.Linkname)
|
|
}
|
|
}
|
|
require.Equal(t, []string{
|
|
"foo.txt",
|
|
"sub1",
|
|
"sub1/bar.txt",
|
|
"sub1/executable",
|
|
"sub1/sub2",
|
|
"sub1/sub2/subfoo.txt",
|
|
"regular.txt",
|
|
"link.txt",
|
|
}, paths)
|
|
}
|
|
|
|
func TestTarFileInfo(t *testing.T) {
|
|
now := time.Now().Truncate(time.Second)
|
|
f, err := os.Create(filepath.Join(t.TempDir(), "test.tar"))
|
|
require.NoError(t, err)
|
|
defer f.Close()
|
|
archive := New(f)
|
|
defer archive.Close()
|
|
|
|
require.NoError(t, archive.Add(config.File{
|
|
Source: "../testdata/foo.txt",
|
|
Destination: "nope.txt",
|
|
Info: config.FileInfo{
|
|
Mode: 0o755,
|
|
Owner: "carlos",
|
|
Group: "root",
|
|
ParsedMTime: now,
|
|
},
|
|
}))
|
|
|
|
require.NoError(t, archive.Close())
|
|
require.NoError(t, f.Close())
|
|
|
|
f, err = os.Open(f.Name())
|
|
require.NoError(t, err)
|
|
defer f.Close()
|
|
|
|
var found int
|
|
r := tar.NewReader(f)
|
|
for {
|
|
next, err := r.Next()
|
|
if err == io.EOF {
|
|
break
|
|
}
|
|
require.NoError(t, err)
|
|
|
|
found++
|
|
require.Equal(t, "nope.txt", next.Name)
|
|
require.Equal(t, now, next.ModTime)
|
|
require.Equal(t, fs.FileMode(0o755), next.FileInfo().Mode())
|
|
require.Equal(t, "carlos", next.Uname)
|
|
require.Equal(t, 0, next.Uid)
|
|
require.Equal(t, "root", next.Gname)
|
|
require.Equal(t, 0, next.Gid)
|
|
}
|
|
require.Equal(t, 1, found)
|
|
}
|
|
|
|
func TestTarInvalidLink(t *testing.T) {
|
|
archive := New(io.Discard)
|
|
defer archive.Close()
|
|
|
|
require.NoError(t, archive.Add(config.File{
|
|
Source: "../testdata/badlink.txt",
|
|
Destination: "badlink.txt",
|
|
}))
|
|
}
|
|
|
|
func TestCopying(t *testing.T) {
|
|
f1, err := os.Create(filepath.Join(t.TempDir(), "1.tar"))
|
|
require.NoError(t, err)
|
|
f2, err := os.Create(filepath.Join(t.TempDir(), "2.tar"))
|
|
require.NoError(t, err)
|
|
|
|
t1 := New(f1)
|
|
require.NoError(t, t1.Add(config.File{
|
|
Source: "../testdata/foo.txt",
|
|
Destination: "foo.txt",
|
|
}))
|
|
require.NoError(t, t1.Add(config.File{
|
|
Source: "../testdata/foo.txt",
|
|
Destination: "ملف.txt",
|
|
}))
|
|
require.NoError(t, t1.Close())
|
|
require.NoError(t, f1.Close())
|
|
|
|
f1, err = os.Open(f1.Name())
|
|
require.NoError(t, err)
|
|
|
|
t2, err := Copy(f1, f2)
|
|
require.NoError(t, err)
|
|
require.NoError(t, t2.Add(config.File{
|
|
Source: "../testdata/sub1/executable",
|
|
Destination: "executable",
|
|
}))
|
|
require.NoError(t, t2.Add(config.File{
|
|
Source: "../testdata/sub1/executable",
|
|
Destination: "ملف.exe",
|
|
}))
|
|
require.NoError(t, t2.Close())
|
|
require.NoError(t, f2.Close())
|
|
require.NoError(t, f1.Close())
|
|
|
|
require.Equal(t, []string{"foo.txt", "ملف.txt"}, testlib.LsArchive(t, f1.Name(), "tar"))
|
|
require.Equal(t, []string{"foo.txt", "ملف.txt", "executable", "ملف.exe"}, testlib.LsArchive(t, f2.Name(), "tar"))
|
|
}
|