diff --git a/.golangci.yml b/.golangci.yml index 2ad6e553..c6bc339a 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -12,6 +12,7 @@ linters: - gci - exhaustivestruct - wrapcheck + - godot linters-settings: maligned: # print struct with more effective memory layout or not, false by default @@ -40,6 +41,8 @@ linters-settings: - style - performance issues: + exclude: + - composites exclude-rules: - text: "G104" # gosec G104 is caught by errcheck linters: diff --git a/acceptance/acceptance_test.go b/acceptance/acceptance_test.go deleted file mode 100644 index 3b3b72fd..00000000 --- a/acceptance/acceptance_test.go +++ /dev/null @@ -1,321 +0,0 @@ -//+build acceptance - -package acceptance - -import ( - "fmt" - "os" - "os/exec" - "path/filepath" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/goreleaser/nfpm" - // shut up - _ "github.com/goreleaser/nfpm/apk" - _ "github.com/goreleaser/nfpm/deb" - _ "github.com/goreleaser/nfpm/rpm" -) - -// nolint: gochecknoglobals -var formats = []string{"deb", "rpm", "apk"} - -func TestSimple(t *testing.T) { - for _, format := range formats { - format := format - t.Run(fmt.Sprintf("amd64-%s", format), func(t *testing.T) { - accept(t, acceptParms{ - Name: fmt.Sprintf("simple_%s", format), - Conf: "simple.yaml", - Format: format, - Dockerfile: fmt.Sprintf("%s.dockerfile", format), - }) - }) - t.Run(fmt.Sprintf("i386-%s", format), func(t *testing.T) { - accept(t, acceptParms{ - Name: fmt.Sprintf("simple_%s_386", format), - Conf: "simple.386.yaml", - Format: format, - Dockerfile: fmt.Sprintf("%s.386.dockerfile", format), - }) - }) - t.Run(fmt.Sprintf("ppc64le-%s", format), func(t *testing.T) { - t.Skip("for some reason travis fails to run those") - accept(t, acceptParms{ - Name: fmt.Sprintf("simple_%s_ppc64le", format), - Conf: "simple.ppc64le.yaml", - Format: format, - Dockerfile: fmt.Sprintf("%s.ppc64le.dockerfile", format), - }) - }) - t.Run(fmt.Sprintf("arm64-%s", format), func(t *testing.T) { - accept(t, acceptParms{ - Name: fmt.Sprintf("simple_%s_arm64", format), - Conf: "simple.arm64.yaml", - Format: format, - Dockerfile: fmt.Sprintf("%s.arm64.dockerfile", format), - }) - }) - } -} - -func TestComplex(t *testing.T) { - for _, format := range formats { - format := format - t.Run(fmt.Sprintf("amd64-%s", format), func(t *testing.T) { - accept(t, acceptParms{ - Name: fmt.Sprintf("complex_%s", format), - Conf: "complex.yaml", - Format: format, - Dockerfile: fmt.Sprintf("%s.complex.dockerfile", format), - }) - }) - t.Run(fmt.Sprintf("i386-%s", format), func(t *testing.T) { - accept(t, acceptParms{ - Name: fmt.Sprintf("complex_%s_386", format), - Conf: "complex.386.yaml", - Format: format, - Dockerfile: fmt.Sprintf("%s.386.complex.dockerfile", format), - }) - }) - } -} - -func TestConfigNoReplace(t *testing.T) { - var target = "./testdata/tmp/noreplace_old_rpm.rpm" - require.NoError(t, os.MkdirAll("./testdata/tmp", 0700)) - - config, err := nfpm.ParseFile("./testdata/config-noreplace-old.yaml") - require.NoError(t, err) - - info, err := config.Get("rpm") - require.NoError(t, err) - require.NoError(t, nfpm.Validate(info)) - - pkg, err := nfpm.Get("rpm") - require.NoError(t, err) - - f, err := os.Create(target) - require.NoError(t, err) - info.Target = target - require.NoError(t, pkg.Package(nfpm.WithDefaults(info), f)) - - t.Run("noreplace-rpm", func(t *testing.T) { - accept(t, acceptParms{ - Name: "noreplace_rpm", - Conf: "config-noreplace.yaml", - Format: "rpm", - Dockerfile: "rpm.config-noreplace.dockerfile", - }) - }) -} - -func TestEnvVarVersion(t *testing.T) { - for _, format := range formats { - format := format - t.Run(fmt.Sprintf("amd64-%s", format), func(t *testing.T) { - os.Setenv("SEMVER", "v1.0.0-0.1.b1+git.abcdefgh") - accept(t, acceptParms{ - Name: fmt.Sprintf("env-var-version_%s", format), - Conf: "env-var-version.yaml", - Format: format, - Dockerfile: fmt.Sprintf("%s.env-var-version.dockerfile", format), - }) - }) - } -} - -func TestComplexOverrides(t *testing.T) { - for _, format := range formats { - format := format - t.Run(fmt.Sprintf("amd64-%s", format), func(t *testing.T) { - accept(t, acceptParms{ - Name: fmt.Sprintf("overrides_%s", format), - Conf: "overrides.yaml", - Format: format, - Dockerfile: fmt.Sprintf("%s.overrides.dockerfile", format), - }) - }) - } -} - -func TestMin(t *testing.T) { - for _, format := range formats { - format := format - t.Run(fmt.Sprintf("amd64-%s", format), func(t *testing.T) { - accept(t, acceptParms{ - Name: fmt.Sprintf("min_%s", format), - Conf: "min.yaml", - Format: format, - Dockerfile: fmt.Sprintf("%s.min.dockerfile", format), - }) - }) - } -} - -func TestMeta(t *testing.T) { - for _, format := range formats { - format := format - t.Run(fmt.Sprintf("amd64-%s", format), func(t *testing.T) { - accept(t, acceptParms{ - Name: fmt.Sprintf("meta_%s", format), - Conf: "meta.yaml", - Format: format, - Dockerfile: fmt.Sprintf("%s.meta.dockerfile", format), - }) - }) - } -} - -func TestRPMCompression(t *testing.T) { - compressFormats := []string{"gzip", "xz", "lzma"} - for _, format := range compressFormats { - format := format - t.Run(format, func(t *testing.T) { - accept(t, acceptParms{ - Name: fmt.Sprintf("%s_compression_rpm", format), - Conf: fmt.Sprintf("%s.compression.yaml", format), - Format: "rpm", - Dockerfile: fmt.Sprintf("%s.rpm.compression.dockerfile", format), - }) - }) - } -} - -func TestRPMRelease(t *testing.T) { - accept(t, acceptParms{ - Name: "release_rpm", - Conf: "release.rpm.yaml", - Format: "rpm", - Dockerfile: "release.rpm.dockerfile", - }) -} - -func TestDebRules(t *testing.T) { - accept(t, acceptParms{ - Name: "rules.deb", - Conf: "rules.deb.yaml", - Format: "deb", - Dockerfile: "rules.deb.dockerfile", - }) -} - -func TestChangelog(t *testing.T) { - for _, format := range formats { - format := format - t.Run(fmt.Sprintf("changelog-%s", format), func(t *testing.T) { - accept(t, acceptParms{ - Name: fmt.Sprintf("changelog_%s", format), - Conf: "withchangelog.yaml", - Format: format, - Dockerfile: fmt.Sprintf("%s.changelog.dockerfile", format), - }) - }) - } -} - -func TestDebTriggers(t *testing.T) { - t.Run("triggers-deb", func(t *testing.T) { - accept(t, acceptParms{ - Name: "triggers-deb", - Conf: "triggers.yaml", - Format: "deb", - Dockerfile: "deb.triggers.dockerfile", - }) - }) -} - -func TestSymlink(t *testing.T) { - for _, format := range formats { - format := format - t.Run(fmt.Sprintf("symlink-%s", format), func(t *testing.T) { - accept(t, acceptParms{ - Name: fmt.Sprintf("symlink_%s", format), - Conf: "symlink.yaml", - Format: format, - Dockerfile: fmt.Sprintf("%s.symlink.dockerfile", format), - }) - }) - } -} - -func TestDebBreaks(t *testing.T) { - t.Run("breaks-deb", func(t *testing.T) { - accept(t, acceptParms{ - Name: "breaks-deb", - Conf: "breaks.yaml", - Format: "deb", - Dockerfile: "deb.breaks.dockerfile", - }) - }) -} - -func TestSignatures(t *testing.T) { - for _, format := range formats { - format := format - t.Run("signed", func(t *testing.T) { - accept(t, acceptParms{ - Name: fmt.Sprintf("signed_%s", format), - Conf: "signed.yaml", - Format: format, - Dockerfile: fmt.Sprintf("%s.signed.dockerfile", format), - }) - }) - } -} - -type acceptParms struct { - Name string - Conf string - Format string - Dockerfile string -} - -type testWriter struct { - t *testing.T -} - -func (t testWriter) Write(p []byte) (n int, err error) { - t.t.Logf(string(p)) - return len(p), nil -} - -func accept(t *testing.T, params acceptParms) { - var configFile = filepath.Join("./testdata", params.Conf) - tmp, err := filepath.Abs("./testdata/tmp") - require.NoError(t, err) - var packageName = params.Name + "." + params.Format - var target = filepath.Join(tmp, packageName) - t.Log("package: " + target) - - require.NoError(t, os.MkdirAll(tmp, 0700)) - - config, err := nfpm.ParseFile(configFile) - require.NoError(t, err) - - info, err := config.Get(params.Format) - require.NoError(t, err) - require.NoError(t, nfpm.Validate(info)) - - pkg, err := nfpm.Get(params.Format) - require.NoError(t, err) - - f, err := os.Create(target) - require.NoError(t, err) - info.Target = target - require.NoError(t, pkg.Package(nfpm.WithDefaults(info), f)) - //nolint:gosec - cmd := exec.Command( - "docker", "build", "--rm", "--force-rm", - "-f", params.Dockerfile, - "--build-arg", "package="+filepath.Join("tmp", packageName), - ".", - ) - cmd.Dir = "./testdata" - cmd.Stderr = testWriter{t} - cmd.Stdout = cmd.Stderr - - t.Log("will exec:", cmd.Args) - require.NoError(t, cmd.Run()) -} diff --git a/acceptance/placeholder.go b/acceptance/placeholder.go deleted file mode 100644 index 4343761d..00000000 --- a/acceptance/placeholder.go +++ /dev/null @@ -1,5 +0,0 @@ -// Package acceptance contains acceptance tests -package acceptance - -// This file only exists to make go test happy. -// No code shall ever live in here. diff --git a/acceptance/testdata/.gitignore b/acceptance/testdata/.gitignore deleted file mode 100644 index a9a5aecf..00000000 --- a/acceptance/testdata/.gitignore +++ /dev/null @@ -1 +0,0 @@ -tmp diff --git a/acceptance/testdata/apk.386.complex.dockerfile b/acceptance/testdata/apk.386.complex.dockerfile deleted file mode 100644 index d9dbf83c..00000000 --- a/acceptance/testdata/apk.386.complex.dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -FROM alpine -ARG package -COPY ${package} /tmp/foo.apk -RUN apk add --allow-untrusted /tmp/foo.apk -RUN test -e /usr/local/bin/fake -RUN test -f /etc/foo/whatever.conf -RUN test -d /usr/share/whatever/ -RUN test -d /usr/share/whatever/folder -RUN test -f /usr/share/whatever/folder/file1 -RUN test -f /usr/share/whatever/folder/file2 -RUN test -d /usr/share/whatever/folder/folder2 -RUN test -f /usr/share/whatever/folder/folder2/file1 -RUN test -f /usr/share/whatever/folder/folder2/file2 -RUN test -d /usr/share/foo -RUN test -d /usr/share/whatever -RUN test -f /tmp/preinstall-proof -RUN test -f /tmp/postinstall-proof -RUN test ! -f /tmp/preremove-proof -RUN test ! -f /tmp/postremove-proof -RUN echo wat >> /etc/foo/whatever.conf -RUN apk del foo -RUN test -f /etc/foo/whatever.conf -RUN test ! -f /usr/local/bin/fake -RUN test -f /tmp/preremove-proof -RUN test -f /tmp/postremove-proof -RUN test ! -d /usr/share/foo -RUN test ! -d /usr/share/whatever diff --git a/acceptance/testdata/apk.386.dockerfile b/acceptance/testdata/apk.386.dockerfile deleted file mode 100644 index 7f1a9f10..00000000 --- a/acceptance/testdata/apk.386.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM alpine -ARG package -COPY ${package} /tmp/foo.apk -RUN apk add --allow-untrusted /tmp/foo.apk -RUN test -e /usr/local/bin/fake -RUN test -f /etc/foo/whatever.conf -RUN echo wat >> /etc/foo/whatever.conf -RUN apk del foo -RUN test -f /etc/foo/whatever.conf -RUN test ! -f /usr/local/bin/fake diff --git a/acceptance/testdata/apk.arm64.dockerfile b/acceptance/testdata/apk.arm64.dockerfile deleted file mode 100644 index 7f1a9f10..00000000 --- a/acceptance/testdata/apk.arm64.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM alpine -ARG package -COPY ${package} /tmp/foo.apk -RUN apk add --allow-untrusted /tmp/foo.apk -RUN test -e /usr/local/bin/fake -RUN test -f /etc/foo/whatever.conf -RUN echo wat >> /etc/foo/whatever.conf -RUN apk del foo -RUN test -f /etc/foo/whatever.conf -RUN test ! -f /usr/local/bin/fake diff --git a/acceptance/testdata/apk.changelog.dockerfile b/acceptance/testdata/apk.changelog.dockerfile deleted file mode 100644 index e115a0a1..00000000 --- a/acceptance/testdata/apk.changelog.dockerfile +++ /dev/null @@ -1,5 +0,0 @@ -FROM alpine -ARG package -COPY ${package} /tmp/foo.apk -RUN apk add --allow-untrusted /tmp/foo.apk -# TODO: seems like there is no changelog support on apk diff --git a/acceptance/testdata/apk.complex.dockerfile b/acceptance/testdata/apk.complex.dockerfile deleted file mode 100644 index 95a1262d..00000000 --- a/acceptance/testdata/apk.complex.dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -FROM alpine -ARG package -COPY ${package} /tmp/foo.apk -RUN apk add --allow-untrusted /tmp/foo.apk -RUN test -e /usr/local/bin/fake -RUN test -f /etc/foo/whatever.conf -RUN test -d /usr/share/whatever/ -RUN test -d /usr/share/whatever/folder -RUN test -f /usr/share/whatever/folder/file1 -RUN test -f /usr/share/whatever/folder/file2 -RUN test -d /usr/share/whatever/folder/folder2 -RUN test -f /usr/share/whatever/folder/folder2/file1 -RUN test -f /usr/share/whatever/folder/folder2/file2 -RUN test -d /var/log/whatever -RUN test -d /usr/share/foo -RUN test -f /tmp/preinstall-proof -RUN test -f /tmp/postinstall-proof -RUN test ! -f /tmp/preremove-proof -RUN test ! -f /tmp/postremove-proof -RUN echo wat >> /etc/foo/whatever.conf -RUN apk del foo -RUN test -f /etc/foo/whatever.conf -RUN test ! -f /usr/local/bin/fake -RUN test -f /tmp/preremove-proof -RUN test -f /tmp/postremove-proof -RUN test ! -d /var/log/whatever -RUN test ! -d /usr/share/foo diff --git a/acceptance/testdata/apk.dockerfile b/acceptance/testdata/apk.dockerfile deleted file mode 100644 index 7f1a9f10..00000000 --- a/acceptance/testdata/apk.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM alpine -ARG package -COPY ${package} /tmp/foo.apk -RUN apk add --allow-untrusted /tmp/foo.apk -RUN test -e /usr/local/bin/fake -RUN test -f /etc/foo/whatever.conf -RUN echo wat >> /etc/foo/whatever.conf -RUN apk del foo -RUN test -f /etc/foo/whatever.conf -RUN test ! -f /usr/local/bin/fake diff --git a/acceptance/testdata/apk.env-var-version.dockerfile b/acceptance/testdata/apk.env-var-version.dockerfile deleted file mode 100644 index 6ee0f36f..00000000 --- a/acceptance/testdata/apk.env-var-version.dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM alpine -ARG package -COPY ${package} /tmp/foo.apk -RUN apk add --allow-untrusted /tmp/foo.apk -ENV EXPECTVER="foo-1.0.0~0.1.b1+git.abcdefgh description:" -RUN apk info foo | grep "foo-" | grep " description:" > found -RUN export FOUND_VER="$(cat found)" && \ - echo "Expected: '${EXPECTVER}' :: Found: '${FOUND_VER}'" && \ - test "${FOUND_VER}" = "${EXPECTVER}" diff --git a/acceptance/testdata/apk.meta.dockerfile b/acceptance/testdata/apk.meta.dockerfile deleted file mode 100644 index 5b2d96c8..00000000 --- a/acceptance/testdata/apk.meta.dockerfile +++ /dev/null @@ -1,6 +0,0 @@ -FROM alpine -ARG package -COPY ${package} /tmp/foo.apk -RUN apk add --allow-untrusted /tmp/foo.apk -RUN command -v zsh -RUN command -v fish diff --git a/acceptance/testdata/apk.min.dockerfile b/acceptance/testdata/apk.min.dockerfile deleted file mode 100644 index 7b5b6080..00000000 --- a/acceptance/testdata/apk.min.dockerfile +++ /dev/null @@ -1,4 +0,0 @@ -FROM alpine -ARG package -COPY ${package} /tmp/foo.apk -RUN apk add --allow-untrusted /tmp/foo.apk diff --git a/acceptance/testdata/apk.overrides.dockerfile b/acceptance/testdata/apk.overrides.dockerfile deleted file mode 100644 index 2860cc62..00000000 --- a/acceptance/testdata/apk.overrides.dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -FROM alpine -ARG package -COPY ${package} /tmp/foo.apk -RUN apk add -vvv --allow-untrusted /tmp/foo.apk -RUN test -e /usr/local/bin/fake -RUN test -f /etc/foo/whatever.conf -RUN test ! -f /tmp/preinstall-proof -RUN test -f /tmp/postinstall-proof -RUN test ! -f /tmp/preremove-proof -RUN test ! -f /tmp/postremove-proof -RUN echo wat >> /etc/foo/whatever.conf -RUN apk del foo -RUN test -f /etc/foo/whatever.conf -RUN test ! -f /usr/local/bin/fake -RUN test -f /tmp/preremove-proof -RUN test ! -f /tmp/postremove-proof diff --git a/acceptance/testdata/apk.ppc64le.dockerfile b/acceptance/testdata/apk.ppc64le.dockerfile deleted file mode 100644 index 7f1a9f10..00000000 --- a/acceptance/testdata/apk.ppc64le.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM alpine -ARG package -COPY ${package} /tmp/foo.apk -RUN apk add --allow-untrusted /tmp/foo.apk -RUN test -e /usr/local/bin/fake -RUN test -f /etc/foo/whatever.conf -RUN echo wat >> /etc/foo/whatever.conf -RUN apk del foo -RUN test -f /etc/foo/whatever.conf -RUN test ! -f /usr/local/bin/fake diff --git a/acceptance/testdata/apk.signed.dockerfile b/acceptance/testdata/apk.signed.dockerfile deleted file mode 100644 index 2af81ba8..00000000 --- a/acceptance/testdata/apk.signed.dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM alpine -ARG package -COPY keys/rsa_unprotected.pub /etc/apk/keys/john@example.com.rsa.pub -COPY ${package} /tmp/foo.apk - -RUN apk verify /tmp/foo.apk | grep "/tmp/foo.apk: 0 - OK" -RUN apk add /tmp/foo.apk diff --git a/acceptance/testdata/apk.symlink.dockerfile b/acceptance/testdata/apk.symlink.dockerfile deleted file mode 100644 index 345d01b6..00000000 --- a/acceptance/testdata/apk.symlink.dockerfile +++ /dev/null @@ -1,5 +0,0 @@ -FROM alpine -ARG package -COPY ${package} /tmp/foo.apk -RUN apk add --allow-untrusted /tmp/foo.apk -RUN ls -l /path/to/symlink | grep "/path/to/symlink -> /etc/foo/whatever.conf" diff --git a/acceptance/testdata/breaks.yaml b/acceptance/testdata/breaks.yaml deleted file mode 100644 index 17ea6742..00000000 --- a/acceptance/testdata/breaks.yaml +++ /dev/null @@ -1,9 +0,0 @@ -name: "foo" -arch: "all" -platform: "linux" -version: "v1.0.0" -maintainer: "John Doe " -description: Foo breaks dummy -deb: - breaks: - - dummy diff --git a/acceptance/testdata/complex.386.yaml b/acceptance/testdata/complex.386.yaml deleted file mode 100644 index d6dc028e..00000000 --- a/acceptance/testdata/complex.386.yaml +++ /dev/null @@ -1,33 +0,0 @@ -name: "foo" -arch: "386" -platform: "linux" -version: "v1.2.3-beta" -maintainer: "Foo Bar" -depends: -- bash -provides: -- fake -replaces: -- foo -suggests: -- zsh -description: | - Foo bar - Multiple lines -vendor: "foobar" -homepage: "https://foobar.org" -license: "MIT" -files: - ../testdata/fake: "/usr/local/bin/fake" - ./testdata/folder/*: "/usr/share/whatever/folder/" -config_files: - ../testdata/whatever.conf: "/etc/foo/whatever.conf" -empty_folders: -- /var/log/whatever -- /usr/share/foo -scripts: - preinstall: ./testdata/scripts/preinstall.sh - postinstall: ./testdata/scripts/postinstall.sh - preremove: ./testdata/scripts/preremove.sh - postremove: ./testdata/scripts/postremove.sh - diff --git a/acceptance/testdata/complex.yaml b/acceptance/testdata/complex.yaml deleted file mode 100644 index 8659bde7..00000000 --- a/acceptance/testdata/complex.yaml +++ /dev/null @@ -1,34 +0,0 @@ -name: "foo" -arch: "amd64" -platform: "linux" -version: "v1.2.3-beta" -maintainer: "Foo Bar" -depends: -- bash -provides: -- fake -recommends: -- fish -replaces: -- foo -suggests: -- zsh -description: | - Foo bar - Multiple lines -vendor: "foobar" -homepage: "https://foobar.org" -license: "MIT" -files: - ../testdata/fake: "/usr/local/bin/fake" - ./testdata/folder/*: "/usr/share/whatever/folder/" -config_files: - ../testdata/whatever.conf: "/etc/foo/whatever.conf" -empty_folders: -- /var/log/whatever -- /usr/share/foo -scripts: - preinstall: ./testdata/scripts/preinstall.sh - postinstall: ./testdata/scripts/postinstall.sh - preremove: ./testdata/scripts/preremove.sh - postremove: ./testdata/scripts/postremove.sh diff --git a/acceptance/testdata/config-noreplace-old.yaml b/acceptance/testdata/config-noreplace-old.yaml deleted file mode 100644 index bdf68515..00000000 --- a/acceptance/testdata/config-noreplace-old.yaml +++ /dev/null @@ -1,13 +0,0 @@ -name: "foo" -arch: "all" -platform: "linux" -version: "v1.0.0" -maintainer: "Foo Bar" -vendor: "foobar" -homepage: "https://foobar.org" -license: "MIT" -config_files: - ../testdata/whatever.conf: "/etc/regular.conf" -rpm: - config_noreplace_files: - ../testdata/whatever.conf: "/etc/noreplace.conf" diff --git a/acceptance/testdata/config-noreplace.yaml b/acceptance/testdata/config-noreplace.yaml deleted file mode 100644 index f45114d1..00000000 --- a/acceptance/testdata/config-noreplace.yaml +++ /dev/null @@ -1,13 +0,0 @@ -name: "foo" -arch: "all" -platform: "linux" -version: "v2.0.0" -maintainer: "Foo Bar" -vendor: "foobar" -homepage: "https://foobar.org" -license: "MIT" -config_files: - ../testdata/whatever2.conf: "/etc/regular.conf" -rpm: - config_noreplace_files: - ../testdata/whatever2.conf: "/etc/noreplace.conf" diff --git a/acceptance/testdata/deb.386.complex.dockerfile b/acceptance/testdata/deb.386.complex.dockerfile deleted file mode 100644 index 65c52c6a..00000000 --- a/acceptance/testdata/deb.386.complex.dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -FROM i386/ubuntu -ARG package -COPY ${package} /tmp/foo.deb -RUN dpkg -i /tmp/foo.deb -RUN test -e /usr/local/bin/fake -RUN test -f /etc/foo/whatever.conf -RUN test -d /usr/share/whatever/ -RUN test -d /usr/share/whatever/folder -RUN test -f /usr/share/whatever/folder/file1 -RUN test -f /usr/share/whatever/folder/file2 -RUN test -d /usr/share/whatever/folder/folder2 -RUN test -f /usr/share/whatever/folder/folder2/file1 -RUN test -f /usr/share/whatever/folder/folder2/file2 -RUN test -d /usr/share/foo -RUN test -d /usr/share/whatever -RUN test -f /tmp/preinstall-proof -RUN test -f /tmp/postinstall-proof -RUN test ! -f /tmp/preremove-proof -RUN test ! -f /tmp/postremove-proof -RUN echo wat >> /etc/foo/whatever.conf -RUN dpkg -r foo -RUN test -f /etc/foo/whatever.conf -RUN test ! -f /usr/local/bin/fake -RUN test -f /tmp/preremove-proof -RUN test -f /tmp/postremove-proof -RUN test ! -d /usr/share/foo -RUN test ! -d /usr/share/whatever diff --git a/acceptance/testdata/deb.386.dockerfile b/acceptance/testdata/deb.386.dockerfile deleted file mode 100644 index dab95657..00000000 --- a/acceptance/testdata/deb.386.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM i386/ubuntu -ARG package -COPY ${package} /tmp/foo.deb -RUN dpkg -i /tmp/foo.deb -RUN test -e /usr/local/bin/fake -RUN test -f /etc/foo/whatever.conf -RUN echo wat >> /etc/foo/whatever.conf -RUN dpkg -r foo -RUN test -f /etc/foo/whatever.conf -RUN test ! -f /usr/local/bin/fake diff --git a/acceptance/testdata/deb.arm64.dockerfile b/acceptance/testdata/deb.arm64.dockerfile deleted file mode 100644 index 683e89c8..00000000 --- a/acceptance/testdata/deb.arm64.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM arm64v8/ubuntu -ARG package -COPY ${package} /tmp/foo.deb -RUN dpkg -i /tmp/foo.deb -RUN test -e /usr/local/bin/fake -RUN test -f /etc/foo/whatever.conf -RUN echo wat >> /etc/foo/whatever.conf -RUN dpkg -r foo -RUN test -f /etc/foo/whatever.conf -RUN test ! -f /usr/local/bin/fake diff --git a/acceptance/testdata/deb.breaks.dockerfile b/acceptance/testdata/deb.breaks.dockerfile deleted file mode 100644 index 4ad23a48..00000000 --- a/acceptance/testdata/deb.breaks.dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM ubuntu -ARG package -COPY dummy.deb /tmp/dummy.deb -COPY ${package} /tmp/foo.deb - -# install dummy package -RUN dpkg -i /tmp/dummy.deb - -# make sure foo can't be installed -RUN dpkg -i /tmp/foo.deb 2>&1 | grep "foo breaks dummy" - -# make sure foo can be installed if dummy is not installed -RUN dpkg -r dummy -RUN dpkg -i /tmp/foo.deb \ No newline at end of file diff --git a/acceptance/testdata/deb.changelog.dockerfile b/acceptance/testdata/deb.changelog.dockerfile deleted file mode 100644 index 064bdf64..00000000 --- a/acceptance/testdata/deb.changelog.dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM ubuntu -ARG package -# the dpkg configuration of the docker -# image filters out changelogs by default -# so we have to remove that rule -RUN rm /etc/dpkg/dpkg.cfg.d/excludes -COPY ${package} /tmp/foo.deb -RUN apt update -y -RUN apt install -y gzip -RUN dpkg -i /tmp/foo.deb -RUN zcat "/usr/share/doc/foo/changelog.gz" | grep "Carlos A Becker " -RUN zcat "/usr/share/doc/foo/changelog.gz" | grep "note 1" -RUN zcat "/usr/share/doc/foo/changelog.gz" | grep "note 2" -RUN zcat "/usr/share/doc/foo/changelog.gz" | grep "note 3" diff --git a/acceptance/testdata/deb.complex.dockerfile b/acceptance/testdata/deb.complex.dockerfile deleted file mode 100644 index b8cda01c..00000000 --- a/acceptance/testdata/deb.complex.dockerfile +++ /dev/null @@ -1,30 +0,0 @@ -FROM ubuntu -ARG package -COPY ${package} /tmp/foo.deb -RUN dpkg -i /tmp/foo.deb -RUN apt-cache show /tmp/foo.deb | grep "Depends: bash" -RUN apt-cache show /tmp/foo.deb | grep "Suggests: zsh" -RUN apt-cache show /tmp/foo.deb | grep "Recommends: fish" -RUN test -e /usr/local/bin/fake -RUN test -f /etc/foo/whatever.conf -RUN test -d /usr/share/whatever/ -RUN test -d /usr/share/whatever/folder -RUN test -f /usr/share/whatever/folder/file1 -RUN test -f /usr/share/whatever/folder/file2 -RUN test -d /usr/share/whatever/folder/folder2 -RUN test -f /usr/share/whatever/folder/folder2/file1 -RUN test -f /usr/share/whatever/folder/folder2/file2 -RUN test -d /var/log/whatever -RUN test -d /usr/share/foo -RUN test -f /tmp/preinstall-proof -RUN test -f /tmp/postinstall-proof -RUN test ! -f /tmp/preremove-proof -RUN test ! -f /tmp/postremove-proof -RUN echo wat >> /etc/foo/whatever.conf -RUN dpkg -r foo -RUN test -f /etc/foo/whatever.conf -RUN test ! -f /usr/local/bin/fake -RUN test -f /tmp/preremove-proof -RUN test -f /tmp/postremove-proof -RUN test ! -d /var/log/whatever -RUN test ! -d /usr/share/foo diff --git a/acceptance/testdata/deb.dockerfile b/acceptance/testdata/deb.dockerfile deleted file mode 100644 index 2e05d5cb..00000000 --- a/acceptance/testdata/deb.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM ubuntu -ARG package -COPY ${package} /tmp/foo.deb -RUN dpkg -i /tmp/foo.deb -RUN test -e /usr/local/bin/fake -RUN test -f /etc/foo/whatever.conf -RUN echo wat >> /etc/foo/whatever.conf -RUN dpkg -r foo -RUN test -f /etc/foo/whatever.conf -RUN test ! -f /usr/local/bin/fake diff --git a/acceptance/testdata/deb.env-var-version.dockerfile b/acceptance/testdata/deb.env-var-version.dockerfile deleted file mode 100644 index 117f28ca..00000000 --- a/acceptance/testdata/deb.env-var-version.dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM ubuntu -ARG package -COPY ${package} /tmp/foo.deb -ENV EXPECTVER=" Version: 1.0.0~0.1.b1+git.abcdefgh" -RUN dpkg --info /tmp/foo.deb | grep "Version" > found -RUN export FOUND_VER="$(cat found)" && \ - echo "Expected: '${EXPECTVER}' :: Found: '${FOUND_VER}'" && \ - test "${FOUND_VER}" = "${EXPECTVER}" diff --git a/acceptance/testdata/deb.meta.dockerfile b/acceptance/testdata/deb.meta.dockerfile deleted file mode 100644 index e82b8a21..00000000 --- a/acceptance/testdata/deb.meta.dockerfile +++ /dev/null @@ -1,6 +0,0 @@ -FROM ubuntu -ARG package -COPY ${package} /tmp/foo.deb -RUN apt update && apt install -y /tmp/foo.deb -RUN command -v zsh -RUN command -v fish diff --git a/acceptance/testdata/deb.min.dockerfile b/acceptance/testdata/deb.min.dockerfile deleted file mode 100644 index 480b261f..00000000 --- a/acceptance/testdata/deb.min.dockerfile +++ /dev/null @@ -1,4 +0,0 @@ -FROM ubuntu -ARG package -COPY ${package} /tmp/foo.deb -RUN dpkg -i /tmp/foo.deb diff --git a/acceptance/testdata/deb.overrides.dockerfile b/acceptance/testdata/deb.overrides.dockerfile deleted file mode 100644 index 6f9b9472..00000000 --- a/acceptance/testdata/deb.overrides.dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -FROM ubuntu -ARG package -COPY ${package} /tmp/foo.deb -RUN dpkg -i /tmp/foo.deb -RUN test -e /usr/local/bin/fake -RUN test -f /etc/foo/whatever.conf -RUN test ! -f /tmp/preinstall-proof -RUN test -f /tmp/postinstall-proof -RUN test ! -f /tmp/preremove-proof -RUN test ! -f /tmp/postremove-proof -RUN echo wat >> /etc/foo/whatever.conf -RUN dpkg -r foo -RUN test -f /etc/foo/whatever.conf -RUN test ! -f /usr/local/bin/fake -RUN test -f /tmp/preremove-proof -RUN test ! -f /tmp/postremove-proof diff --git a/acceptance/testdata/deb.ppc64le.dockerfile b/acceptance/testdata/deb.ppc64le.dockerfile deleted file mode 100644 index fbcc38fc..00000000 --- a/acceptance/testdata/deb.ppc64le.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM ppc64le/ubuntu -ARG package -COPY ${package} /tmp/foo.deb -RUN dpkg -i /tmp/foo.deb -RUN test -e /usr/local/bin/fake -RUN test -f /etc/foo/whatever.conf -RUN echo wat >> /etc/foo/whatever.conf -RUN dpkg -r foo -RUN test -f /etc/foo/whatever.conf -RUN test ! -f /usr/local/bin/fake diff --git a/acceptance/testdata/deb.signed.dockerfile b/acceptance/testdata/deb.signed.dockerfile deleted file mode 100644 index b406636b..00000000 --- a/acceptance/testdata/deb.signed.dockerfile +++ /dev/null @@ -1,31 +0,0 @@ -FROM ubuntu -ARG package -COPY keys/pubkey.gpg /usr/share/debsig/keyrings/BC8ACDD415BD80B3/debsig.gpg -COPY ${package} /tmp/foo.deb - -RUN apt update -y -RUN apt install -y debsig-verify -RUN mkdir -p /etc/debsig/policies/BC8ACDD415BD80B3 -RUN echo '\n\ -\n\ -\n\ -\n\ - \n\ -\n\ - \n\ - \n\ - \n\ -\n\ - \n\ - \n\ - \n\ -\n\ -\n' >> /etc/debsig/policies/BC8ACDD415BD80B3/policy.pol - -# manually check signature -RUN debsig-verify /tmp/foo.deb | grep "debsig: Verified package from 'Test package' (test)" - -# clear dpkg config as it contains 'no-debsig', now every -# package that will be installed must be signed -RUN echo "" > /etc/dpkg/dpkg.cfg -RUN dpkg -i /tmp/foo.deb diff --git a/acceptance/testdata/deb.symlink.dockerfile b/acceptance/testdata/deb.symlink.dockerfile deleted file mode 100644 index 3dbfcbfb..00000000 --- a/acceptance/testdata/deb.symlink.dockerfile +++ /dev/null @@ -1,5 +0,0 @@ -FROM ubuntu -ARG package -COPY ${package} /tmp/foo.deb -RUN dpkg -i /tmp/foo.deb -RUN ls -l /path/to/symlink | grep "/path/to/symlink -> /etc/foo/whatever.conf" diff --git a/acceptance/testdata/deb.triggers.dockerfile b/acceptance/testdata/deb.triggers.dockerfile deleted file mode 100644 index 6e37e770..00000000 --- a/acceptance/testdata/deb.triggers.dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM ubuntu -ARG package -COPY ${package} /tmp/foo.deb -RUN dpkg -i /tmp/foo.deb - -# simulate another package that activates the trigger -RUN dpkg-trigger --by-package foo manual-trigger -RUN dpkg --triggers-only foo -RUN test -f /tmp/trigger-proof diff --git a/acceptance/testdata/dummy.deb b/acceptance/testdata/dummy.deb deleted file mode 100644 index 67ae129e..00000000 Binary files a/acceptance/testdata/dummy.deb and /dev/null differ diff --git a/acceptance/testdata/env-var-version.yaml b/acceptance/testdata/env-var-version.yaml deleted file mode 100644 index 340bad49..00000000 --- a/acceptance/testdata/env-var-version.yaml +++ /dev/null @@ -1,32 +0,0 @@ -name: "foo" -arch: "amd64" -platform: "linux" -version: "${SEMVER}" -maintainer: "Foo Bar" -depends: - - bash -provides: - - fake -replaces: - - foo -suggests: - - zsh -description: | - Foo bar - Multiple lines -vendor: "foobar" -homepage: "https://foobar.org" -license: "MIT" -files: - ../testdata/fake: "/usr/local/bin/fake" - ./testdata/folder/**/*: "/usr/share/whatever/folder/" -config_files: - ../testdata/whatever.conf: "/etc/foo/whatever.conf" -empty_folders: - - /var/log/whatever - - /usr/share/foo -scripts: - preinstall: ./testdata/scripts/preinstall.sh - postinstall: ./testdata/scripts/postinstall.sh - preremove: ./testdata/scripts/preremove.sh - postremove: ./testdata/scripts/postremove.sh diff --git a/acceptance/testdata/folder/folder2/file2 b/acceptance/testdata/folder/folder2/file2 deleted file mode 100644 index e69de29b..00000000 diff --git a/acceptance/testdata/gzip.compression.yaml b/acceptance/testdata/gzip.compression.yaml deleted file mode 100644 index cb0bdf90..00000000 --- a/acceptance/testdata/gzip.compression.yaml +++ /dev/null @@ -1,17 +0,0 @@ -name: "foo" -arch: "amd64" -platform: "linux" -version: "v1.2.3" -maintainer: "Foo Bar" -description: | - Foo bar - Multiple lines -vendor: "foobar" -homepage: "https://foobar.org" -license: "MIT" -files: - ../testdata/fake: "/usr/local/bin/fake" -config_files: - ../testdata/whatever.conf: "/etc/foo/whatever.conf" -rpm: - compression: "gzip" \ No newline at end of file diff --git a/acceptance/testdata/gzip.rpm.compression.dockerfile b/acceptance/testdata/gzip.rpm.compression.dockerfile deleted file mode 100644 index 13fedb01..00000000 --- a/acceptance/testdata/gzip.rpm.compression.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM fedora -ARG package -COPY ${package} /tmp/foo.rpm -RUN test "gzip" = "$(rpm -qp --qf '%{PAYLOADCOMPRESSOR}' /tmp/foo.rpm)" -RUN rpm -ivh /tmp/foo.rpm -RUN test -e /usr/local/bin/fake -RUN test -f /etc/foo/whatever.conf -RUN echo wat >> /etc/foo/whatever.conf -RUN rpm -e foo -RUN test -f /etc/foo/whatever.conf.rpmsave -RUN test ! -f /usr/local/bin/fake \ No newline at end of file diff --git a/acceptance/testdata/keys/pubkey.asc b/acceptance/testdata/keys/pubkey.asc deleted file mode 100644 index 011b3fd7..00000000 --- a/acceptance/testdata/keys/pubkey.asc +++ /dev/null @@ -1,37 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- - -mQENBF9b3vwBCACzUomj9LBgfVC8UFuIk/QCGfRbWHWiQHJ02+ih3YV4XKO2z3+Y -SiFYybK4jbl7UmLOmvqWoEAQtdkFQW6Zs98T2Z/Z6M/mi/4aEVFisrWzelT8PDII -rGwBVME/+u3sZgwWlalbtlfIB+45dMSG83K13c086zJGgQe5/BEqzHg6ImAyWXTx -aYSCcd30h8OSXtui9nqWzPmZZE+f0sNBzy1bj+zbE8uhBOzzAVU4eV2H40wgEdP9 -828ChbyMGn7s+rb5pZkyuz4Y4Hz7KnKDLt8TPz7nWqzpHi/x9U6jo7EDHkNpBmFw -kdxilYgJA7TcNJF+9D/cqubzDUvyNHwkZCopABEBAAG0IG5mcG0gdGVzdCBrZXkg -PHRlc3RAZXhhbXBsZS5jb20+iQFOBBMBCAA4FiEEhm9sg7qz5JOBreTBvIrN1BW9 -gLMFAl9b3vwCGy8FCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQvIrN1BW9gLPO -Jgf9F5K+/uCpLm473qR7XS95vASHkymQzfEGRqHX/4mWZEycZrvan91qGoj6f1Vi -ZcGruG3BJi1kLrrr76hctH4ag4lar+RO9KVs7tl2DG+nGW0tAf1+o5mAH7vbDaMF -bQiMHb1yna4pQiGkS07kabhEtB7JAkAJHeMUVf0dilYcF2tjGp2tcT4iNyKG9kDT -Jw65HCYhZk+N+VKAgL/DHQNg2q+J+j3/+PMHPoJZ2ufFKH/yT7ixIDEY0IH9pLJw -HBmXUhu743PkcdPApb9Z+yaJxk9LoYMqtiYGaVq+fEKiYbGeMGo3MgpYJKJs+dvy -XqnapfNPfXUYWkknaQhKYoTsdLkBDQRfW978AQgA7gH5KRwJ7wGibMLw9fUBymaA -vLP7j8QchbDEQvj7JUvL4m0jkx1TtN/LmJ0A5FeYB38934rWXoagrDvQCF5mWCEz -z5+AvwOlhyBkITH1w/hRUKZz2Fq1AIG4QwOmVaWWHUPZbw8SuVt7/uCRUjqEftot -yeoGQdwbHMgJFKzvV6s8yYVXOhIjhlqpIjFKtPXCCvh5ZgysK5ivKksIsS4yt+lI -PpEz75qlNYaHjscblxrcTXCTntpHP6IPI9sf2hJ5LGI2dprf2ENaHi+RKLsujEvY -Cbib9E2h4SoMqiZcjQeyFIfkFANIshS4l1EVlk9ZOgMdH2ZT14l3PtEydABPEwAR -AQABiQJsBBgBCAAgFiEEhm9sg7qz5JOBreTBvIrN1BW9gLMFAl9b3vwCGy4BQAkQ -vIrN1BW9gLPAdCAEGQEIAB0WIQQXw7Zj5ASzyzAzJxqYkJBN+y7IigUCX1ve/AAK -CRCYkJBN+y7IitGACACd2XRjT/xL9cX8xXBrI1OUWY1RpEGjevhVfAMIqcITMLSQ -5ieJ1gb7bUYS0FQ1eWeeD06DkftbeMWFXpx1/QI0jGixj9U1W7ZZs6nh6Rf5kkBi -aCGKfwpLM869w13sqL7OLumhIxdx/U/y8hTfP6CYY9msGoqr8HxhZznzSrFUJDLK -k1jUkVxSF4B1t3+Rrc46plal61sY3Vgb+bRMKvHrR5ON0N+XZxo6Kxi9dq+EpCUg -q54Z/D7aoztm1aH9bfe4ftJCHkG5Tw40SDM3DoYs4LHjl6maALyn0/yWL1z0Clu1 -GYGXjjU361gv+TvXBt+OfzTd8vtLOSdFYXBq2+2Cd94IAKXoLvg+GRBsy6CGmOxK -wF5YNWfDipjHyLKCmpDBlw9WWlZRPOMmyauSriO2McvJtpH6jhKVzzoHF3r5H/PO -Ik9hqWxHwbyIt2WscgRCu9AYg6uQwk48geWs1i5ycnaxSxKz+dlWYnq9AqLMBQwH -teC+9Zi8jDJrD2UWKyFy2+U6ECocDk2oD6rDR1pivjTOPI09o/BJFk8EcUkBaUmZ -mO2I94tfVCal0farlOEqhtkHc/WiSoADoStrPuRxYdMYN8/1YDGeM0sS3lIAdXW6 -wHTTe6Ab5SP0h8zYUd2Ofbj8cL7q1e0877TAKt7SUOTtowOdPvjzzs9VWCY7Z0fW -CTI= -=arXz ------END PGP PUBLIC KEY BLOCK----- diff --git a/acceptance/testdata/keys/pubkey.gpg b/acceptance/testdata/keys/pubkey.gpg deleted file mode 100644 index a5474ff4..00000000 Binary files a/acceptance/testdata/keys/pubkey.gpg and /dev/null differ diff --git a/acceptance/testdata/keys/rsa_unprotected.pub b/acceptance/testdata/keys/rsa_unprotected.pub deleted file mode 100644 index 71cf7f8e..00000000 --- a/acceptance/testdata/keys/rsa_unprotected.pub +++ /dev/null @@ -1,9 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxWFb75R71bdD12OL9Ba/ -Z9/61byXEMatIpliLZZKf2Ul937SIGLECGKvw3DIlQfjdv/u6RIXLQL7ybKKT7R0 -V8yZK6yhGXnjarPzeoOjaQBqbzR8tXdJJdpy9vbfTVbFonzb/e8uSgGtoKPwDosL -6JjcRz9hLl2B/UaHPhIEoqO4n6tOBeqcTJwAYV5YrPA+J1Tb8BBpuXPttUFFvXh4 -bqeB/uLfCorMDP/OnQ51waVb6zxjHgeY+R35X885rb6XHCTbKPveEeIFkC13TiO9 -Td9d34lvNX+2z+hlS997Gb8n1uGTGek4iEX/k0baI/FUYWzQtIUK7okWJlgSZg7Q -4wIDAQAB ------END PUBLIC KEY----- diff --git a/acceptance/testdata/lzma.compression.yaml b/acceptance/testdata/lzma.compression.yaml deleted file mode 100644 index 5b8de574..00000000 --- a/acceptance/testdata/lzma.compression.yaml +++ /dev/null @@ -1,17 +0,0 @@ -name: "foo" -arch: "amd64" -platform: "linux" -version: "v1.2.3" -maintainer: "Foo Bar" -description: | - Foo bar - Multiple lines -vendor: "foobar" -homepage: "https://foobar.org" -license: "MIT" -files: - ../testdata/fake: "/usr/local/bin/fake" -config_files: - ../testdata/whatever.conf: "/etc/foo/whatever.conf" -rpm: - compression: "lzma" \ No newline at end of file diff --git a/acceptance/testdata/lzma.rpm.compression.dockerfile b/acceptance/testdata/lzma.rpm.compression.dockerfile deleted file mode 100644 index fc60e693..00000000 --- a/acceptance/testdata/lzma.rpm.compression.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM fedora -ARG package -COPY ${package} /tmp/foo.rpm -RUN test "lzma" = "$(rpm -qp --qf '%{PAYLOADCOMPRESSOR}' /tmp/foo.rpm)" -RUN rpm -ivh /tmp/foo.rpm -RUN test -e /usr/local/bin/fake -RUN test -f /etc/foo/whatever.conf -RUN echo wat >> /etc/foo/whatever.conf -RUN rpm -e foo -RUN test -f /etc/foo/whatever.conf.rpmsave -RUN test ! -f /usr/local/bin/fake \ No newline at end of file diff --git a/acceptance/testdata/meta.yaml b/acceptance/testdata/meta.yaml deleted file mode 100644 index 20020784..00000000 --- a/acceptance/testdata/meta.yaml +++ /dev/null @@ -1,14 +0,0 @@ -name: "foo" -arch: "amd64" -platform: "linux" -version: "v1.2.3-beta" -maintainer: "Foo Bar" -depends: -- fish -- zsh -description: | - Foo bar - Multiple lines -vendor: "foobar" -homepage: "https://foobar.org" -license: "MIT" diff --git a/acceptance/testdata/min.yaml b/acceptance/testdata/min.yaml deleted file mode 100644 index f4b9c644..00000000 --- a/acceptance/testdata/min.yaml +++ /dev/null @@ -1,6 +0,0 @@ -name: foo -arch: amd64 -version: 1.2.3 -license: MIT -files: - ../testdata/fake: "/usr/local/bin/fake" diff --git a/acceptance/testdata/overrides.yaml b/acceptance/testdata/overrides.yaml deleted file mode 100644 index c519a51f..00000000 --- a/acceptance/testdata/overrides.yaml +++ /dev/null @@ -1,37 +0,0 @@ -name: "foo" -arch: "amd64" -platform: "linux" -version: "v1.2.3-beta" -maintainer: "Foo Bar" -depends: -- bash -provides: -- fake -replaces: -- foo -suggests: -- zsh -description: | - Foo bar - Multiple lines -vendor: "foobar" -homepage: "https://foobar.org" -license: "MIT" -files: - ../testdata/fake: "/usr/local/bin/fake" - ./testdata/folder/*: "/usr/share/whatever/folder/" -config_files: - ../testdata/whatever.conf: "/etc/foo/whatever.conf" -overrides: - rpm: - scripts: - preinstall: ./testdata/scripts/preinstall.sh - postremove: ./testdata/scripts/postremove.sh - deb: - scripts: - postinstall: ./testdata/scripts/postinstall.sh - preremove: ./testdata/scripts/preremove.sh - apk: - scripts: - postinstall: ./testdata/scripts/postinstall.sh - preremove: ./testdata/scripts/preremove.sh diff --git a/acceptance/testdata/release.rpm.dockerfile b/acceptance/testdata/release.rpm.dockerfile deleted file mode 100644 index 17a0ba19..00000000 --- a/acceptance/testdata/release.rpm.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM fedora -ARG package -COPY ${package} /tmp/foo.rpm -RUN rpm -ivh /tmp/foo.rpm -RUN test -e /usr/local/bin/fake -RUN test -f /etc/foo/whatever.conf -RUN echo wat >> /etc/foo/whatever.conf -RUN rpm -e foo -RUN test -f /etc/foo/whatever.conf.rpmsave -RUN test ! -f /usr/local/bin/fake diff --git a/acceptance/testdata/release.rpm.yaml b/acceptance/testdata/release.rpm.yaml deleted file mode 100644 index 5ec5b26d..00000000 --- a/acceptance/testdata/release.rpm.yaml +++ /dev/null @@ -1,16 +0,0 @@ -name: "foo" -arch: "amd64" -platform: "linux" -version: "v1.2.3" -maintainer: "Foo Bar" -release: "4" -description: | - Foo bar - Multiple lines -vendor: "foobar" -homepage: "https://foobar.org" -license: "MIT" -files: - ../testdata/fake: "/usr/local/bin/fake" -config_files: - ../testdata/whatever.conf: "/etc/foo/whatever.conf" diff --git a/acceptance/testdata/rpm.386.complex.dockerfile b/acceptance/testdata/rpm.386.complex.dockerfile deleted file mode 100644 index a3b2e64f..00000000 --- a/acceptance/testdata/rpm.386.complex.dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -FROM i386/centos -ARG package -COPY ${package} /tmp/foo.rpm -RUN rpm -ivh /tmp/foo.rpm -RUN test -e /usr/local/bin/fake -RUN test -f /etc/foo/whatever.conf -RUN test -d /usr/share/whatever/folder -RUN test -f /usr/share/whatever/folder/file1 -RUN test -f /usr/share/whatever/folder/file2 -RUN test -d /usr/share/whatever/folder/folder2 -RUN test -f /usr/share/whatever/folder/folder2/file1 -RUN test -f /usr/share/whatever/folder/folder2/file2 -RUN test -d /var/log/whatever -RUN test -d /usr/share/foo -RUN test -f /tmp/preinstall-proof -RUN test -f /tmp/postinstall-proof -RUN test ! -f /tmp/preremove-proof -RUN test ! -f /tmp/postremove-proof -RUN echo wat >> /etc/foo/whatever.conf -RUN rpm -e foo -RUN test -f /etc/foo/whatever.conf.rpmsave -RUN test ! -f /usr/local/bin/fake -RUN test -f /tmp/preremove-proof -RUN test -f /tmp/postremove-proof -RUN test ! -d /var/log/whatever -RUN test ! -d /usr/share/foo diff --git a/acceptance/testdata/rpm.386.dockerfile b/acceptance/testdata/rpm.386.dockerfile deleted file mode 100644 index 1e44577f..00000000 --- a/acceptance/testdata/rpm.386.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM i386/centos -ARG package -COPY ${package} /tmp/foo.rpm -RUN rpm -ivh /tmp/foo.rpm -RUN test -e /usr/local/bin/fake -RUN test -f /etc/foo/whatever.conf -RUN echo wat >> /etc/foo/whatever.conf -RUN rpm -e foo -RUN test -f /etc/foo/whatever.conf.rpmsave -RUN test ! -f /usr/local/bin/fake diff --git a/acceptance/testdata/rpm.arm64.dockerfile b/acceptance/testdata/rpm.arm64.dockerfile deleted file mode 100644 index 24550c48..00000000 --- a/acceptance/testdata/rpm.arm64.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM arm64v8/centos -ARG package -COPY ${package} /tmp/foo.rpm -RUN rpm -ivh /tmp/foo.rpm -RUN test -e /usr/local/bin/fake -RUN test -f /etc/foo/whatever.conf -RUN echo wat >> /etc/foo/whatever.conf -RUN rpm -e foo -RUN test -f /etc/foo/whatever.conf.rpmsave -RUN test ! -f /usr/local/bin/fake diff --git a/acceptance/testdata/rpm.changelog.dockerfile b/acceptance/testdata/rpm.changelog.dockerfile deleted file mode 100644 index 216a660f..00000000 --- a/acceptance/testdata/rpm.changelog.dockerfile +++ /dev/null @@ -1,12 +0,0 @@ -FROM fedora -ARG package -COPY ${package} /tmp/foo.rpm -RUN rpm -ivh /tmp/foo.rpm -RUN rpm -qp /tmp/foo.rpm --changelog | grep "Carlos A Becker " -RUN rpm -qp /tmp/foo.rpm --changelog | grep -E "^- note 1$" -RUN rpm -qp /tmp/foo.rpm --changelog | grep -E "^- note 2$" -RUN rpm -qp /tmp/foo.rpm --changelog | grep -E "^- note 3$" -RUN rpm -q foo --changelog | grep "Carlos A Becker " -RUN rpm -q foo --changelog | grep -E "^- note 1$" -RUN rpm -q foo --changelog | grep -E "^- note 2$" -RUN rpm -q foo --changelog | grep -E "^- note 3$" diff --git a/acceptance/testdata/rpm.complex.dockerfile b/acceptance/testdata/rpm.complex.dockerfile deleted file mode 100644 index 260e71c4..00000000 --- a/acceptance/testdata/rpm.complex.dockerfile +++ /dev/null @@ -1,29 +0,0 @@ -FROM fedora -ARG package -COPY ${package} /tmp/foo.rpm -RUN test "$(rpm -qp --recommends /tmp/foo.rpm)" = "fish" -RUN test "$(rpm -qp --suggests /tmp/foo.rpm)" = "zsh" -RUN test "$(rpm -qp --requires /tmp/foo.rpm)" = "bash" -RUN rpm -ivh /tmp/foo.rpm -RUN test -e /usr/local/bin/fake -RUN test -f /etc/foo/whatever.conf -RUN test -d /usr/share/whatever/folder -RUN test -f /usr/share/whatever/folder/file1 -RUN test -f /usr/share/whatever/folder/file2 -RUN test -d /usr/share/whatever/folder/folder2 -RUN test -f /usr/share/whatever/folder/folder2/file1 -RUN test -f /usr/share/whatever/folder/folder2/file2 -RUN test -d /var/log/whatever -RUN test -d /usr/share/foo -RUN test -f /tmp/preinstall-proof -RUN test -f /tmp/postinstall-proof -RUN test ! -f /tmp/preremove-proof -RUN test ! -f /tmp/postremove-proof -RUN echo wat >> /etc/foo/whatever.conf -RUN rpm -e foo -RUN test -f /etc/foo/whatever.conf.rpmsave -RUN test ! -f /usr/local/bin/fake -RUN test -f /tmp/preremove-proof -RUN test -f /tmp/postremove-proof -RUN test ! -d /var/log/whatever -RUN test ! -d /usr/share/foo diff --git a/acceptance/testdata/rpm.config-noreplace.dockerfile b/acceptance/testdata/rpm.config-noreplace.dockerfile deleted file mode 100644 index a48280a9..00000000 --- a/acceptance/testdata/rpm.config-noreplace.dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -FROM fedora -ARG package -COPY ${package} /tmp/new_foo.rpm -COPY tmp/noreplace_old_rpm.rpm /tmp/old_foo.rpm - -RUN rpm -ivh /tmp/old_foo.rpm - -RUN echo modified > /etc/regular.conf -RUN echo modified > /etc/noreplace.conf - -RUN rpm -ivh /tmp/new_foo.rpm --upgrade - -RUN cat /etc/regular.conf | grep foo=baz -RUN test -f /etc/regular.conf.rpmsave -RUN cat /etc/regular.conf.rpmsave | grep modified - -RUN cat /etc/noreplace.conf | grep modified -RUN test -f /etc/noreplace.conf.rpmnew -RUN cat /etc/noreplace.conf.rpmnew | grep foo=baz diff --git a/acceptance/testdata/rpm.dockerfile b/acceptance/testdata/rpm.dockerfile deleted file mode 100644 index 17a0ba19..00000000 --- a/acceptance/testdata/rpm.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM fedora -ARG package -COPY ${package} /tmp/foo.rpm -RUN rpm -ivh /tmp/foo.rpm -RUN test -e /usr/local/bin/fake -RUN test -f /etc/foo/whatever.conf -RUN echo wat >> /etc/foo/whatever.conf -RUN rpm -e foo -RUN test -f /etc/foo/whatever.conf.rpmsave -RUN test ! -f /usr/local/bin/fake diff --git a/acceptance/testdata/rpm.env-var-version.dockerfile b/acceptance/testdata/rpm.env-var-version.dockerfile deleted file mode 100644 index 165587da..00000000 --- a/acceptance/testdata/rpm.env-var-version.dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM fedora -ARG package -COPY ${package} /tmp/foo.rpm -ENV EXPECTVER="Version : 1.0.0~0.1.b1+git.abcdefgh" \ - EXPECTREL="Release : 1" -RUN rpm -qpi /tmp/foo.rpm | sed -e 's/ \+/ /g' | grep "Version" > found.ver -RUN rpm -qpi /tmp/foo.rpm | sed -e 's/ \+/ /g' | grep "Release" > found.rel -RUN export FOUND_VER="$(cat found.ver)" && \ - echo "Expected: ${EXPECTVER}' :: Found: '${FOUND_VER}'" && \ - test "${FOUND_VER}" = "${EXPECTVER}" -RUN export FOUND_REL="$(cat found.rel)" && \ - echo "Expected: '${EXPECTREL}' :: Found: '${FOUND_REL}'" && \ - test "${FOUND_REL}" = "${EXPECTREL}" diff --git a/acceptance/testdata/rpm.meta.dockerfile b/acceptance/testdata/rpm.meta.dockerfile deleted file mode 100644 index 3fd37e5e..00000000 --- a/acceptance/testdata/rpm.meta.dockerfile +++ /dev/null @@ -1,6 +0,0 @@ -FROM fedora -ARG package -COPY ${package} /tmp/foo.rpm -RUN dnf install -y /tmp/foo.rpm -RUN command -v zsh -RUN command -v fish diff --git a/acceptance/testdata/rpm.min.dockerfile b/acceptance/testdata/rpm.min.dockerfile deleted file mode 100644 index d3feab1e..00000000 --- a/acceptance/testdata/rpm.min.dockerfile +++ /dev/null @@ -1,6 +0,0 @@ -FROM fedora -ARG package -COPY ${package} /tmp/foo.rpm -RUN rpm -ivh /tmp/foo.rpm -RUN rpm -e foo -RUN rpm -qvl /tmp/foo.rpm | grep -E "root\s+root" diff --git a/acceptance/testdata/rpm.overrides.dockerfile b/acceptance/testdata/rpm.overrides.dockerfile deleted file mode 100644 index eba42f99..00000000 --- a/acceptance/testdata/rpm.overrides.dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -FROM fedora -ARG package -COPY ${package} /tmp/foo.rpm -RUN rpm -ivh /tmp/foo.rpm -RUN test -e /usr/local/bin/fake -RUN test -f /etc/foo/whatever.conf -RUN test -d /usr/share/whatever/folder -RUN test -f /usr/share/whatever/folder/file1 -RUN test -f /usr/share/whatever/folder/file2 -RUN test -d /usr/share/whatever/folder/folder2 -RUN test -f /usr/share/whatever/folder/folder2/file1 -RUN test -f /usr/share/whatever/folder/folder2/file2 -RUN test -f /tmp/preinstall-proof -RUN test ! -f /tmp/postinstall-proof -RUN test ! -f /tmp/preremove-proof -RUN test ! -f /tmp/postremove-proof -RUN echo wat >> /etc/foo/whatever.conf -RUN rpm -e foo -RUN test -f /etc/foo/whatever.conf.rpmsave -RUN test ! -f /usr/local/bin/fake -RUN test ! -f /tmp/preremove-proof -RUN test -f /tmp/postremove-proof diff --git a/acceptance/testdata/rpm.ppc64le.dockerfile b/acceptance/testdata/rpm.ppc64le.dockerfile deleted file mode 100644 index fa3fd837..00000000 --- a/acceptance/testdata/rpm.ppc64le.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM ppc64le/centos -ARG package -COPY ${package} /tmp/foo.rpm -RUN rpm -ivh /tmp/foo.rpm -RUN test -e /usr/local/bin/fake -RUN test -f /etc/foo/whatever.conf -RUN echo wat >> /etc/foo/whatever.conf -RUN rpm -e foo -RUN test -f /etc/foo/whatever.conf.rpmsave -RUN test ! -f /usr/local/bin/fake diff --git a/acceptance/testdata/rpm.signed.dockerfile b/acceptance/testdata/rpm.signed.dockerfile deleted file mode 100644 index 0eb30ec5..00000000 --- a/acceptance/testdata/rpm.signed.dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM fedora -ARG package -COPY keys/pubkey.asc /tmp/pubkey.asc -COPY ${package} /tmp/foo.rpm - -RUN rpm --import /tmp/pubkey.asc -RUN rpm -K /tmp/foo.rpm | grep ": digests signatures OK" -RUN rpm -K /tmp/foo.rpm -v | grep "RSA/SHA256 Signature, key ID 15bd80b3: OK" - -RUN rpm -i /tmp/foo.rpm diff --git a/acceptance/testdata/rpm.symlink.dockerfile b/acceptance/testdata/rpm.symlink.dockerfile deleted file mode 100644 index fb21044e..00000000 --- a/acceptance/testdata/rpm.symlink.dockerfile +++ /dev/null @@ -1,5 +0,0 @@ -FROM fedora -ARG package -COPY ${package} /tmp/foo.rpm -RUN rpm -ivh /tmp/foo.rpm -RUN ls -l /path/to/symlink | grep "/path/to/symlink -> /etc/foo/whatever.conf" diff --git a/acceptance/testdata/rules.deb.dockerfile b/acceptance/testdata/rules.deb.dockerfile deleted file mode 100644 index 8d8f89b8..00000000 --- a/acceptance/testdata/rules.deb.dockerfile +++ /dev/null @@ -1,5 +0,0 @@ -FROM ubuntu -ARG package -COPY ${package} /tmp/foo.deb -RUN dpkg -i /tmp/foo.deb -RUN dpkg -r foo diff --git a/acceptance/testdata/rules.deb.yaml b/acceptance/testdata/rules.deb.yaml deleted file mode 100644 index 67e2c4c4..00000000 --- a/acceptance/testdata/rules.deb.yaml +++ /dev/null @@ -1,18 +0,0 @@ -name: "foo" -arch: "amd64" -platform: "linux" -version: "v1.2.3" -maintainer: "Foo Bar" -description: | - Foo bar - Multiple lines -vendor: "foobar" -homepage: "https://foobar.org" -license: "MIT" -files: - ../testdata/fake: "/usr/local/bin/fake" -config_files: - ../testdata/whatever.conf: "/etc/foo/whatever.conf" -deb: - scripts: - rules: ./testdata/scripts/rules.sh diff --git a/acceptance/testdata/scripts/postinstall.sh b/acceptance/testdata/scripts/postinstall.sh deleted file mode 100755 index 8e9264e8..00000000 --- a/acceptance/testdata/scripts/postinstall.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -echo "Ok" > /tmp/postinstall-proof diff --git a/acceptance/testdata/scripts/postinstall_trigger.sh b/acceptance/testdata/scripts/postinstall_trigger.sh deleted file mode 100644 index 0e69ef27..00000000 --- a/acceptance/testdata/scripts/postinstall_trigger.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -if [ "$1" = "triggered" ] && [ "$2" = "manual-trigger" ]; then - echo "Ok" > /tmp/trigger-proof -fi diff --git a/acceptance/testdata/scripts/postremove.sh b/acceptance/testdata/scripts/postremove.sh deleted file mode 100755 index ef8f8931..00000000 --- a/acceptance/testdata/scripts/postremove.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -echo "Ok" > /tmp/postremove-proof diff --git a/acceptance/testdata/scripts/preinstall.sh b/acceptance/testdata/scripts/preinstall.sh deleted file mode 100755 index 37ca45fc..00000000 --- a/acceptance/testdata/scripts/preinstall.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -echo "Ok" > /tmp/preinstall-proof diff --git a/acceptance/testdata/scripts/preremove.sh b/acceptance/testdata/scripts/preremove.sh deleted file mode 100755 index 2fd3b62e..00000000 --- a/acceptance/testdata/scripts/preremove.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -echo "Ok" > /tmp/preremove-proof diff --git a/acceptance/testdata/scripts/rules.sh b/acceptance/testdata/scripts/rules.sh deleted file mode 100755 index 1ea546b4..00000000 --- a/acceptance/testdata/scripts/rules.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/make -f -#export DH_VERBOSE = 1 - -%: - echo "deb rules" - dh $@ diff --git a/acceptance/testdata/signed.yaml b/acceptance/testdata/signed.yaml deleted file mode 100644 index d47a8c7e..00000000 --- a/acceptance/testdata/signed.yaml +++ /dev/null @@ -1,19 +0,0 @@ -name: "foo" -arch: "amd64" -platform: "linux" -version: "v1.0.0" -maintainer: "John Doe " -description: This package is sigend -vendor: "FooBarCorp" -homepage: "http://example.com" -files: - ../testdata/fake: "/usr/local/bin/fake" -deb: - signature: - key_file: ../internal/sign/testdata/privkey_unprotected.asc -rpm: - signature: - key_file: ../internal/sign/testdata/privkey_unprotected.asc -apk: - signature: - key_file: ../internal/sign/testdata/rsa_unprotected.priv diff --git a/acceptance/testdata/simple.386.yaml b/acceptance/testdata/simple.386.yaml deleted file mode 100644 index 2cf5d62f..00000000 --- a/acceptance/testdata/simple.386.yaml +++ /dev/null @@ -1,15 +0,0 @@ -name: "foo" -arch: "386" -platform: "linux" -version: "v1.2.3" -maintainer: "Foo Bar" -description: | - Foo bar - Multiple lines -vendor: "foobar" -homepage: "https://foobar.org" -license: "MIT" -files: - ../testdata/fake: "/usr/local/bin/fake" -config_files: - ../testdata/whatever.conf: "/etc/foo/whatever.conf" diff --git a/acceptance/testdata/simple.arm64.yaml b/acceptance/testdata/simple.arm64.yaml deleted file mode 100644 index 0ad2becc..00000000 --- a/acceptance/testdata/simple.arm64.yaml +++ /dev/null @@ -1,15 +0,0 @@ -name: "foo" -arch: "arm64" -platform: "linux" -version: "v1.2.3" -maintainer: "Foo Bar" -description: | - Foo bar - Multiple lines -vendor: "foobar" -homepage: "https://foobar.org" -license: "MIT" -files: - ../testdata/fake: "/usr/local/bin/fake" -config_files: - ../testdata/whatever.conf: "/etc/foo/whatever.conf" diff --git a/acceptance/testdata/simple.ppc64le.yaml b/acceptance/testdata/simple.ppc64le.yaml deleted file mode 100644 index 9f574322..00000000 --- a/acceptance/testdata/simple.ppc64le.yaml +++ /dev/null @@ -1,15 +0,0 @@ -name: "foo" -arch: "ppc64le" -platform: "linux" -version: "v1.2.3" -maintainer: "Foo Bar" -description: | - Foo bar - Multiple lines -vendor: "foobar" -homepage: "https://foobar.org" -license: "MIT" -files: - ../testdata/fake: "/usr/local/bin/fake" -config_files: - ../testdata/whatever.conf: "/etc/foo/whatever.conf" diff --git a/acceptance/testdata/simple.yaml b/acceptance/testdata/simple.yaml deleted file mode 100644 index f7e95db1..00000000 --- a/acceptance/testdata/simple.yaml +++ /dev/null @@ -1,16 +0,0 @@ -name: "foo" -arch: "amd64" -platform: "linux" -version: "v1.2.3" -release: "simple" -maintainer: "Foo Bar" -description: | - Foo bar - Multiple lines -vendor: "foobar" -homepage: "https://foobar.org" -license: "MIT" -files: - ../testdata/fake: "/usr/local/bin/fake" -config_files: - ../testdata/whatever.conf: "/etc/foo/whatever.conf" diff --git a/acceptance/testdata/symlink.yaml b/acceptance/testdata/symlink.yaml deleted file mode 100644 index b4c8e1be..00000000 --- a/acceptance/testdata/symlink.yaml +++ /dev/null @@ -1,12 +0,0 @@ -name: "foo" -arch: "amd64" -platform: "linux" -version: "v1.2.3" -maintainer: "Foo Bar" -vendor: "foobar" -homepage: "https://foobar.org" -license: "MIT" -files: - ../testdata/whatever.conf: "/etc/foo/whatever.conf" -symlinks: - /path/to/symlink: "/etc/foo/whatever.conf" diff --git a/acceptance/testdata/triggers.yaml b/acceptance/testdata/triggers.yaml deleted file mode 100644 index 99a6c593..00000000 --- a/acceptance/testdata/triggers.yaml +++ /dev/null @@ -1,15 +0,0 @@ -name: "foo" -arch: "amd64" -platform: "linux" -version: "v1.2.3-beta" -maintainer: "Foo Bar" -vendor: "foobar" -license: "MIT" -files: - ../testdata/fake: "/usr/local/bin/fake" -scripts: - postinstall: ./testdata/scripts/postinstall_trigger.sh -deb: - triggers: - interest: - - manual-trigger diff --git a/acceptance/testdata/withchangelog.yaml b/acceptance/testdata/withchangelog.yaml deleted file mode 100644 index 7d70f9b0..00000000 --- a/acceptance/testdata/withchangelog.yaml +++ /dev/null @@ -1,17 +0,0 @@ -name: "foo" -arch: "amd64" -platform: "linux" -changelog: "../testdata/changelog.yaml" -version: "v1.2.3" -release: "simple" -maintainer: "Foo Bar" -description: | - Foo bar - Multiple lines -vendor: "foobar" -homepage: "https://foobar.org" -license: "MIT" -files: - ../testdata/fake: "/usr/local/bin/fake" -config_files: - ../testdata/whatever.conf: "/etc/foo/whatever.conf" diff --git a/acceptance/testdata/xz.compression.yaml b/acceptance/testdata/xz.compression.yaml deleted file mode 100644 index f064775c..00000000 --- a/acceptance/testdata/xz.compression.yaml +++ /dev/null @@ -1,17 +0,0 @@ -name: "foo" -arch: "amd64" -platform: "linux" -version: "v1.2.3" -maintainer: "Foo Bar" -description: | - Foo bar - Multiple lines -vendor: "foobar" -homepage: "https://foobar.org" -license: "MIT" -files: - ../testdata/fake: "/usr/local/bin/fake" -config_files: - ../testdata/whatever.conf: "/etc/foo/whatever.conf" -rpm: - compression: "xz" \ No newline at end of file diff --git a/acceptance/testdata/xz.rpm.compression.dockerfile b/acceptance/testdata/xz.rpm.compression.dockerfile deleted file mode 100644 index b6e2ef1e..00000000 --- a/acceptance/testdata/xz.rpm.compression.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM fedora -ARG package -COPY ${package} /tmp/foo.rpm -RUN test "xz" = "$(rpm -qp --qf '%{PAYLOADCOMPRESSOR}' /tmp/foo.rpm)" -RUN rpm -ivh /tmp/foo.rpm -RUN test -e /usr/local/bin/fake -RUN test -f /etc/foo/whatever.conf -RUN echo wat >> /etc/foo/whatever.conf -RUN rpm -e foo -RUN test -f /etc/foo/whatever.conf.rpmsave -RUN test ! -f /usr/local/bin/fake \ No newline at end of file diff --git a/apk/apk.go b/apk/apk.go index 228ecc4a..43b755b0 100644 --- a/apk/apk.go +++ b/apk/apk.go @@ -48,13 +48,15 @@ import ( "time" "github.com/goreleaser/nfpm" - "github.com/goreleaser/nfpm/internal/files" + "github.com/goreleaser/nfpm/files" "github.com/goreleaser/nfpm/internal/sign" ) +const packagerName = "apk" + // nolint: gochecknoinits func init() { - nfpm.Register("apk", Default) + nfpm.RegisterPackager(packagerName, Default) } // nolint: gochecknoglobals @@ -106,6 +108,12 @@ func (*Apk) Package(info *nfpm.Info, apk io.Writer) (err error) { if ok { info.Arch = arch } + if info.Arch == "" { + info.Arch = archToAlpine["amd64"] + } + if err = info.Validate(); err != nil { + return err + } var bufData bytes.Buffer @@ -386,31 +394,44 @@ func createBuilderData(info *nfpm.Info, sizep *int64) func(tw *tar.Writer) error return err } - // handle Files and ConfigFiles - if err := createFilesInsideTarGz(info, tw, created, sizep); err != nil { - return err - } - - return createSymlinksInsideTarGz(info, tw, created) + // handle Files + return createFilesInsideTarGz(info, tw, created, sizep) } } -func createFilesInsideTarGz(info *nfpm.Info, tw *tar.Writer, created map[string]bool, sizep *int64) error { - filesToCopy, err := files.Expand(info.Files, info.DisableGlobbing) - if err != nil { - return err - } - - configFilesToCopy, err := files.Expand(info.ConfigFiles, info.DisableGlobbing) - if err != nil { - return err - } - - for _, file := range append(filesToCopy, configFilesToCopy...) { +func createFilesInsideTarGz(info *nfpm.Info, tw *tar.Writer, created map[string]bool, sizep *int64) (err error) { + for _, file := range info.Contents { + if file.Packager != "" && file.Packager != packagerName { + continue + } if err = createTree(tw, file.Destination, created); err != nil { return err } - err := copyToTarAndDigest(file.Source, file.Destination, tw, sizep, created) + switch file.Type { + case "ghost": + // skip ghost files in apk + continue + case "symlink": + err = createSymlinkInsideTarGz(file, tw) + case "doc": + // nolint:gocritic + // ignoring `emptyFallthrough: remove empty case containing only fallthrough to default case` + fallthrough + case "licence", "license": + // nolint:gocritic + // ignoring `emptyFallthrough: remove empty case containing only fallthrough to default case` + fallthrough + case "readme": + // nolint:gocritic + // ignoring `emptyFallthrough: remove empty case containing only fallthrough to default case` + fallthrough + case "config", "config|noreplace": + // nolint:gocritic + // ignoring `emptyFallthrough: remove empty case containing only fallthrough to default case` + fallthrough + default: + err = copyToTarAndDigest(file, tw, sizep, created) + } if err != nil { return err } @@ -419,56 +440,37 @@ func createFilesInsideTarGz(info *nfpm.Info, tw *tar.Writer, created map[string] return nil } -func createSymlinksInsideTarGz(info *nfpm.Info, out *tar.Writer, created map[string]bool) error { - for src, dst := range info.Symlinks { - if err := createTree(out, src, created); err != nil { - return err - } - - err := newItemInsideTarGz(out, []byte{}, &tar.Header{ - Name: strings.TrimLeft(src, "/"), - Linkname: dst, - Typeflag: tar.TypeSymlink, - ModTime: time.Now(), - Format: tar.FormatGNU, - }) - if err != nil { - return err - } - } - - return nil +func createSymlinkInsideTarGz(file *files.Content, out *tar.Writer) error { + return newItemInsideTarGz(out, []byte{}, &tar.Header{ + Name: strings.TrimLeft(file.Destination, "/"), + Linkname: file.Source, + Typeflag: tar.TypeSymlink, + ModTime: file.FileInfo.MTime, + Format: tar.FormatGNU, + }) } -func copyToTarAndDigest(src, dst string, tw *tar.Writer, sizep *int64, created map[string]bool) error { - file, err := os.OpenFile(src, os.O_RDONLY, 0600) //nolint:gosec +func copyToTarAndDigest(file *files.Content, tw *tar.Writer, sizep *int64, created map[string]bool) error { + tarFile, err := os.OpenFile(file.Source, os.O_RDONLY, 0600) //nolint:gosec if err != nil { return fmt.Errorf("could not add file to the archive: %w", err) } // don't care if it errs while closing... - defer file.Close() // nolint: errcheck - info, err := file.Stat() - if err != nil { - return err - } - if info.IsDir() { - // TODO: this should probably return an error - return nil - } - header, err := tar.FileInfoHeader(info, src) + defer tarFile.Close() // nolint: errcheck + header, err := tar.FileInfoHeader(file, file.Source) if err != nil { log.Print(err) return err } - header.Name = files.ToNixPath(dst[1:]) - err = writeFile(tw, header, file) + header.Name = files.ToNixPath(file.Destination[1:]) + err = writeFile(tw, header, tarFile) if err != nil { return err } - *sizep += info.Size() - created[src] = true + *sizep += file.Size() + created[file.Source] = true return nil } diff --git a/apk/apk_test.go b/apk/apk_test.go index 0742e789..0f12b5a9 100644 --- a/apk/apk_test.go +++ b/apk/apk_test.go @@ -13,12 +13,11 @@ import ( "io/ioutil" "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/goreleaser/nfpm" "github.com/goreleaser/nfpm/internal/sign" - - "github.com/stretchr/testify/assert" ) // nolint: gochecknoglobals @@ -77,7 +76,7 @@ func exampleInfo() *nfpm.Info { } func TestArchToAlpine(t *testing.T) { - verifyArch(t, "", "") + verifyArch(t, "", "x86_64") verifyArch(t, "abc", "abc") verifyArch(t, "386", "x86") verifyArch(t, "amd64", "x86_64") @@ -97,6 +96,8 @@ func verifyArch(t *testing.T, nfpmArch, expectedArch string) { func TestCreateBuilderData(t *testing.T) { info := exampleInfo() + err := info.Validate() + require.NoError(t, err) size := int64(0) builderData := createBuilderData(info, &size) @@ -149,7 +150,7 @@ func TestDefaultWithArch(t *testing.T) { func TestNoInfo(t *testing.T) { var err = Default.Package(nfpm.WithDefaults(&nfpm.Info{}), ioutil.Discard) - assert.NoError(t, err) + assert.Error(t, err) } func TestFileDoesNotExist(t *testing.T) { @@ -207,6 +208,8 @@ func TestNoFiles(t *testing.T) { func TestCreateBuilderControl(t *testing.T) { info := exampleInfo() size := int64(12345) + err := info.Validate() + require.NoError(t, err) builderControl := createBuilderControl(info, size, sha256.New().Sum(nil)) var w bytes.Buffer @@ -231,6 +234,8 @@ func TestCreateBuilderControlScripts(t *testing.T) { PreRemove: "../testdata/scripts/preremove.sh", PostRemove: "../testdata/scripts/postremove.sh", } + err := info.Validate() + require.NoError(t, err) size := int64(12345) builderControl := createBuilderControl(info, size, sha256.New().Sum(nil)) @@ -269,6 +274,8 @@ func TestSignature(t *testing.T) { info.APK.Signature.KeyFile = "../internal/sign/testdata/rsa.priv" info.APK.Signature.KeyName = "testkey.rsa.pub" info.APK.Signature.KeyPassphrase = "hunter2" + err := info.Validate() + require.NoError(t, err) digest := sha1.New().Sum(nil) // nolint:gosec @@ -277,7 +284,7 @@ func TestSignature(t *testing.T) { require.NoError(t, createSignatureBuilder(digest, info)(tw)) signature := extractFromTar(t, signatureTarGz.Bytes(), ".SIGN.RSA.testkey.rsa.pub") - err := sign.RSAVerifySHA1Digest(digest, signature, "../internal/sign/testdata/rsa.pub") + err = sign.RSAVerifySHA1Digest(digest, signature, "../internal/sign/testdata/rsa.pub") require.NoError(t, err) err = Default.Package(info, ioutil.Discard) @@ -289,13 +296,15 @@ func TestSignatureError(t *testing.T) { info.APK.Signature.KeyFile = "../internal/sign/testdata/rsa.priv" info.APK.Signature.KeyName = "testkey.rsa.pub" info.APK.Signature.KeyPassphrase = "hunter2" + err := info.Validate() + require.NoError(t, err) // wrong hash format digest := sha256.New().Sum(nil) var signatureTarGz bytes.Buffer - err := createSignature(&signatureTarGz, info, digest) + err = createSignature(&signatureTarGz, info, digest) require.Error(t, err) var expectedError *nfpm.ErrSigningFailure @@ -314,10 +323,12 @@ func TestDisableGlobbing(t *testing.T) { info.Files = map[string]string{ "../testdata/{file}[": "/test/{file}[", } + err := info.Validate() + require.NoError(t, err) size := int64(0) var dataTarGz bytes.Buffer - _, err := createData(&dataTarGz, info, &size) + _, err = createData(&dataTarGz, info, &size) require.NoError(t, err) gzr, err := gzip.NewReader(&dataTarGz) diff --git a/deb/deb.go b/deb/deb.go index df689ba9..12a38a87 100644 --- a/deb/deb.go +++ b/deb/deb.go @@ -10,6 +10,7 @@ import ( "fmt" "io" "io/ioutil" + "log" "os" "path/filepath" "strings" @@ -20,13 +21,15 @@ import ( "github.com/goreleaser/chglog" "github.com/goreleaser/nfpm" - "github.com/goreleaser/nfpm/internal/files" + "github.com/goreleaser/nfpm/files" "github.com/goreleaser/nfpm/internal/sign" ) +const packagerName = "deb" + // nolint: gochecknoinits func init() { - nfpm.Register("deb", Default) + nfpm.RegisterPackager(packagerName, Default) } // nolint: gochecknoglobals @@ -83,6 +86,9 @@ func (*Deb) Package(info *nfpm.Info, deb io.Writer) (err error) { // nolint: fun if ok { info.Arch = arch } + if err = info.Validate(); err != nil { + return err + } dataTarGz, md5sums, instSize, err := createDataTarGz(info) if err != nil { @@ -179,10 +185,6 @@ func createDataTarGz(info *nfpm.Info) (dataTarGz, md5sums []byte, instSize int64 return nil, nil, 0, err } - if err := createSymlinksInsideTarGz(info, out, created); err != nil { - return nil, nil, 0, err - } - if err := out.Close(); err != nil { return nil, nil, 0, fmt.Errorf("closing data.tar.gz: %w", err) } @@ -193,50 +195,48 @@ func createDataTarGz(info *nfpm.Info) (dataTarGz, md5sums []byte, instSize int64 return buf.Bytes(), md5buf.Bytes(), instSize, nil } -func createSymlinksInsideTarGz(info *nfpm.Info, out *tar.Writer, created map[string]bool) error { - for src, dst := range info.Symlinks { - if err := createTree(out, src, created); err != nil { - return err - } - - err := newItemInsideTarGz(out, []byte{}, &tar.Header{ - Name: normalizePath(src), - Linkname: dst, - Typeflag: tar.TypeSymlink, - ModTime: time.Now(), - Format: tar.FormatGNU, - }) - if err != nil { - return err - } - } - - return nil +func createSymlinkInsideTarGz(file *files.Content, out *tar.Writer) error { + return newItemInsideTarGz(out, []byte{}, &tar.Header{ + Name: normalizePath(file.Destination), + Linkname: file.Source, + Typeflag: tar.TypeSymlink, + ModTime: file.FileInfo.MTime, + Format: tar.FormatGNU, + }) } -func createFilesInsideTarGz(info *nfpm.Info, out *tar.Writer, created map[string]bool) (bytes.Buffer, int64, error) { - var md5buf bytes.Buffer - var instSize int64 - - filesToCopy, err := files.Expand(info.Files, info.DisableGlobbing) - if err != nil { - return md5buf, 0, err - } - - configFiles, err := files.Expand(info.ConfigFiles, info.DisableGlobbing) - if err != nil { - return md5buf, 0, err - } - - filesToCopy = append(filesToCopy, configFiles...) - - for _, file := range filesToCopy { - if err = createTree(out, file.Destination, created); err != nil { +func createFilesInsideTarGz(info *nfpm.Info, tw *tar.Writer, created map[string]bool) (md5buf bytes.Buffer, instSize int64, err error) { + for _, file := range info.Contents { + if err = createTree(tw, file.Destination, created); err != nil { return md5buf, 0, err } var size int64 // declare early to avoid shadowing err - size, err = copyToTarAndDigest(out, &md5buf, file.Source, file.Destination) + switch file.Type { + case "ghost": + // skip ghost files in apk + continue + case "symlink": + err = createSymlinkInsideTarGz(file, tw) + case "doc": + // nolint:gocritic + // ignoring `emptyFallthrough: remove empty case containing only fallthrough to default case` + fallthrough + case "licence", "license": + // nolint:gocritic + // ignoring `emptyFallthrough: remove empty case containing only fallthrough to default case` + fallthrough + case "readme": + // nolint:gocritic + // ignoring `emptyFallthrough: remove empty case containing only fallthrough to default case` + fallthrough + case "config", "config|noreplace": + // nolint:gocritic + // ignoring `emptyFallthrough: remove empty case containing only fallthrough to default case` + fallthrough + default: + size, err = copyToTarAndDigest(file, tw, &md5buf) + } if err != nil { return md5buf, 0, err } @@ -244,7 +244,7 @@ func createFilesInsideTarGz(info *nfpm.Info, out *tar.Writer, created map[string } if info.Changelog != "" { - size, err := createChangelogInsideTarGz(out, &md5buf, created, info) + size, err := createChangelogInsideTarGz(tw, &md5buf, created, info) if err != nil { return md5buf, 0, err } @@ -267,43 +267,34 @@ func createEmptyFoldersInsideTarGz(info *nfpm.Info, out *tar.Writer, created map return nil } -func copyToTarAndDigest(tarw *tar.Writer, md5w io.Writer, src, dst string) (int64, error) { - file, err := os.OpenFile(src, os.O_RDONLY, 0600) //nolint:gosec +func copyToTarAndDigest(file *files.Content, tw *tar.Writer, md5w io.Writer) (int64, error) { + tarFile, err := os.OpenFile(file.Source, os.O_RDONLY, 0600) //nolint:gosec if err != nil { - return 0, fmt.Errorf("could not add file to the archive: %w", err) + return 0, fmt.Errorf("could not add tarFile to the archive: %w", err) } // don't care if it errs while closing... - defer file.Close() // nolint: errcheck,gosec - info, err := file.Stat() + defer tarFile.Close() // nolint: errcheck,gosec + + header, err := tar.FileInfoHeader(file, file.Source) if err != nil { + log.Print(err) return 0, err } - if info.IsDir() { - // TODO: this should probably return an error - return 0, nil - } - var header = tar.Header{ - Name: normalizePath(dst), - Size: info.Size(), - Mode: int64(info.Mode()), - ModTime: time.Now(), - Format: tar.FormatGNU, - } - if err := tarw.WriteHeader(&header); err != nil { - return 0, fmt.Errorf("cannot write header of %s to data.tar.gz: %w", src, err) + header.Name = normalizePath(file.Destination) + if err := tw.WriteHeader(header); err != nil { + return 0, fmt.Errorf("cannot write header of %s to data.tar.gz: %w", file.Source, err) } var digest = md5.New() // nolint:gas - if _, err := io.Copy(tarw, io.TeeReader(file, digest)); err != nil { + if _, err := io.Copy(tw, io.TeeReader(tarFile, digest)); err != nil { return 0, fmt.Errorf("failed to copy: %w", err) } if _, err := fmt.Fprintf(md5w, "%x %s\n", digest.Sum(nil), header.Name); err != nil { return 0, fmt.Errorf("failed to write md5: %w", err) } - return info.Size(), nil + return file.Size(), nil } -func createChangelogInsideTarGz(tarw *tar.Writer, md5w io.Writer, created map[string]bool, - info *nfpm.Info) (int64, error) { +func createChangelogInsideTarGz(tarw *tar.Writer, md5w io.Writer, created map[string]bool, info *nfpm.Info) (int64, error) { var buf bytes.Buffer var out = gzip.NewWriter(&buf) // the writers are properly closed later, this is just in case that we have diff --git a/deb/deb_test.go b/deb/deb_test.go index 5050c71a..00b6dcc0 100644 --- a/deb/deb_test.go +++ b/deb/deb_test.go @@ -19,15 +19,13 @@ import ( "testing" "github.com/blakesmith/ar" + "github.com/goreleaser/chglog" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/goreleaser/chglog" - - "github.com/goreleaser/nfpm/internal/files" - "github.com/goreleaser/nfpm/internal/sign" - "github.com/goreleaser/nfpm" + "github.com/goreleaser/nfpm/files" + "github.com/goreleaser/nfpm/internal/sign" ) // nolint: gochecknoglobals @@ -307,7 +305,7 @@ func TestDebNoFiles(t *testing.T) { func TestDebNoInfo(t *testing.T) { var err = Default.Package(nfpm.WithDefaults(&nfpm.Info{}), ioutil.Discard) - assert.NoError(t, err) + assert.Error(t, err) } func TestConffiles(t *testing.T) { @@ -471,6 +469,8 @@ func TestDebChangelogControl(t *testing.T) { Version: "1.0.0", Changelog: "../testdata/changelog.yaml", } + err := info.Validate() + require.NoError(t, err) controlTarGz, err := createControl(0, []byte{}, info) require.NoError(t, err) @@ -491,6 +491,8 @@ func TestDebNoChangelogControlWithoutChangelogConfigured(t *testing.T) { Description: "This package has explicitly no changelog.", Version: "1.0.0", } + err := info.Validate() + require.NoError(t, err) controlTarGz, err := createControl(0, []byte{}, info) require.NoError(t, err) @@ -507,6 +509,8 @@ func TestDebChangelogData(t *testing.T) { Version: "1.0.0", Changelog: "../testdata/changelog.yaml", } + err := info.Validate() + require.NoError(t, err) dataTarGz, _, _, err := createDataTarGz(info) require.NoError(t, err) @@ -531,6 +535,8 @@ func TestDebNoChangelogDataWithoutChangelogConfigured(t *testing.T) { Description: "This package has explicitly no changelog.", Version: "1.0.0", } + err := info.Validate() + require.NoError(t, err) dataTarGz, _, _, err := createDataTarGz(info) require.NoError(t, err) @@ -559,6 +565,8 @@ func TestDebTriggers(t *testing.T) { }, }, } + err := info.Validate() + require.NoError(t, err) controlTarGz, err := createControl(0, []byte{}, info) require.NoError(t, err) @@ -597,6 +605,8 @@ func TestDebNoTriggersInControlIfNoneProvided(t *testing.T) { Description: "This package has explicitly no triggers.", Version: "1.0.0", } + err := info.Validate() + require.NoError(t, err) controlTarGz, err := createControl(0, []byte{}, info) require.NoError(t, err) @@ -622,6 +632,8 @@ func TestSymlinkInFiles(t *testing.T) { }, }, } + err := info.Validate() + require.NoError(t, err) realSymlinkTarget, err := ioutil.ReadFile(symlinkTarget) require.NoError(t, err) @@ -656,6 +668,8 @@ func TestSymlink(t *testing.T) { }, }, } + err := info.Validate() + require.NoError(t, err) dataTarGz, _, _, err := createDataTarGz(info) require.NoError(t, err) @@ -674,6 +688,8 @@ func TestEnsureRelativePrefixInTarGzFiles(t *testing.T) { "/symlink/to/fake.txt": "/usr/share/doc/fake/fake.txt", } info.Changelog = "../testdata/changelog.yaml" + err := info.Validate() + require.NoError(t, err) dataTarGz, md5sums, instSize, err := createDataTarGz(info) require.NoError(t, err) @@ -687,8 +703,15 @@ func TestEnsureRelativePrefixInTarGzFiles(t *testing.T) { func TestMD5Sums(t *testing.T) { info := exampleInfo() info.Changelog = "../testdata/changelog.yaml" + err := info.Validate() + require.NoError(t, err) - nFiles := len(info.Files) + len(info.ConfigFiles) + 1 // +1 is the changelog + nFiles := 1 + for _, f := range info.Contents { + if f.Packager == "" || f.Packager == "deb" { + nFiles++ + } + } dataTarGz, md5sums, instSize, err := createDataTarGz(info) require.NoError(t, err) @@ -780,6 +803,8 @@ func TestDisableGlobbing(t *testing.T) { info.Files = map[string]string{ "../testdata/{file}[": "/test/{file}[", } + err := info.Validate() + require.NoError(t, err) dataTarGz, _, _, err := createDataTarGz(info) require.NoError(t, err) diff --git a/files/files.go b/files/files.go new file mode 100644 index 00000000..326c6f52 --- /dev/null +++ b/files/files.go @@ -0,0 +1,197 @@ +package files + +import ( + "fmt" + "os" + "path/filepath" + "sort" + "time" + + "github.com/goreleaser/fileglob" + "gopkg.in/yaml.v3" + + "github.com/goreleaser/nfpm/internal/glob" +) + +// Content describes the source and destination +// of one file to copy into a package. +type Content struct { + Source string `yaml:"src,omitempty"` + Destination string `yaml:"dst,omitempty"` + Type string `yaml:"type,omitempty"` + Packager string `yaml:"packager,omitempty"` + FileInfo *ContentFileInfo `yaml:"file_info,omitempty"` +} + +type ContentFileInfo struct { + Owner string `yaml:"owner,omitempty"` + Group string `yaml:"group"` + Mode os.FileMode `yaml:"mode,omitempty"` + MTime time.Time `yaml:"mtime,omitempty"` + Size int64 `yaml:"-"` +} + +// Contents list of Content to process. +type Contents []*Content + +type simpleContents map[string]string + +func (c *Contents) UnmarshalYAML(value *yaml.Node) (err error) { + // nolint:exhaustive + // we do not care about `AliasNode`, `DocumentNode` + switch value.Kind { + case yaml.SequenceNode: + type tmpContents Contents + var tmp tmpContents + if err = value.Decode(&tmp); err != nil { + return err + } + *c = Contents(tmp) + case yaml.MappingNode: + var tmp simpleContents + if err = value.Decode(&tmp); err != nil { + return err + } + for src, dst := range tmp { + *c = append(*c, &Content{ + Source: src, + Destination: dst, + }) + } + case yaml.ScalarNode: + // TODO: implement issue-43 here and remove the fallthrough + // nolint:gocritic + // ignoring `emptyFallthrough: remove empty case containing only fallthrough to default case` + fallthrough + default: + // nolint:goerr113 + // this is temporary so we do not need the a static error + return fmt.Errorf("not implemented") + } + + return nil +} + +func (c Contents) Len() int { + return len(c) +} + +func (c Contents) Swap(i, j int) { + c[i], c[j] = c[j], c[i] +} + +func (c Contents) Less(i, j int) bool { + a, b := c[i], c[j] + if a.Type != b.Type { + return len(b.Type) < len(b.Type) + } + if a.Source != b.Source { + return a.Source < b.Source + } + return a.Destination < b.Destination +} + +func (c *Content) WithFileInfoDefaults() { + if c.FileInfo == nil { + c.FileInfo = &ContentFileInfo{} + } + if c.FileInfo.Owner == "" { + c.FileInfo.Owner = "root" + } + if c.FileInfo.Group == "" { + c.FileInfo.Group = "root" + } + info, err := os.Stat(c.Source) + if err == nil { + c.FileInfo.MTime = info.ModTime() + c.FileInfo.Mode = info.Mode() + c.FileInfo.Size = info.Size() + } + if c.FileInfo.MTime.IsZero() { + c.FileInfo.MTime = time.Now().UTC() + } +} + +// Name to part of the os.FileInfo interface +func (c *Content) Name() string { + return c.Source +} + +// Size to part of the os.FileInfo interface +func (c *Content) Size() int64 { + return c.FileInfo.Size +} + +// Mode to part of the os.FileInfo interface +func (c *Content) Mode() os.FileMode { + return c.FileInfo.Mode +} + +// ModTime to part of the os.FileInfo interface +func (c *Content) ModTime() time.Time { + return c.FileInfo.MTime +} + +// IsDir to part of the os.FileInfo interface +func (c *Content) IsDir() bool { + return false +} + +// Sys to part of the os.FileInfo interface +func (c *Content) Sys() interface{} { + return nil +} + +// ExpandContentGlobs gathers all of the real files to be copied into the package. +func ExpandContentGlobs(filesSrcDstMap Contents, disableGlobbing bool) (files Contents, err error) { + for _, f := range filesSrcDstMap { + var globbed map[string]string + if disableGlobbing { + f.Source = fileglob.QuoteMeta(f.Source) + } + + switch f.Type { + case "ghost", "symlink": + // Ghost and symlink files need to be in the list, but dont glob them because they do not really exist + f.WithFileInfoDefaults() + files = append(files, f) + continue + } + + globbed, err = glob.Glob(f.Source, f.Destination) + if err != nil { + return nil, err + } + files = appendGlobbedFiles(globbed, f, files) + } + + // sort the files for reproducibility and general cleanliness + sort.Sort(files) + + return files, nil +} + +func appendGlobbedFiles(globbed map[string]string, origFile *Content, incFiles Contents) (files Contents) { + files = append(files, incFiles...) + for src, dst := range globbed { + newFile := &Content{ + Destination: ToNixPath(dst), + Source: ToNixPath(src), + Type: origFile.Type, + FileInfo: origFile.FileInfo, + Packager: origFile.Packager, + } + newFile.WithFileInfoDefaults() + files = append(files, newFile) + } + + return files +} + +// ToNixPath converts the given path to a nix-style path. +// +// Windows-style path separators are considered escape +// characters by some libraries, which can cause issues. +func ToNixPath(path string) string { + return filepath.ToSlash(filepath.Clean(path)) +} diff --git a/files/files_test.go b/files/files_test.go new file mode 100644 index 00000000..652e4020 --- /dev/null +++ b/files/files_test.go @@ -0,0 +1,71 @@ +package files_test + +import ( + "fmt" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "gopkg.in/yaml.v3" + + "github.com/goreleaser/nfpm/files" +) + +type testStruct struct { + Contents files.Contents `yaml:"contents"` +} + +func TestBasicDecode(t *testing.T) { + var config testStruct + dec := yaml.NewDecoder(strings.NewReader(`--- +contents: +- src: a + dst: b +- src: a + dst: b + type: "config|noreplace" + file_info: + mode: 0644 + packager: "rpm" + mtime: 2008-01-02T15:04:05Z +`)) + dec.KnownFields(true) + err := dec.Decode(&config) + require.NoError(t, err) + assert.Len(t, config.Contents, 2) + for _, f := range config.Contents { + fmt.Printf("%+#v\n", f) + assert.Equal(t, f.Source, "a") + assert.Equal(t, f.Destination, "b") + } +} + +func TestMapperDecode(t *testing.T) { + var config testStruct + dec := yaml.NewDecoder(strings.NewReader(`--- +contents: + a: b + a2: b2 +`)) + dec.KnownFields(true) + err := dec.Decode(&config) + require.NoError(t, err) + assert.Len(t, config.Contents, 2) + for _, f := range config.Contents { + fmt.Printf("%+#v\n", f) + assert.Equal(t, f.Packager, "") + assert.Equal(t, f.Type, "") + } +} + +func TestStringDecode(t *testing.T) { + var config testStruct + dec := yaml.NewDecoder(strings.NewReader(`--- +contents: /path/to/a/tgz +`)) + dec.KnownFields(true) + err := dec.Decode(&config) + require.Error(t, err) + assert.Equal(t, err.Error(), "not implemented") +} diff --git a/go.mod b/go.mod index f9fefb9b..9f00832e 100644 --- a/go.mod +++ b/go.mod @@ -41,7 +41,7 @@ require ( golang.org/x/net v0.0.0-20201209123823-ac852fbbde11 // indirect golang.org/x/sys v0.0.0-20201207223542-d4d67f95c62d // indirect golang.org/x/tools v0.0.0-20201208233053-a543418bbed2 // indirect - gopkg.in/yaml.v2 v2.4.0 - gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 mvdan.cc/gofumpt v0.0.0-20201129102820-5c11c50e9475 // indirect ) diff --git a/internal/files/files.go b/internal/files/files.go deleted file mode 100644 index b3d8f584..00000000 --- a/internal/files/files.go +++ /dev/null @@ -1,54 +0,0 @@ -package files - -import ( - "path/filepath" - "sort" - - "github.com/goreleaser/fileglob" - - "github.com/goreleaser/nfpm/internal/glob" -) - -// FileToCopy describes the source and destination -// of one file to copy into a package. -type FileToCopy struct { - Source string - Destination string -} - -// Expand gathers all of the real files to be copied into the package. -func Expand(filesSrcDstMap map[string]string, disableGlobbing bool) ([]FileToCopy, error) { - var files []FileToCopy - - for srcGlob, dstRoot := range filesSrcDstMap { - if disableGlobbing { - srcGlob = fileglob.QuoteMeta(srcGlob) - } - - globbed, err := glob.Glob(srcGlob, dstRoot) - if err != nil { - return nil, err - } - for src, dst := range globbed { - files = append(files, FileToCopy{ToNixPath(src), ToNixPath(dst)}) - } - } - - // sort the files for reproducibility and general cleanliness - sort.Slice(files, func(i, j int) bool { - a, b := files[i], files[j] - if a.Source != b.Source { - return a.Source < b.Source - } - return a.Destination < b.Destination - }) - return files, nil -} - -// ToNixPath converts the given path to a nix-style path. -// -// Windows-style path separators are considered escape -// characters by some libraries, which can cause issues. -func ToNixPath(path string) string { - return filepath.ToSlash(filepath.Clean(path)) -} diff --git a/internal/files/files_test.go b/internal/files/files_test.go deleted file mode 100644 index 9911f640..00000000 --- a/internal/files/files_test.go +++ /dev/null @@ -1,56 +0,0 @@ -package files - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/goreleaser/nfpm" -) - -func TestListFilesToCopy(t *testing.T) { - info := &nfpm.Info{ - Overridables: nfpm.Overridables{ - ConfigFiles: map[string]string{ - "../../testdata/whatever.conf": "/whatever", - }, - Files: map[string]string{ - "../../testdata/scripts/*": "/test", - }, - }, - } - - regularFiles, err := Expand(info.Files, info.DisableGlobbing) - require.NoError(t, err) - - configFiles, err := Expand(info.ConfigFiles, info.DisableGlobbing) - require.NoError(t, err) - - // all the input files described in the config in sorted order by source path - require.Equal(t, []FileToCopy{ - {"../../testdata/scripts/postinstall.sh", "/test/postinstall.sh"}, - {"../../testdata/scripts/postremove.sh", "/test/postremove.sh"}, - {"../../testdata/scripts/preinstall.sh", "/test/preinstall.sh"}, - {"../../testdata/scripts/preremove.sh", "/test/preremove.sh"}, - }, regularFiles) - - require.Equal(t, []FileToCopy{ - {"../../testdata/whatever.conf", "/whatever"}, - }, configFiles) -} - -func TestListFilesToCopyWithAndWithoutGlobbing(t *testing.T) { - _, err := Expand(map[string]string{ - "../../testdata/{file}*": "/test/{file}[", - }, false) - assert.EqualError(t, err, "glob failed: ../../testdata/{file}*: no matching files") - - files, err := Expand(map[string]string{ - "../../testdata/{file}[": "/test/{file}[", - }, true) - require.NoError(t, err) - assert.Equal(t, []FileToCopy{ - {"../../testdata/{file}[", "/test/{file}["}, - }, files) -} diff --git a/nfpm.go b/nfpm.go index e11b4945..1c17e951 100644 --- a/nfpm.go +++ b/nfpm.go @@ -13,7 +13,9 @@ import ( "github.com/Masterminds/semver/v3" "github.com/goreleaser/chglog" "github.com/imdario/mergo" - "gopkg.in/yaml.v2" + "gopkg.in/yaml.v3" + + "github.com/goreleaser/nfpm/files" ) // nolint: gochecknoglobals @@ -22,11 +24,18 @@ var ( lock sync.Mutex ) -// Register a new packager for the given format. -func Register(format string, p Packager) { +// RegisterPackager a new packager for the given format. +func RegisterPackager(format string, p Packager) { lock.Lock() + defer lock.Unlock() packagers[format] = p - lock.Unlock() +} + +// ClearPackagers clear all registered packagers, used for testing. +func ClearPackagers() { + lock.Lock() + defer lock.Unlock() + packagers = map[string]Packager{} } // ErrNoPackager happens when no packager is registered for the given format. @@ -50,7 +59,7 @@ func Get(format string) (Packager, error) { // Parse decodes YAML data from an io.Reader into a configuration struct. func Parse(in io.Reader) (config Config, err error) { dec := yaml.NewDecoder(in) - dec.SetStrict(true) + dec.KnownFields(true) if err = dec.Decode(&config); err != nil { return } @@ -78,6 +87,8 @@ func Parse(in io.Reader) (config Config, err error) { config.APK.Signature.KeyPassphrase = apkPassphrase } + WithDefaults(&config.Info) + return config, config.Validate() } @@ -117,6 +128,10 @@ func (c *Config) Get(format string) (info *Info, err error) { // no overrides return info, nil } + if !override.hasResetFiles { + override.resetFiles(format) + c.Contents = append(c.Contents, override.Contents...) + } if err = mergo.Merge(&info.Overridables, override, mergo.WithOverride); err != nil { return nil, fmt.Errorf("failed to merge overrides into info: %w", err) } @@ -125,6 +140,9 @@ func (c *Config) Get(format string) (info *Info, err error) { // Validate ensures that the config is well typed. func (c *Config) Validate() error { + if err := Validate(&c.Info); err != nil { + return err + } for format := range c.Overrides { if _, err := Get(format); err != nil { return err @@ -157,22 +175,99 @@ type Info struct { Target string `yaml:"-"` } +func (i *Info) Validate() error { + i.resetFiles("") + return Validate(i) +} + +// GetChangeLog parses the provided changelog file. +func (i *Info) GetChangeLog() (log *chglog.PackageChangeLog, err error) { + // if the file does not exist chglog.Parse will just silently + // create an empty changelog but we should notify the user instead + if _, err = os.Stat(i.Changelog); os.IsNotExist(err) { + return nil, err + } + + entries, err := chglog.Parse(i.Changelog) + if err != nil { + return nil, err + } + + return &chglog.PackageChangeLog{ + Name: i.Name, + Entries: entries, + }, nil +} + // Overridables contain the field which are overridable in a package. type Overridables struct { - Replaces []string `yaml:"replaces,omitempty"` - Provides []string `yaml:"provides,omitempty"` - Depends []string `yaml:"depends,omitempty"` - Recommends []string `yaml:"recommends,omitempty"` - Suggests []string `yaml:"suggests,omitempty"` - Conflicts []string `yaml:"conflicts,omitempty"` - Files map[string]string `yaml:"files,omitempty"` - ConfigFiles map[string]string `yaml:"config_files,omitempty"` - Symlinks map[string]string `yaml:"symlinks,omitempty"` - EmptyFolders []string `yaml:"empty_folders,omitempty"` - Scripts Scripts `yaml:"scripts,omitempty"` - RPM RPM `yaml:"rpm,omitempty"` - Deb Deb `yaml:"deb,omitempty"` - APK APK `yaml:"apk,omitempty"` + Replaces []string `yaml:"replaces,omitempty"` + Provides []string `yaml:"provides,omitempty"` + Depends []string `yaml:"depends,omitempty"` + Recommends []string `yaml:"recommends,omitempty"` + Suggests []string `yaml:"suggests,omitempty"` + Conflicts []string `yaml:"conflicts,omitempty"` + Contents files.Contents `yaml:"contents,omitempty"` + Files map[string]string `yaml:"files,omitempty"` + ConfigFiles map[string]string `yaml:"config_files,omitempty"` + Symlinks map[string]string `yaml:"symlinks,omitempty"` + EmptyFolders []string `yaml:"empty_folders,omitempty"` + Scripts Scripts `yaml:"scripts,omitempty"` + RPM RPM `yaml:"rpm,omitempty"` + Deb Deb `yaml:"deb,omitempty"` + APK APK `yaml:"apk,omitempty"` + hasResetFiles bool +} + +func (o *Overridables) resetFiles(packager string) { + if o.hasResetFiles { + return + } + for src, dst := range o.Files { + o.Contents = append(o.Contents, &files.Content{ + Source: src, + Destination: dst, + Packager: packager, + }) + } + o.Files = nil + for src, dst := range o.ConfigFiles { + o.Contents = append(o.Contents, &files.Content{ + Source: src, + Destination: dst, + Type: "config", + Packager: packager, + }) + } + o.ConfigFiles = nil + + // Symlinks is backwards from other in the config file + for dst, src := range o.Symlinks { + o.Contents = append(o.Contents, &files.Content{ + Source: src, + Destination: dst, + Type: "symlink", + Packager: packager, + }) + } + o.Symlinks = nil + for src, dst := range o.RPM.ConfigNoReplaceFiles { + o.Contents = append(o.Contents, &files.Content{ + Source: src, + Destination: dst, + Type: "config|noreplace", + Packager: "rpm", + }) + } + o.RPM.ConfigNoReplaceFiles = nil + for _, dst := range o.RPM.GhostFiles { + o.Contents = append(o.Contents, &files.Content{ + Destination: dst, + Type: "ghost", + Packager: "rpm", + }) + } + o.hasResetFiles = true } // RPM is custom configs that are only available on RPM packages. @@ -257,7 +352,7 @@ func (e ErrFieldEmpty) Error() string { } // Validate the given Info and returns an error if it is invalid. -func Validate(info *Info) error { +func Validate(info *Info) (err error) { if info.Name == "" { return ErrFieldEmpty{"name"} } @@ -279,7 +374,8 @@ func Validate(info *Info) error { fmt.Fprintln(os.Stderr, "Warning: bindir is deprecated and will be removed in a future version") } - return nil + info.Contents, err = files.ExpandContentGlobs(info.Contents, info.DisableGlobbing) + return err } // WithDefaults set some sane defaults into the given Info. @@ -290,6 +386,12 @@ func WithDefaults(info *Info) *Info { if info.Description == "" { info.Description = "no description given" } + if info.Arch == "" { + info.Arch = "amd64" + } + if info.Version == "" { + info.Version = "v0.0.0-rc0" + } // parse the version as a semver so we can properly split the parts // and support proper ordering for both rpm and deb @@ -307,25 +409,6 @@ func WithDefaults(info *Info) *Info { return info } -// GetChangeLog parses the provided changelog file. -func (info *Info) GetChangeLog() (log *chglog.PackageChangeLog, err error) { - // if the file does not exist chglog.Parse will just silently - // create an empty changelog but we should notify the user instead - if _, err = os.Stat(info.Changelog); os.IsNotExist(err) { - return nil, err - } - - entries, err := chglog.Parse(info.Changelog) - if err != nil { - return nil, err - } - - return &chglog.PackageChangeLog{ - Name: info.Name, - Entries: entries, - }, nil -} - // ErrSigningFailure is returned whenever something went wrong during // the package signing process. The underlying error can be unwrapped // and could be crypto-related or something that occurred while adding diff --git a/nfpm_test.go b/nfpm_test.go index 404178a4..7447dd0b 100644 --- a/nfpm_test.go +++ b/nfpm_test.go @@ -1,4 +1,4 @@ -package nfpm +package nfpm_test import ( "fmt" @@ -10,72 +10,74 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/goreleaser/nfpm" ) func TestRegister(t *testing.T) { format := "TestRegister" pkgr := &fakePackager{} - Register(format, pkgr) - got, err := Get(format) + nfpm.RegisterPackager(format, pkgr) + got, err := nfpm.Get(format) require.NoError(t, err) assert.Equal(t, pkgr, got) } func TestGet(t *testing.T) { format := "TestGet" - got, err := Get(format) + got, err := nfpm.Get(format) require.Error(t, err) assert.EqualError(t, err, "no packager registered for the format "+format) assert.Nil(t, got) pkgr := &fakePackager{} - Register(format, pkgr) - got, err = Get(format) + nfpm.RegisterPackager(format, pkgr) + got, err = nfpm.Get(format) require.NoError(t, err) assert.Equal(t, pkgr, got) } func TestDefaultsVersion(t *testing.T) { - info := &Info{ + info := &nfpm.Info{ Version: "v1.0.0", } - info = WithDefaults(info) + info = nfpm.WithDefaults(info) assert.NotEmpty(t, info.Platform) assert.Equal(t, "1.0.0", info.Version) assert.Equal(t, "", info.Release) assert.Equal(t, "", info.Prerelease) - info = &Info{ + info = &nfpm.Info{ Version: "v1.0.0-rc1", } - info = WithDefaults(info) + info = nfpm.WithDefaults(info) assert.Equal(t, "1.0.0", info.Version) assert.Equal(t, "", info.Release) assert.Equal(t, "rc1", info.Prerelease) - info = &Info{ + info = &nfpm.Info{ Version: "v1.0.0-beta1", } - info = WithDefaults(info) + info = nfpm.WithDefaults(info) assert.Equal(t, "1.0.0", info.Version) assert.Equal(t, "", info.Release) assert.Equal(t, "beta1", info.Prerelease) - info = &Info{ + info = &nfpm.Info{ Version: "v1.0.0-1", Release: "2", Prerelease: "beta1", } - info = WithDefaults(info) + info = nfpm.WithDefaults(info) assert.Equal(t, "1.0.0", info.Version) assert.Equal(t, "2", info.Release) assert.Equal(t, "beta1", info.Prerelease) - info = &Info{ + info = &nfpm.Info{ Version: "v1.0.0-1+xdg2", Release: "2", Prerelease: "beta1", } - info = WithDefaults(info) + info = nfpm.WithDefaults(info) assert.Equal(t, "1.0.0", info.Version) assert.Equal(t, "2", info.Release) assert.Equal(t, "beta1", info.Prerelease) @@ -83,31 +85,31 @@ func TestDefaultsVersion(t *testing.T) { } func TestDefaults(t *testing.T) { - info := &Info{ + info := &nfpm.Info{ Platform: "darwin", Version: "2.4.1", Description: "no description given", } - got := WithDefaults(info) + got := nfpm.WithDefaults(info) assert.Equal(t, info, got) } func TestValidate(t *testing.T) { - require.NoError(t, Validate(&Info{ + require.NoError(t, nfpm.Validate(&nfpm.Info{ Name: "as", Arch: "asd", Version: "1.2.3", - Overridables: Overridables{ + Overridables: nfpm.Overridables{ Files: map[string]string{ "asa": "asd", }, }, })) - require.NoError(t, Validate(&Info{ + require.NoError(t, nfpm.Validate(&nfpm.Info{ Name: "as", Arch: "asd", Version: "1.2.3", - Overridables: Overridables{ + Overridables: nfpm.Overridables{ ConfigFiles: map[string]string{ "asa": "asd", }, @@ -116,7 +118,7 @@ func TestValidate(t *testing.T) { } func TestValidateError(t *testing.T) { - for err, info := range map[string]Info{ + for err, info := range map[string]nfpm.Info{ "package name must be provided": {}, "package arch must be provided": { Name: "fo", @@ -129,27 +131,52 @@ func TestValidateError(t *testing.T) { err := err info := info t.Run(err, func(t *testing.T) { - require.EqualError(t, Validate(&info), err) + require.EqualError(t, nfpm.Validate(&info), err) }) } } func TestParseFile(t *testing.T) { - packagers = map[string]Packager{} - _, err := ParseFile("./testdata/overrides.yaml") + nfpm.ClearPackagers() + _, err := nfpm.ParseFile("./testdata/overrides.yaml") require.Error(t, err) - Register("deb", &fakePackager{}) - Register("rpm", &fakePackager{}) - Register("apk", &fakePackager{}) - _, err = ParseFile("./testdata/overrides.yaml") + nfpm.RegisterPackager("deb", &fakePackager{}) + nfpm.RegisterPackager("rpm", &fakePackager{}) + nfpm.RegisterPackager("apk", &fakePackager{}) + _, err = nfpm.ParseFile("./testdata/overrides.yaml") require.NoError(t, err) - _, err = ParseFile("./testdata/doesnotexist.yaml") + _, err = nfpm.ParseFile("./testdata/doesnotexist.yaml") require.Error(t, err) - config, err := ParseFile("./testdata/versionenv.yaml") + config, err := nfpm.ParseFile("./testdata/versionenv.yaml") require.NoError(t, err) assert.Equal(t, fmt.Sprintf("v%s", os.Getenv("GOROOT")), config.Version) } +func TestParseEnhancedFile(t *testing.T) { + config, err := nfpm.ParseFile("./testdata/contents.yaml") + require.NoError(t, err) + assert.Equal(t, config.Name, "contents foo") + shouldFind := 5 + if len(config.Contents) != shouldFind { + t.Errorf("should have had %d files but found %d", shouldFind, len(config.Contents)) + for idx, f := range config.Contents { + fmt.Printf("%d => %+#v\n", idx, f) + } + } +} + +func TestParseEnhancedNestedGlobFile(t *testing.T) { + config, err := nfpm.ParseFile("./testdata/contents_glob.yaml") + require.NoError(t, err) + shouldFind := 3 + if len(config.Contents) != shouldFind { + t.Errorf("should have had %d files but found %d", shouldFind, len(config.Contents)) + for idx, f := range config.Contents { + fmt.Printf("%d => %+#v\n", idx, f) + } + } +} + func TestOptionsFromEnvironment(t *testing.T) { const ( globalPass = "hunter2" @@ -163,7 +190,7 @@ func TestOptionsFromEnvironment(t *testing.T) { t.Run("version", func(t *testing.T) { os.Clearenv() os.Setenv("VERSION", version) - info, err := Parse(strings.NewReader("name: foo\nversion: $VERSION")) + info, err := nfpm.Parse(strings.NewReader("name: foo\nversion: $VERSION")) require.NoError(t, err) assert.Equal(t, version, info.Version) }) @@ -171,7 +198,7 @@ func TestOptionsFromEnvironment(t *testing.T) { t.Run("release", func(t *testing.T) { os.Clearenv() os.Setenv("RELEASE", release) - info, err := Parse(strings.NewReader("name: foo\nrelease: $RELEASE")) + info, err := nfpm.Parse(strings.NewReader("name: foo\nrelease: $RELEASE")) require.NoError(t, err) assert.Equal(t, release, info.Release) }) @@ -179,7 +206,7 @@ func TestOptionsFromEnvironment(t *testing.T) { t.Run("global passphrase", func(t *testing.T) { os.Clearenv() os.Setenv("NFPM_PASSPHRASE", globalPass) - info, err := Parse(strings.NewReader("name: foo")) + info, err := nfpm.Parse(strings.NewReader("name: foo")) require.NoError(t, err) assert.Equal(t, globalPass, info.Deb.Signature.KeyPassphrase) assert.Equal(t, globalPass, info.RPM.Signature.KeyPassphrase) @@ -192,7 +219,7 @@ func TestOptionsFromEnvironment(t *testing.T) { os.Setenv("NFPM_DEB_PASSPHRASE", debPass) os.Setenv("NFPM_RPM_PASSPHRASE", rpmPass) os.Setenv("NFPM_APK_PASSPHRASE", apkPass) - info, err := Parse(strings.NewReader("name: foo")) + info, err := nfpm.Parse(strings.NewReader("name: foo")) require.NoError(t, err) assert.Equal(t, debPass, info.Deb.Signature.KeyPassphrase) assert.Equal(t, rpmPass, info.RPM.Signature.KeyPassphrase) @@ -202,7 +229,7 @@ func TestOptionsFromEnvironment(t *testing.T) { func TestOverrides(t *testing.T) { file := "./testdata/overrides.yaml" - config, err := ParseFile(file) + config, err := nfpm.ParseFile(file) require.NoError(t, err) assert.Equal(t, "foo", config.Name) assert.Equal(t, "amd64", config.Arch) @@ -212,9 +239,17 @@ func TestOverrides(t *testing.T) { require.NoError(t, err) assert.Contains(t, deb.Depends, "deb_depend") assert.NotContains(t, deb.Depends, "rpm_depend") - assert.Contains(t, deb.ConfigFiles, "deb.conf") - assert.NotContains(t, deb.ConfigFiles, "rpm.conf") - assert.Contains(t, deb.ConfigFiles, "whatever.conf") + for _, f := range deb.Contents { + fmt.Printf("%+#v\n", f) + assert.True(t, f.Packager != "rpm") + assert.True(t, f.Packager != "apk") + if f.Packager == "deb" { + assert.Contains(t, f.Destination, "/deb") + } + if f.Packager == "" { + assert.True(t, f.Destination == "/etc/foo/whatever.conf") + } + } assert.Equal(t, "amd64", deb.Arch) // rpm overrides @@ -222,9 +257,17 @@ func TestOverrides(t *testing.T) { require.NoError(t, err) assert.Contains(t, rpm.Depends, "rpm_depend") assert.NotContains(t, rpm.Depends, "deb_depend") - assert.Contains(t, rpm.ConfigFiles, "rpm.conf") - assert.NotContains(t, rpm.ConfigFiles, "deb.conf") - assert.Contains(t, rpm.ConfigFiles, "whatever.conf") + for _, f := range rpm.Contents { + fmt.Printf("%+#v\n", f) + assert.True(t, f.Packager != "deb") + assert.True(t, f.Packager != "apk") + if f.Packager == "rpm" { + assert.Contains(t, f.Destination, "/rpm") + } + if f.Packager == "" { + assert.True(t, f.Destination == "/etc/foo/whatever.conf") + } + } assert.Equal(t, "amd64", rpm.Arch) // no overrides @@ -235,10 +278,10 @@ func TestOverrides(t *testing.T) { type fakePackager struct{} -func (*fakePackager) ConventionalFileName(info *Info) string { +func (*fakePackager) ConventionalFileName(info *nfpm.Info) string { return "" } -func (*fakePackager) Package(info *Info, w io.Writer) error { +func (*fakePackager) Package(info *nfpm.Info, w io.Writer) error { return nil } diff --git a/rpm/rpm.go b/rpm/rpm.go index 67b748c7..fa694de4 100644 --- a/rpm/rpm.go +++ b/rpm/rpm.go @@ -15,7 +15,7 @@ import ( "github.com/google/rpmpack" "github.com/sassoftware/go-rpmutils/cpio" - "github.com/goreleaser/nfpm/internal/files" + "github.com/goreleaser/nfpm/files" "github.com/goreleaser/nfpm/internal/sign" "github.com/goreleaser/chglog" @@ -39,9 +39,11 @@ const ( {{- end}}{{- end}}` ) +const packagerName = "rpm" + // nolint: gochecknoinits func init() { - nfpm.Register("rpm", Default) + nfpm.RegisterPackager(packagerName, Default) } // Default RPM packager. @@ -83,13 +85,15 @@ func (*RPM) ConventionalFileName(info *nfpm.Info) string { } // Package writes a new RPM package to the given writer using the given info. -func (*RPM) Package(info *nfpm.Info, w io.Writer) error { +func (*RPM) Package(info *nfpm.Info, w io.Writer) (err error) { var ( - err error meta *rpmpack.RPMMetaData rpm *rpmpack.RPM ) info = ensureValidArch(info) + if err = info.Validate(); err != nil { + return err + } if meta, err = buildRPMMeta(info); err != nil { return err @@ -107,8 +111,6 @@ func (*RPM) Package(info *nfpm.Info, w io.Writer) error { return err } - addSymlinksInsideRPM(info, rpm) - if err = addScriptFiles(info, rpm); err != nil { return err } @@ -313,93 +315,73 @@ func addEmptyDirsRPM(info *nfpm.Info, rpm *rpmpack.RPM) { } } -func createFilesInsideRPM(info *nfpm.Info, rpm *rpmpack.RPM) error { - regularFiles, err := files.Expand(info.Files, info.DisableGlobbing) - if err != nil { - return err - } - - for _, file := range regularFiles { - err = copyToRPM(rpm, file.Source, file.Destination, rpmpack.GenericFile) - if err != nil { - return err +func createFilesInsideRPM(info *nfpm.Info, rpm *rpmpack.RPM) (err error) { + var symlinks files.Contents + for _, file := range info.Contents { + if file.Packager != "" && file.Packager != packagerName { + continue } - } - - configFiles, err := files.Expand(info.ConfigFiles, info.DisableGlobbing) - if err != nil { - return err - } - for _, file := range configFiles { - err = copyToRPM(rpm, file.Source, file.Destination, rpmpack.ConfigFile) - if err != nil { - return err + var rpmFileType rpmpack.FileType + switch file.Type { + case "config": + rpmFileType = rpmpack.ConfigFile + case "config|noreplace": + rpmFileType = rpmpack.ConfigFile | rpmpack.NoReplaceFile + case "ghost": + rpmFileType = rpmpack.GhostFile + if file.FileInfo.Mode == 0 { + file.FileInfo.Mode = os.FileMode(0644) + } + case "doc": + rpmFileType = rpmpack.DocFile + case "licence", "license": + rpmFileType = rpmpack.LicenceFile + case "readme": + rpmFileType = rpmpack.ReadmeFile + case "symlink": + symlinks = append(symlinks, file) + continue + default: + rpmFileType = rpmpack.GenericFile } - } - - configNoReplaceFiles, err := files.Expand(info.RPM.ConfigNoReplaceFiles, info.DisableGlobbing) - if err != nil { - return err - } - for _, file := range configNoReplaceFiles { - err = copyToRPM(rpm, file.Source, file.Destination, rpmpack.ConfigFile|rpmpack.NoReplaceFile) - if err != nil { + if err = copyToRPM(rpm, file, rpmFileType); err != nil { return err } } - // note: the ghost files will be created as empty files when the package is installed, which is not - // correct: https://github.com/google/rpmpack/issues/51 - for _, destName := range info.RPM.GhostFiles { - rpm.AddFile(rpmpack.RPMFile{ - Name: destName, - Mode: 0644, - MTime: uint32(time.Now().UTC().Unix()), - Owner: "root", - Group: "root", - Type: rpmpack.GhostFile, - }) - } + addSymlinksInsideRPM(symlinks, rpm) return nil } -func addSymlinksInsideRPM(info *nfpm.Info, rpm *rpmpack.RPM) { - for src, dst := range info.Symlinks { +func addSymlinksInsideRPM(symlinks files.Contents, rpm *rpmpack.RPM) { + for _, file := range symlinks { rpm.AddFile(rpmpack.RPMFile{ - Name: src, - Body: []byte(dst), + Name: file.Destination, + Body: []byte(file.Source), Mode: uint(cpio.S_ISLNK), - MTime: uint32(time.Now().UTC().Unix()), - Owner: "root", - Group: "root", + MTime: uint32(file.FileInfo.MTime.Unix()), + Owner: file.FileInfo.Owner, + Group: file.FileInfo.Group, }) } } -func copyToRPM(rpm *rpmpack.RPM, src, dst string, fileType rpmpack.FileType) error { - info, err := os.Stat(src) - if err != nil { - return err - } - if info.IsDir() { - // TODO: this should probably return an error - return nil - } - data, err := ioutil.ReadFile(src) - if err != nil { +func copyToRPM(rpm *rpmpack.RPM, file *files.Content, fileType rpmpack.FileType) (err error) { + data, err := ioutil.ReadFile(file.Source) + if err != nil && file.Type != "ghost" { return err } rpm.AddFile(rpmpack.RPMFile{ - Name: dst, + Name: file.Destination, Body: data, - Mode: uint(info.Mode()), - MTime: uint32(info.ModTime().Unix()), - Owner: "root", - Group: "root", + Mode: uint(file.FileInfo.Mode), + MTime: uint32(file.FileInfo.MTime.Unix()), + Owner: file.FileInfo.Owner, + Group: file.FileInfo.Group, Type: fileType, }) diff --git a/rpm/rpm_test.go b/rpm/rpm_test.go index 66084bc9..a3ddfd24 100644 --- a/rpm/rpm_test.go +++ b/rpm/rpm_test.go @@ -13,16 +13,15 @@ import ( "testing" "time" + "github.com/goreleaser/chglog" "github.com/sassoftware/go-rpmutils" "github.com/sassoftware/go-rpmutils/cpio" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "golang.org/x/crypto/openpgp" - "github.com/goreleaser/chglog" - "github.com/goreleaser/nfpm" - "github.com/goreleaser/nfpm/internal/files" + "github.com/goreleaser/nfpm/files" ) func exampleInfo() *nfpm.Info { diff --git a/testdata/contents.yaml b/testdata/contents.yaml new file mode 100644 index 00000000..057ff917 --- /dev/null +++ b/testdata/contents.yaml @@ -0,0 +1,27 @@ +name: "contents foo" +arch: "amd64" +version: "v1.2.3" +contents: + - src: "./testdata/*.conf" + dst: "/etc/foo/" + type: "config|noreplace" + file_info: + mode: 0644 + - src: "./testdata/whatever2.conf" + dst: "/etc/rpm/whatever.conf" + type: "config|noreplace" + file_info: + mode: 0644 + packager: "rpm" + - src: "./testdata/whatever2.conf" + dst: "/etc/apk/whatever.conf" + type: "config|noreplace" + file_info: + mode: 0644 + packager: "apk" + - src: "./testdata/whatever2.conf" + dst: "/etc/deb/whatever.conf" + type: "config|noreplace" + file_info: + mode: 0644 + packager: "deb" \ No newline at end of file diff --git a/testdata/contents_glob.yaml b/testdata/contents_glob.yaml new file mode 100644 index 00000000..5a708721 --- /dev/null +++ b/testdata/contents_glob.yaml @@ -0,0 +1,10 @@ +# Configuration file used to unit test enhanced file map +name: "foo" +arch: "amd64" +version: "v1.2.3" +contents: + # These two should be a single glob `./testdata/globtest/**/*.txt` + - src: "./testdata/globtest/**/*.txt" + dst: "/etc/foo/" + - src: "./testdata/globtest/*.txt" + dst: "/etc/foo/" \ No newline at end of file diff --git a/acceptance/testdata/folder/file1 b/testdata/globtest/a.txt similarity index 100% rename from acceptance/testdata/folder/file1 rename to testdata/globtest/a.txt diff --git a/acceptance/testdata/folder/file2 b/testdata/globtest/multi-nested/subdir/c.txt similarity index 100% rename from acceptance/testdata/folder/file2 rename to testdata/globtest/multi-nested/subdir/c.txt diff --git a/acceptance/testdata/folder/folder2/file1 b/testdata/globtest/nested/b.txt similarity index 100% rename from acceptance/testdata/folder/folder2/file1 rename to testdata/globtest/nested/b.txt