diff --git a/nfpm.go b/nfpm.go index da20ba26..f46d2916 100644 --- a/nfpm.go +++ b/nfpm.go @@ -336,6 +336,7 @@ type RPM struct { Compression string `yaml:"compression,omitempty" json:"compression,omitempty" jsonschema:"title=compression algorithm to be used,enum=gzip,enum=lzma,enum=xz,default=gzip:-1"` Signature RPMSignature `yaml:"signature,omitempty" json:"signature,omitempty" jsonschema:"title=rpm signature"` Packager string `yaml:"packager,omitempty" json:"packager,omitempty" jsonschema:"title=organization that actually packaged the software"` + Prefixes []string `yaml:"prefixes,omitempty" json:"prefixes,omitempty" jsonschema:"title=Prefixes for relocatable packages"` } // RPMScripts represents scripts only available on RPM packages. diff --git a/rpm/rpm.go b/rpm/rpm.go index 9c5c6254..1da8bc71 100644 --- a/rpm/rpm.go +++ b/rpm/rpm.go @@ -240,6 +240,7 @@ func buildRPMMeta(info *nfpm.Info) (*rpmpack.RPMMetaData, error) { URL: info.Homepage, Vendor: info.Vendor, Packager: defaultTo(info.RPM.Packager, info.Maintainer), + Prefixes: info.RPM.Prefixes, Group: info.RPM.Group, Provides: provides, Recommends: recommends, diff --git a/rpm/rpm_test.go b/rpm/rpm_test.go index 84e803a2..6b403e9d 100644 --- a/rpm/rpm_test.go +++ b/rpm/rpm_test.go @@ -77,6 +77,7 @@ func exampleInfo() *nfpm.Info { PostRemove: "../testdata/scripts/postremove.sh", }, RPM: nfpm.RPM{ + Prefixes: []string{"/opt"}, Scripts: nfpm.RPMScripts{ PreTrans: "../testdata/scripts/pretrans.sh", PostTrans: "../testdata/scripts/posttrans.sh", diff --git a/testdata/acceptance/core.complex.yaml b/testdata/acceptance/core.complex.yaml index 3b15e660..76330fc9 100644 --- a/testdata/acceptance/core.complex.yaml +++ b/testdata/acceptance/core.complex.yaml @@ -4,15 +4,15 @@ platform: "linux" version: "v1.2.3-beta" maintainer: "Foo Bar" depends: -- bash + - bash provides: -- fake + - fake recommends: -- fish + - fish replaces: -- foo + - foo suggests: -- zsh + - zsh description: | Foo bar Multiple lines @@ -20,47 +20,47 @@ vendor: "foobar" homepage: "https://foobar.org" license: "MIT" contents: -- src: ./testdata/fake - dst: /usr/bin/fake -- src: ./testdata/acceptance/folder/* - dst: /usr/share/whatever/folder -- src: ./testdata/whatever.conf - dst: /etc/foo/whatever.conf - type: config -- src: ./testdata/something - dst: /etc/something -- dst: /usr/foo/bar/something - type: dir -- dst: /var/log/whatever - type: dir -- dst: /usr/share/foo - type: dir + - src: ./testdata/fake + dst: /usr/bin/fake + - src: ./testdata/acceptance/folder/* + dst: /usr/share/whatever/folder + - src: ./testdata/whatever.conf + dst: /etc/foo/whatever.conf + type: config + - src: ./testdata/something + dst: /etc/something + - dst: /usr/foo/bar/something + type: dir + - dst: /var/log/whatever + type: dir + - dst: /usr/share/foo + type: dir -# Packager specifics: + # Packager specifics: -- packager: deb - src: ./testdata/fake - dst: /usr/bin/fake2 - file_info: - mode: 04755 + - packager: deb + src: ./testdata/fake + dst: /usr/bin/fake2 + file_info: + mode: 04755 -- packager: rpm - src: ./testdata/fake - dst: /usr/bin/fake2 - file_info: - mode: 04755 + - packager: rpm + src: ./testdata/fake + dst: /usr/bin/fake2 + file_info: + mode: 04755 -- packager: apk - src: ./testdata/fake - dst: /usr/bin/fake2 - file_info: - mode: 04755 + - packager: apk + src: ./testdata/fake + dst: /usr/bin/fake2 + file_info: + mode: 04755 -- packager: archlinux - src: ./testdata/fake - dst: /usr/bin/fake2 - file_info: - mode: 04755 + - packager: archlinux + src: ./testdata/fake + dst: /usr/bin/fake2 + file_info: + mode: 04755 scripts: preinstall: ./testdata/acceptance/scripts/preinstall.sh @@ -68,6 +68,7 @@ scripts: preremove: ./testdata/acceptance/scripts/preremove.sh postremove: ./testdata/acceptance/scripts/postremove.sh rpm: + prefixes: ["/usr/bin"] scripts: pretrans: ./testdata/acceptance/scripts/pretrans.sh posttrans: ./testdata/acceptance/scripts/posttrans.sh diff --git a/testdata/acceptance/rpm.dockerfile b/testdata/acceptance/rpm.dockerfile index 837f8795..5f517f71 100644 --- a/testdata/acceptance/rpm.dockerfile +++ b/testdata/acceptance/rpm.dockerfile @@ -35,11 +35,12 @@ RUN test -f /usr/share/whatever/folder2/file2 # ---- complex test ---- -FROM min AS complex +FROM test_base AS complex +RUN rpm --prefix=/opt -ivh /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 test -e /usr/bin/fake +RUN test -e /opt/fake RUN test -f /etc/foo/whatever.conf RUN test -d /usr/share/whatever/folder RUN test -f /usr/share/whatever/folder/file1 @@ -55,7 +56,7 @@ RUN test -f /etc/something/a RUN test -f /etc/something/b RUN test -d /etc/something/c RUN test -f /etc/something/c/d -RUN test $(stat -c %a /usr/bin/fake2) -eq 4755 +RUN test $(stat -c %a /opt/fake2) -eq 4755 RUN test -f /tmp/preinstall-proof RUN test -f /tmp/postinstall-proof RUN test -f /tmp/pretrans-proof @@ -65,8 +66,8 @@ 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/bin/fake -RUN test ! -f /usr/bin/fake2 +RUN test ! -f /opt/fake +RUN test ! -f /opt/fake2 RUN test -f /tmp/preremove-proof RUN test -f /tmp/postremove-proof RUN test ! -d /var/log/whatever diff --git a/www/docs/configuration.md b/www/docs/configuration.md index f942b207..7c89b470 100644 --- a/www/docs/configuration.md +++ b/www/docs/configuration.md @@ -326,6 +326,10 @@ rpm: # Compression algorithm (gzip (default), zstd, lzma or xz). compression: zstd + # Prefixes for relocatable packages. + prefixes: + - /usr/bin + # The package is signed if a key_file is set signature: # PGP secret key (can also be ASCII-armored), the passphrase is taken