diff --git a/pkg/archive/zip/zip.go b/pkg/archive/zip/zip.go index 507c843077f..7005465d14a 100644 --- a/pkg/archive/zip/zip.go +++ b/pkg/archive/zip/zip.go @@ -5,8 +5,10 @@ package zip import ( "archive/zip" "compress/flate" + "fmt" "io" "os" + "path/filepath" "github.com/goreleaser/goreleaser/pkg/config" ) @@ -57,9 +59,17 @@ func (a Archive) Add(f config.File) error { if err != nil { return err } - if info.IsDir() || info.Mode()&os.ModeSymlink != 0 { + if info.IsDir() { return nil } + if info.Mode()&os.ModeSymlink != 0 { + link, err := os.Readlink(f.Source) // #nosec + if err != nil { + return fmt.Errorf("%s: %w", f.Source, err) + } + _, err = io.WriteString(w, filepath.ToSlash(link)) + return err + } file, err := os.Open(f.Source) // #nosec if err != nil { return err diff --git a/pkg/archive/zip/zip_test.go b/pkg/archive/zip/zip_test.go index 1d5d3840804..231027bbd2a 100644 --- a/pkg/archive/zip/zip_test.go +++ b/pkg/archive/zip/zip_test.go @@ -2,6 +2,7 @@ package zip import ( "archive/zip" + "bytes" "io" "io/fs" "os" @@ -85,6 +86,13 @@ func TestZipFile(t *testing.T) { } if zf.Name == "link.txt" { require.True(t, zf.FileInfo().Mode()&os.ModeSymlink != 0) + rc, err := zf.Open() + require.NoError(t, err) + var link bytes.Buffer + _, err = io.Copy(&link, rc) + require.NoError(t, err) + rc.Close() + require.Equal(t, link.String(), "regular.txt") } } require.Equal(t, []string{