mirror of
https://github.com/webinstall/webi-installers.git
synced 2026-04-06 18:36:50 +00:00
Classifier fixes:
- Remove Windows arm→arm64 auto-promotion; packages like caddy/fzf/goreleaser
have genuine arm32 Windows builds (windows_armv6) that were wrongly promoted
- Add armel and gnueabihf as ARMv6 aliases (jq, caddy and others use these)
- Add winx64 to Windows OS pattern (MariaDB uses winx64 in filenames)
- Add ppc64el as ppc64le alias (Debian/Ubuntu naming, used by jq)
- Normalize armv6l → armv6 in normalizeGoArch (Go dist had armv6l filenames)
- Fix classifyGPGDist hardcoded "amd64" → buildmeta.ArchAMD64 ("x86_64")
Legacy export fixes:
- Map solaris/illumos → sunos globally (Node.js only knows "sunos")
- Expand universal2 → two entries (aarch64 + x86_64) so Hugo/cmake/gh/syncthing
work on both Apple Silicon and Intel Mac in the legacy resolver
- Remove double-application of legacyFieldBackport (toLegacy no longer calls it)
337 lines
7.8 KiB
Go
337 lines
7.8 KiB
Go
package classify_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/webinstall/webi-installers/internal/buildmeta"
|
|
"github.com/webinstall/webi-installers/internal/classify"
|
|
)
|
|
|
|
func TestFilename(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
input string
|
|
wantOS buildmeta.OS
|
|
arch buildmeta.Arch
|
|
libc buildmeta.Libc
|
|
format buildmeta.Format
|
|
}{
|
|
// Goreleaser-style
|
|
{
|
|
name: "goreleaser linux amd64 tar.gz",
|
|
input: "hugo_0.145.0_linux-amd64.tar.gz",
|
|
wantOS: buildmeta.OSLinux,
|
|
arch: buildmeta.ArchAMD64,
|
|
format: buildmeta.FormatTarGz,
|
|
},
|
|
{
|
|
name: "goreleaser darwin arm64 tar.gz",
|
|
input: "hugo_0.145.0_darwin-arm64.tar.gz",
|
|
wantOS: buildmeta.OSDarwin,
|
|
arch: buildmeta.ArchARM64,
|
|
format: buildmeta.FormatTarGz,
|
|
},
|
|
{
|
|
name: "goreleaser windows amd64 zip",
|
|
input: "hugo_0.145.0_windows-amd64.zip",
|
|
wantOS: buildmeta.OSWindows,
|
|
arch: buildmeta.ArchAMD64,
|
|
format: buildmeta.FormatZip,
|
|
},
|
|
{
|
|
name: "goreleaser freebsd",
|
|
input: "hugo_0.145.0_freebsd-amd64.tar.gz",
|
|
wantOS: buildmeta.OSFreeBSD,
|
|
arch: buildmeta.ArchAMD64,
|
|
format: buildmeta.FormatTarGz,
|
|
},
|
|
|
|
// Rust/cargo-dist style
|
|
{
|
|
name: "rust linux musl",
|
|
input: "ripgrep-14.1.1-x86_64-unknown-linux-musl.tar.gz",
|
|
wantOS: buildmeta.OSLinux,
|
|
arch: buildmeta.ArchAMD64,
|
|
libc: buildmeta.LibcMusl,
|
|
format: buildmeta.FormatTarGz,
|
|
},
|
|
{
|
|
name: "rust linux gnu",
|
|
input: "bat-v0.24.0-x86_64-unknown-linux-gnu.tar.gz",
|
|
wantOS: buildmeta.OSLinux,
|
|
arch: buildmeta.ArchAMD64,
|
|
libc: buildmeta.LibcGNU,
|
|
format: buildmeta.FormatTarGz,
|
|
},
|
|
{
|
|
name: "rust apple darwin",
|
|
input: "ripgrep-14.1.1-x86_64-apple-darwin.tar.gz",
|
|
wantOS: buildmeta.OSDarwin,
|
|
arch: buildmeta.ArchAMD64,
|
|
format: buildmeta.FormatTarGz,
|
|
},
|
|
{
|
|
name: "rust windows msvc",
|
|
input: "bat-v0.24.0-x86_64-pc-windows-msvc.zip",
|
|
wantOS: buildmeta.OSWindows,
|
|
arch: buildmeta.ArchAMD64,
|
|
libc: buildmeta.LibcMSVC,
|
|
format: buildmeta.FormatZip,
|
|
},
|
|
{
|
|
name: "rust aarch64 linux",
|
|
input: "ripgrep-14.1.1-aarch64-unknown-linux-gnu.tar.gz",
|
|
wantOS: buildmeta.OSLinux,
|
|
arch: buildmeta.ArchARM64,
|
|
libc: buildmeta.LibcGNU,
|
|
format: buildmeta.FormatTarGz,
|
|
},
|
|
|
|
// Zig-style
|
|
{
|
|
name: "zig linux x86_64",
|
|
input: "zig-linux-x86_64-0.14.0.tar.xz",
|
|
wantOS: buildmeta.OSLinux,
|
|
arch: buildmeta.ArchAMD64,
|
|
format: buildmeta.FormatTarXz,
|
|
},
|
|
{
|
|
name: "zig macos aarch64",
|
|
input: "zig-macos-aarch64-0.14.0.tar.xz",
|
|
wantOS: buildmeta.OSDarwin,
|
|
arch: buildmeta.ArchARM64,
|
|
format: buildmeta.FormatTarXz,
|
|
},
|
|
|
|
// Windows executables
|
|
{
|
|
name: "bare exe",
|
|
input: "jq-windows-amd64.exe",
|
|
wantOS: buildmeta.OSWindows,
|
|
arch: buildmeta.ArchAMD64,
|
|
format: buildmeta.FormatExe,
|
|
},
|
|
{
|
|
name: "msi installer",
|
|
input: "caddy_2.9.0_windows_amd64.msi",
|
|
wantOS: buildmeta.OSWindows,
|
|
arch: buildmeta.ArchAMD64,
|
|
format: buildmeta.FormatMSI,
|
|
},
|
|
|
|
// macOS formats
|
|
{
|
|
name: "dmg installer",
|
|
input: "MyApp-1.0.0-darwin-arm64.dmg",
|
|
wantOS: buildmeta.OSDarwin,
|
|
arch: buildmeta.ArchARM64,
|
|
format: buildmeta.FormatDMG,
|
|
},
|
|
|
|
// Arch priority: x86_64 must not match x86
|
|
{
|
|
name: "x86_64 not x86",
|
|
input: "tool-x86_64-linux.tar.gz",
|
|
wantOS: buildmeta.OSLinux,
|
|
arch: buildmeta.ArchAMD64,
|
|
format: buildmeta.FormatTarGz,
|
|
},
|
|
{
|
|
name: "actual x86",
|
|
input: "tool-x86-linux.tar.gz",
|
|
wantOS: buildmeta.OSLinux,
|
|
arch: buildmeta.ArchX86,
|
|
format: buildmeta.FormatTarGz,
|
|
},
|
|
{
|
|
name: "i386",
|
|
input: "tool-linux-i386.tar.gz",
|
|
wantOS: buildmeta.OSLinux,
|
|
arch: buildmeta.ArchX86,
|
|
format: buildmeta.FormatTarGz,
|
|
},
|
|
|
|
// Windows ARM: bare "arm" is armv6 (some tools ship genuine arm32 Windows builds).
|
|
// Explicit "arm64" is always aarch64 regardless of OS.
|
|
{
|
|
name: "windows bare arm stays armv6",
|
|
input: "tool-1.0.0-windows-arm.zip",
|
|
wantOS: buildmeta.OSWindows,
|
|
arch: buildmeta.ArchARMv6,
|
|
format: buildmeta.FormatZip,
|
|
},
|
|
{
|
|
name: "windows armv6 stays armv6",
|
|
input: "tool-2.0.0-windows-armv6.zip",
|
|
wantOS: buildmeta.OSWindows,
|
|
arch: buildmeta.ArchARMv6,
|
|
format: buildmeta.FormatZip,
|
|
},
|
|
{
|
|
name: "windows arm64 stays arm64",
|
|
input: "tool-1.0.0-windows-arm64.zip",
|
|
wantOS: buildmeta.OSWindows,
|
|
arch: buildmeta.ArchARM64,
|
|
format: buildmeta.FormatZip,
|
|
},
|
|
|
|
// armel and gnueabihf are ARMv6 ABI names
|
|
{
|
|
name: "armel is armv6",
|
|
input: "jq-linux-armel",
|
|
wantOS: buildmeta.OSLinux,
|
|
arch: buildmeta.ArchARMv6,
|
|
},
|
|
{
|
|
name: "gnueabihf is armv6",
|
|
input: "tool-arm-unknown-linux-gnueabihf.tar.gz",
|
|
wantOS: buildmeta.OSLinux,
|
|
arch: buildmeta.ArchARMv6,
|
|
format: buildmeta.FormatTarGz,
|
|
},
|
|
|
|
// winx64 is a Windows x86_64 naming used by MariaDB
|
|
{
|
|
name: "winx64 is windows x86_64",
|
|
input: "mariadb-11.4.5-winx64.zip",
|
|
wantOS: buildmeta.OSWindows,
|
|
arch: buildmeta.ArchAMD64,
|
|
format: buildmeta.FormatZip,
|
|
},
|
|
|
|
// ppc64el is a Debian/Ubuntu alias for ppc64le
|
|
{
|
|
name: "ppc64el is ppc64le",
|
|
input: "jq-linux-ppc64el",
|
|
arch: buildmeta.ArchPPC64LE,
|
|
},
|
|
|
|
// amd64 micro-architecture levels
|
|
{
|
|
name: "amd64v2",
|
|
input: "tool-linux-amd64v2.tar.gz",
|
|
arch: buildmeta.ArchAMD64v2,
|
|
},
|
|
{
|
|
name: "amd64v3",
|
|
input: "tool-linux-x86_64_v3.tar.gz",
|
|
arch: buildmeta.ArchAMD64v3,
|
|
},
|
|
{
|
|
name: "amd64v4",
|
|
input: "tool-linux-amd64v4.tar.gz",
|
|
arch: buildmeta.ArchAMD64v4,
|
|
},
|
|
{
|
|
name: "amd64v3 not baseline",
|
|
input: "tool-1.0.0-linux-amd64v3.tar.gz",
|
|
wantOS: buildmeta.OSLinux,
|
|
arch: buildmeta.ArchAMD64v3,
|
|
format: buildmeta.FormatTarGz,
|
|
},
|
|
|
|
// ARM variants: arm64 must not match armv7/armv6
|
|
{
|
|
name: "aarch64 not armv7",
|
|
input: "tool-aarch64-linux.tar.gz",
|
|
arch: buildmeta.ArchARM64,
|
|
},
|
|
{
|
|
name: "armv7",
|
|
input: "tool-armv7l-linux.tar.gz",
|
|
arch: buildmeta.ArchARMv7,
|
|
},
|
|
{
|
|
name: "armv6",
|
|
input: "tool-armv6l-linux.tar.gz",
|
|
arch: buildmeta.ArchARMv6,
|
|
},
|
|
|
|
// ppc64le before ppc64
|
|
{
|
|
name: "ppc64le",
|
|
input: "tool-linux-ppc64le.tar.gz",
|
|
arch: buildmeta.ArchPPC64LE,
|
|
},
|
|
{
|
|
name: "ppc64",
|
|
input: "tool-linux-ppc64.tar.gz",
|
|
arch: buildmeta.ArchPPC64,
|
|
},
|
|
|
|
// Static linking
|
|
{
|
|
name: "static binary",
|
|
input: "tool-linux-amd64-static.tar.gz",
|
|
libc: buildmeta.LibcNone,
|
|
},
|
|
|
|
// .exe implies Windows
|
|
{
|
|
name: "exe implies windows",
|
|
input: "tool-amd64.exe",
|
|
wantOS: buildmeta.OSWindows,
|
|
arch: buildmeta.ArchAMD64,
|
|
format: buildmeta.FormatExe,
|
|
},
|
|
|
|
// Compound extensions
|
|
{
|
|
name: "tar.zst",
|
|
input: "tool-linux-amd64.tar.zst",
|
|
format: buildmeta.FormatTarZst,
|
|
},
|
|
{
|
|
name: "exe.xz",
|
|
input: "tool-windows-amd64.exe.xz",
|
|
format: buildmeta.FormatExeXz,
|
|
},
|
|
{
|
|
name: "app.zip",
|
|
input: "MyApp-1.0.0.app.zip",
|
|
format: buildmeta.FormatAppZip,
|
|
},
|
|
{
|
|
name: "tgz alias",
|
|
input: "tool-linux-amd64.tgz",
|
|
format: buildmeta.FormatTarGz,
|
|
},
|
|
|
|
// s390x, mips
|
|
{
|
|
name: "s390x",
|
|
input: "tool-linux-s390x.tar.gz",
|
|
arch: buildmeta.ArchS390X,
|
|
},
|
|
{
|
|
name: "mips64",
|
|
input: "tool-linux-mips64.tar.gz",
|
|
arch: buildmeta.ArchMIPS64,
|
|
},
|
|
|
|
// Unknown / no match
|
|
{
|
|
name: "checksum file",
|
|
input: "checksums.txt",
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got := classify.Filename(tt.input)
|
|
if tt.wantOS != "" && got.OS != tt.wantOS {
|
|
t.Errorf("OS = %q, want %q", got.OS, tt.wantOS)
|
|
}
|
|
if tt.arch != "" && got.Arch != tt.arch {
|
|
t.Errorf("Arch = %q, want %q", got.Arch, tt.arch)
|
|
}
|
|
if tt.libc != "" && got.Libc != tt.libc {
|
|
t.Errorf("Libc = %q, want %q", got.Libc, tt.libc)
|
|
}
|
|
if tt.format != "" && got.Format != tt.format {
|
|
t.Errorf("Format = %q, want %q", got.Format, tt.format)
|
|
}
|
|
})
|
|
}
|
|
}
|