1
1
Fork 0
mirror of https://github.com/goreleaser/nfpm synced 2024-06-19 02:09:05 +02:00
nfpm/rpm/rpm.go

164 lines
3.1 KiB
Go
Raw Normal View History

2018-02-19 14:37:30 +01:00
// Package rpm implements nfpm.Packager providing .rpm bindings through rpmbuild.
2018-02-03 20:42:56 +01:00
package rpm
import (
"io"
"io/ioutil"
"os"
2018-02-05 00:00:20 +01:00
"strings"
2018-02-03 20:42:56 +01:00
"github.com/google/rpmpack"
2018-02-05 02:53:22 +01:00
"github.com/goreleaser/nfpm"
"github.com/goreleaser/nfpm/glob"
2018-02-12 17:09:59 +01:00
"github.com/pkg/errors"
2018-02-03 20:42:56 +01:00
)
2019-03-04 14:14:05 +01:00
// nolint: gochecknoinits
2018-02-12 16:50:25 +01:00
func init() {
nfpm.Register("rpm", Default)
}
2018-02-03 20:42:56 +01:00
2019-08-30 03:05:25 +02:00
// Default RPM packager
2019-03-04 14:14:05 +01:00
// nolint: gochecknoglobals
2018-02-03 20:42:56 +01:00
var Default = &RPM{}
// RPM is a RPM packager implementation
type RPM struct{}
2019-03-20 01:48:14 +01:00
// nolint: gochecknoglobals
2019-03-20 01:34:06 +01:00
var archToRPM = map[string]string{
"amd64": "x86_64",
"386": "i386",
"arm64": "aarch64",
}
func ensureValidArch(info nfpm.Info) nfpm.Info {
2019-03-20 01:34:06 +01:00
arch, ok := archToRPM[info.Arch]
if ok {
info.Arch = arch
}
return info
}
// Package writes a new RPM package to the given writer using the given info
func (*RPM) Package(info nfpm.Info, w io.Writer) error {
info = ensureValidArch(info)
err := nfpm.Validate(info)
if err != nil {
return err
2018-02-03 20:42:56 +01:00
}
vInfo := strings.SplitN(info.Version, "-", 1)
vInfo = append(vInfo, "")
rpm, err := rpmpack.NewRPM(rpmpack.RPMMetaData{
Name: info.Name,
Version: vInfo[0],
Release: vInfo[1],
Arch: info.Arch,
})
if err != nil {
return err
}
2018-03-06 01:02:26 +01:00
if err = createFilesInsideRPM(info, rpm); err != nil {
return err
}
if err = addScriptFiles(info, rpm); err != nil {
return err
}
2018-04-08 23:37:25 +02:00
if err = rpm.Write(w); err != nil {
2018-04-08 23:37:25 +02:00
return err
}
2018-02-18 21:13:47 +01:00
return nil
2018-02-06 03:28:30 +01:00
}
func addScriptFiles(info nfpm.Info, rpm *rpmpack.RPM) error {
if info.Scripts.PreInstall != "" {
data, err := ioutil.ReadFile(info.Scripts.PreInstall)
if err != nil {
return err
2018-04-08 23:37:25 +02:00
}
rpm.AddPrein(string(data))
2018-04-08 23:37:25 +02:00
}
if info.Scripts.PreRemove != "" {
data, err := ioutil.ReadFile(info.Scripts.PreRemove)
if err != nil {
return err
}
rpm.AddPreun(string(data))
2018-02-16 02:58:37 +01:00
}
if info.Scripts.PostInstall != "" {
data, err := ioutil.ReadFile(info.Scripts.PostInstall)
if err != nil {
return err
}
rpm.AddPostin(string(data))
2018-02-16 02:58:37 +01:00
}
if info.Scripts.PostRemove != "" {
data, err := ioutil.ReadFile(info.Scripts.PostInstall)
if err != nil {
return err
2018-02-06 03:28:30 +01:00
}
rpm.AddPostun(string(data))
2018-02-06 03:28:30 +01:00
}
2018-02-06 03:28:30 +01:00
return nil
}
func createFilesInsideRPM(info nfpm.Info, rpm *rpmpack.RPM) error {
for _, files := range []map[string]string{
info.Files,
info.ConfigFiles,
} {
for srcglob, dstroot := range files {
globbed, err := glob.Glob(srcglob, dstroot)
if err != nil {
2018-02-16 03:12:54 +01:00
return err
2018-02-06 03:28:30 +01:00
}
for src, dst := range globbed {
err := copyToRPM(rpm, src, dst)
if err != nil {
return err
}
}
2018-02-06 03:28:30 +01:00
}
}
2018-02-16 02:58:37 +01:00
return nil
2018-02-06 03:28:30 +01:00
}
func copyToRPM(rpm *rpmpack.RPM, src, dst string) error {
file, err := os.OpenFile(src, os.O_RDONLY, 0600) //nolint:gosec
2018-02-16 03:12:54 +01:00
if err != nil {
return errors.Wrap(err, "could not add file to the archive")
}
// don't care if it errs while closing...
2018-02-16 03:12:54 +01:00
defer file.Close() // nolint: errcheck
info, err := file.Stat()
if err != nil {
return err
}
if info.IsDir() {
// TODO: this should probably return an error
2018-02-16 03:12:54 +01:00
return nil
}
data, err := ioutil.ReadAll(file)
if err != nil {
return err
2018-02-16 03:12:54 +01:00
}
2018-02-03 20:42:56 +01:00
rpm.AddFile(
rpmpack.RPMFile{
Name: dst,
Body: data,
Mode: uint(info.Mode()),
})
2018-02-03 20:42:56 +01:00
return nil
}