mirror of
https://github.com/goreleaser/nfpm
synced 2024-04-19 20:43:52 +02:00
feat: expand variables in platform field (#601)
* feat: expand variables in platform field Surprising that GOARCH was expanded, but GOOS was not. More consistent to expand both of them the same way ? Signed-off-by: Anders F Björklund <anders.f.bjorklund@gmail.com> * fix: check platform for all packagers Implement platform for deb packager, goes into Architecture. Validate that the platform is "linux", for Alpine and Arch. Signed-off-by: Anders F Björklund <anders.f.bjorklund@gmail.com> Signed-off-by: Anders F Björklund <anders.f.bjorklund@gmail.com>
This commit is contained in:
parent
b547d33731
commit
c195d93dfb
|
@ -108,6 +108,9 @@ func (*Apk) ConventionalExtension() string {
|
|||
|
||||
// Package writes a new apk package to the given writer using the given info.
|
||||
func (*Apk) Package(info *nfpm.Info, apk io.Writer) (err error) {
|
||||
if info.Platform != "linux" {
|
||||
return fmt.Errorf("invalid platform: %s", info.Platform)
|
||||
}
|
||||
info = ensureValidArch(info)
|
||||
if err = info.Validate(); err != nil {
|
||||
return err
|
||||
|
|
|
@ -174,6 +174,15 @@ func TestDefaultWithArch(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestApkPlatform(t *testing.T) {
|
||||
f, err := os.CreateTemp("", "test*.apk")
|
||||
require.NoError(t, err)
|
||||
info := exampleInfo()
|
||||
info.Platform = "darwin"
|
||||
err = Default.Package(info, f)
|
||||
require.Error(t, err)
|
||||
}
|
||||
|
||||
func TestNoInfo(t *testing.T) {
|
||||
err := Default.Package(nfpm.WithDefaults(&nfpm.Info{}), io.Discard)
|
||||
require.Error(t, err)
|
||||
|
|
|
@ -115,6 +115,10 @@ func isOneOf(r rune, rr ...rune) bool {
|
|||
|
||||
// Package writes a new archlinux package to the given writer using the given info.
|
||||
func (ArchLinux) Package(info *nfpm.Info, w io.Writer) error {
|
||||
if info.Platform != "linux" {
|
||||
return fmt.Errorf("invalid platform: %s", info.Platform)
|
||||
}
|
||||
info = ensureValidArch(info)
|
||||
if err := info.Validate(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ import (
|
|||
"archive/tar"
|
||||
"bytes"
|
||||
"io"
|
||||
"os"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
|
@ -99,6 +100,15 @@ func TestArch(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestArchPlatform(t *testing.T) {
|
||||
f, err := os.CreateTemp("", "test*.pkg.tar.zstd")
|
||||
require.NoError(t, err)
|
||||
info := exampleInfo()
|
||||
info.Platform = "darwin"
|
||||
err = Default.Package(info, f)
|
||||
require.Error(t, err)
|
||||
}
|
||||
|
||||
func TestArchNoFiles(t *testing.T) {
|
||||
info := exampleInfo()
|
||||
info.Contents = nil
|
||||
|
|
|
@ -779,7 +779,7 @@ Version: {{ if .Info.Epoch}}{{ .Info.Epoch }}:{{ end }}{{.Info.Version}}
|
|||
{{- if .Info.Release}}-{{ .Info.Release }}{{- end }}
|
||||
Section: {{.Info.Section}}
|
||||
Priority: {{.Info.Priority}}
|
||||
Architecture: {{.Info.Arch}}
|
||||
Architecture: {{ if ne .Info.Platform "linux"}}{{ .Info.Platform }}-{{ end }}{{.Info.Arch}}
|
||||
{{- /* Optional fields */ -}}
|
||||
{{- if .Info.Maintainer}}
|
||||
Maintainer: {{.Info.Maintainer}}
|
||||
|
|
|
@ -107,6 +107,51 @@ func TestDeb(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestDebPlatform(t *testing.T) {
|
||||
f, err := os.CreateTemp("", "test*.deb")
|
||||
require.NoError(t, err)
|
||||
info := exampleInfo()
|
||||
info.Platform = "darwin"
|
||||
err = Default.Package(info, f)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
func extractDebArchitecture(deb *bytes.Buffer) string {
|
||||
for _, s := range strings.Split(deb.String(), "\n") {
|
||||
if strings.Contains(s, "Architecture: ") {
|
||||
return strings.TrimPrefix(s, "Architecture: ")
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func splitDebArchitecture(deb *bytes.Buffer) (string, string) {
|
||||
a := extractDebArchitecture(deb)
|
||||
if strings.Contains(a, "-") {
|
||||
f := strings.Split(a, "-")
|
||||
return f[0], f[1]
|
||||
}
|
||||
return "linux", a
|
||||
}
|
||||
|
||||
func TestDebOS(t *testing.T) {
|
||||
info := exampleInfo()
|
||||
var buf bytes.Buffer
|
||||
err := writeControl(&buf, controlData{info, 0})
|
||||
require.NoError(t, err)
|
||||
o, _ := splitDebArchitecture(&buf)
|
||||
require.Equal(t, "linux", o)
|
||||
}
|
||||
|
||||
func TestDebArch(t *testing.T) {
|
||||
info := exampleInfo()
|
||||
var buf bytes.Buffer
|
||||
err := writeControl(&buf, controlData{info, 0})
|
||||
require.NoError(t, err)
|
||||
_, a := splitDebArchitecture(&buf)
|
||||
require.Equal(t, "amd64", a)
|
||||
}
|
||||
|
||||
func extractDebVersion(deb *bytes.Buffer) string {
|
||||
for _, s := range strings.Split(deb.String(), "\n") {
|
||||
if strings.Contains(s, "Version: ") {
|
||||
|
|
1
nfpm.go
1
nfpm.go
|
@ -177,6 +177,7 @@ func (c *Config) expandEnvVars() {
|
|||
c.Info.Release = os.Expand(c.Info.Release, c.envMappingFunc)
|
||||
c.Info.Version = os.Expand(c.Info.Version, c.envMappingFunc)
|
||||
c.Info.Prerelease = os.Expand(c.Info.Prerelease, c.envMappingFunc)
|
||||
c.Info.Platform = os.Expand(c.Info.Platform, c.envMappingFunc)
|
||||
c.Info.Arch = os.Expand(c.Info.Arch, c.envMappingFunc)
|
||||
for or := range c.Overrides {
|
||||
c.Overrides[or].Conflicts = c.expandEnvVarsStringSlice(c.Overrides[or].Conflicts)
|
||||
|
|
16
nfpm_test.go
16
nfpm_test.go
|
@ -244,6 +244,8 @@ func TestOptionsFromEnvironment(t *testing.T) {
|
|||
debPass = "password123"
|
||||
rpmPass = "secret"
|
||||
apkPass = "foobar"
|
||||
platform = "linux"
|
||||
arch = "amd64"
|
||||
release = "3"
|
||||
version = "1.0.0"
|
||||
vendor = "GoReleaser"
|
||||
|
@ -251,6 +253,20 @@ func TestOptionsFromEnvironment(t *testing.T) {
|
|||
maintainerEmail = "nope@example.com"
|
||||
)
|
||||
|
||||
t.Run("platform", func(t *testing.T) {
|
||||
t.Setenv("OS", platform)
|
||||
info, err := nfpm.Parse(strings.NewReader("name: foo\nplatform: $OS"))
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, platform, info.Platform)
|
||||
})
|
||||
|
||||
t.Run("arch", func(t *testing.T) {
|
||||
t.Setenv("ARCH", arch)
|
||||
info, err := nfpm.Parse(strings.NewReader("name: foo\narch: $ARCH"))
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, arch, info.Arch)
|
||||
})
|
||||
|
||||
t.Run("version", func(t *testing.T) {
|
||||
os.Clearenv()
|
||||
os.Setenv("VERSION", version)
|
||||
|
|
|
@ -106,6 +106,14 @@ func TestRPM(t *testing.T) {
|
|||
rpm, err := rpmutils.ReadRpm(file)
|
||||
require.NoError(t, err)
|
||||
|
||||
os, err := rpm.Header.GetString(rpmutils.OS)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, "linux", os)
|
||||
|
||||
arch, err := rpm.Header.GetString(rpmutils.ARCH)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, archToRPM["amd64"], arch)
|
||||
|
||||
version, err := rpm.Header.GetString(rpmutils.VERSION)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, "1.0.0", version)
|
||||
|
@ -134,6 +142,14 @@ func TestRPM(t *testing.T) {
|
|||
require.Equal(t, "Foo does things", description)
|
||||
}
|
||||
|
||||
func TestRPMPlatform(t *testing.T) {
|
||||
f, err := os.CreateTemp("", "test*.rpm")
|
||||
require.NoError(t, err)
|
||||
info := exampleInfo()
|
||||
info.Platform = "darwin"
|
||||
require.NoError(t, Default.Package(info, f))
|
||||
}
|
||||
|
||||
func TestRPMGroup(t *testing.T) {
|
||||
f, err := os.CreateTemp("", "test.rpm")
|
||||
require.NoError(t, err)
|
||||
|
|
|
@ -18,7 +18,8 @@ name: foo
|
|||
arch: amd64
|
||||
|
||||
# Platform.
|
||||
# This is only used by the rpm packager.
|
||||
# This will expand any env var you set in the field, e.g. version: ${GOOS}
|
||||
# This is only used by the rpm and deb packagers.
|
||||
# Examples: `linux` (default), `darwin`
|
||||
platform: linux
|
||||
|
||||
|
|
Loading…
Reference in New Issue