From d5151a6eb09eec5699e0db4222fbd33d1bf8cf20 Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Thu, 2 Mar 2023 14:35:55 -0300 Subject: [PATCH] feat: ConventionalExtension on nFPM (#3822) closes #3799 --------- Signed-off-by: Carlos A Becker --- internal/pipe/nfpm/nfpm.go | 17 ++++++------ internal/pipe/nfpm/nfpm_test.go | 43 +++++++++++++++++++++++++++++ www/docs/customization/templates.md | 9 +++--- 3 files changed, 57 insertions(+), 12 deletions(-) diff --git a/internal/pipe/nfpm/nfpm.go b/internal/pipe/nfpm/nfpm.go index fa69acc9d..ed22c4903 100644 --- a/internal/pipe/nfpm/nfpm.go +++ b/internal/pipe/nfpm/nfpm.go @@ -396,14 +396,6 @@ func create(ctx *context.Context, fpm config.NFPM, format string, binaries []*ar return err } - info = nfpm.WithDefaults(info) - name, err := t.WithExtraFields(tmpl.Fields{ - "ConventionalFileName": packager.ConventionalFileName(info), - }).Apply(overridden.FileNameTemplate) - if err != nil { - return err - } - ext := "." + format if packager, ok := packager.(nfpm.PackagerWithExtension); ok { if format != "termux.deb" { @@ -411,6 +403,15 @@ func create(ctx *context.Context, fpm config.NFPM, format string, binaries []*ar } } + info = nfpm.WithDefaults(info) + name, err := t.WithExtraFields(tmpl.Fields{ + "ConventionalFileName": packager.ConventionalFileName(info), + "ConventionalExtension": ext, + }).Apply(overridden.FileNameTemplate) + if err != nil { + return err + } + if !strings.HasSuffix(name, ext) { name = name + ext } diff --git a/internal/pipe/nfpm/nfpm_test.go b/internal/pipe/nfpm/nfpm_test.go index 857acdcdc..06daa4d2f 100644 --- a/internal/pipe/nfpm/nfpm_test.go +++ b/internal/pipe/nfpm/nfpm_test.go @@ -1429,6 +1429,49 @@ func TestSkip(t *testing.T) { }) } +func TestTemplateExt(t *testing.T) { + ctx := testctx.NewWithCfg(config.Project{ + Dist: t.TempDir(), + NFPMs: []config.NFPM{ + { + NFPMOverridables: config.NFPMOverridables{ + FileNameTemplate: "a_{{ .ConventionalExtension }}_b", + PackageName: "foo", + }, + Meta: true, + Maintainer: "foo@bar", + Formats: []string{"deb", "rpm", "termux.deb", "apk", "archlinux"}, + Builds: []string{"default"}, + }, + }, + }) + ctx.Artifacts.Add(&artifact.Artifact{ + Name: "mybin", + Goos: "linux", + Goarch: "amd64", + Type: artifact.Binary, + Extra: map[string]interface{}{ + artifact.ExtraID: "default", + }, + }) + require.NoError(t, Pipe{}.Run(ctx)) + + packages := ctx.Artifacts.Filter(artifact.ByType(artifact.LinuxPackage)).List() + require.Len(t, packages, 5) + names := make([]string, 0, 5) + for _, p := range packages { + names = append(names, p.Name) + } + + require.ElementsMatch(t, []string{ + "a_.apk_b.apk", + "a_.deb_b.deb", + "a_.rpm_b.rpm", + "a_.termux.deb_b.termux.deb", + "a_.pkg.tar.zst_b.pkg.tar.zst", + }, names) +} + func sources(contents files.Contents) []string { result := make([]string, 0, len(contents)) for _, f := range contents { diff --git a/www/docs/customization/templates.md b/www/docs/customization/templates.md index 9542d443f..3c6c3b49a 100644 --- a/www/docs/customization/templates.md +++ b/www/docs/customization/templates.md @@ -109,10 +109,11 @@ On the nFPM name template field, you can use those extra fields as well: Key |Description -----------------------|-------------------------------------------------------------- -`.Release` |release from the nfpm config -`.Epoch` |epoch from the nfpm config -`.PackageName` |package the name. Same as `ProjectName` if not overridden. -`.ConventionalFileName`|conventional package file name as provided by nFPM[^arm-names] +`.Release` |release from the nfpm config +`.Epoch` |epoch from the nfpm config +`.PackageName` |package the name. Same as `ProjectName` if not overridden. +`.ConventionalFileName` |conventional package file name as provided by nFPM.[^arm-names] +`.ConventionalExtension`|conventional package extension as provided by nFPM. Since v1.16. [^arm-names]: Please beware: some OSs might have the same names for different ARM versions, for example, for Debian both ARMv6 and ARMv7 are called `armhf`.