webinstall/webi-installers

[Fixed] Incorrect releases selected for delta and lsd (potentially more?)

jaridmargolin opened this issue · 7 comments

What were you trying to install (or what else went wrong)?

I believe that webi is installing the incorrect releases for several packages, including lsd and delta, in certain situations.

What exactly did you do? / What went wrong? / Which OS did you try on?

Within a devcontainer running on my M1 Mac, lsd and delta report as being successfully installed but then both report errors when being executed: qemu-arm: Could not open '/lib/ld-linux-armhf.so.3': No such file or directory. It should be attempting to use ld-linux-aarch64.so.1.

Using delta, I'm tracing things a bit but because some of the logic sits inside of the API, I lose sight of what happens.

  1. The following installer is fetched: https://webi.sh/api/installers/delta@0.16.5.sh?formats=tar,exe,zip,xz,git,dmg with the UA Linux/5.15.49-linuxkit-pr aarch64/unknown gnu
  2. Inspecting that file, WEBI_PKG_URL='https://github.com/dandavison/delta/releases/download/0.16.5/delta-0.16.5-arm-unknown-linux-gnueabihf.tar.gz'. It's not clear why that would be used rather than https://github.com/dandavison/delta/releases/download/0.16.5/delta-0.16.5-aarch64-unknown-linux-gnu.tar.gz.

I'm still poking around but I can't seem to find where the server code for webi lives so I'm not sure how to push this debugging further 🤔

UPDATE: I've found the relevant code paths in _webi. Time permitting, I'll clone down the source and see if I can get to the bottom of this.

UPDATE 2: Continued tracing leading me to a possible error in filterReleases.

What type of computer (i.e. laptop, desktop, Raspberry Pi)?

Laptop or Desktop (amd64 / x86-64)

Alright - I have at least a theory now. Tracing the code above, I am seeing how the release is selected.

  1. Installers.helper calls getReleases with a handful of release params, including limit: 1.
  2. getReleases calls filterReleases while passing through the limit.
  3. The two releases above, https://github.com/dandavison/delta/releases/download/0.16.5/delta-0.16.5-arm-unknown-linux-gnueabihf.tar.gz and https://github.com/dandavison/delta/releases/download/0.16.5/delta-0.16.5-aarch64-unknown-linux-gnu.tar.gz, make it through the filter logic, however, the results are then sorted and sliced to only return one release.

Where I "believe" the bug is, is the fact that https://github.com/dandavison/delta/releases/download/0.16.5/delta-0.16.5-arm-unknown-linux-gnueabihf.tar.gz makes it through the filter logic. Here is the release query along with the two release objects:

{
  pkg: 'delta',
  ver: '0.16.5',
  os: 'linux',
  arch: 'arm64',
  libc: 'gnu',
  lts: undefined,
  channel: undefined,
  formats: [ 'exe', 'xz', 'tar', 'zip', 'git' ],
  limit: 1
}
[
  {
    name: 'delta-0.16.5-arm-unknown-linux-gnueabihf.tar.gz',
    version: '0.16.5',
    lts: false,
    channel: 'stable',
    date: '2023-06-03',
    os: 'linux',
    arch: 'arm64',
    ext: 'tar.gz',
    download: 'https://github.com/dandavison/delta/releases/download/0.16.5/delta-0.16.5-arm-unknown-linux-gnueabihf.tar.gz',
    libc: 'none'
  },
  {
    name: 'delta-0.16.5-aarch64-unknown-linux-gnu.tar.gz',
    version: '0.16.5',
    lts: false,
    channel: 'stable',
    date: '2023-06-03',
    os: 'linux',
    arch: 'arm64',
    ext: 'tar.gz',
    download: 'https://github.com/dandavison/delta/releases/download/0.16.5/delta-0.16.5-aarch64-unknown-linux-gnu.tar.gz',
    libc: 'gnu'
  }
]

In this example, the release query states explicitly that it wants libc: "gnu" however the libc: "none" result is not filtered out.

Is the following line correct in checking rel.libc or is it just supposed to check for the closure libc value?

if (rel.libc !== 'none') {

I see that there were some modifications around this logic a few days ago and curious if this is a newly introduced bug: #731

I know exactly what introduced it - it was the big fix for Alpine / musl static builds.

I think it's safe to say that we're at a point that a single set of rules cannot correctly detect the host triplet, as you have pointed out an impossible condition:

arm which matches aarch64 in some contexts, also matches armv7 in other contexts and gnu which matches for libc in some contexts must also match arm in other contexts.

I think we'll need a Go triplet matcher and a Rust triplet matcher and then a best-effort matcher.

A quick fix may be to implement a two pass approach where we loop through a set of releases with strict matches and if there is a specific match for arm64 or aarch64 then in the next set of matching arm must be treated as armv7, and vice versa.

I'm sorry for the inconvenience, grateful for your report.

I'm unavailable for the next few hours, so you may get to a fix before I do.

P.S. the complexity creep has happened over time, and I'm very interested in revamping... everything, bit by bit.

819 Permutations of Target Host Triple

I do plan to fix this quickly, however, I wanted to once and for all get the list of permutations so that I can come up with some sort of unit test to make sure future changes don't break things.

I've sampled over 33,000 releases and after excluding about 5,000 non-releases (i.e. checksums, docs, etc) the handful of insanely unique naming schemes that already have special matchers, there are 777 permutations of target host triple.

In other words, this is the first half of the data necessary to unit test this and make sure we don't mess it up in the future.

All of these are taken from the download URL, so there are some that are missing information that should obviously be present (such as name and version), but those pieces of data were implicit (i.e. https://fooapp.com/linux-x64.zip).

Updated

819 Permutations across 26,470 installable bundles matching a total of 117 patterns of terms for OS, Arch, Vendor, Libc, and Extension:

32 386 5 6 64 8 Alpine Darwin Linux MacOS NAME VER Windows WindowsX86 aarch64 aix all alpine amd64 amd64v2 android androideabi app apple arm arm32 arm6 arm64 arm7 armel armhf armv5 armv6 armv6hf armv6kz armv6l armv7 armv7a armv7l beta bit darwin debug dev dmg dragonfly exe freebsd freebsd12 git gnu gnueabihf gz i386 i686 ia32 illumos linux linux32 linux64 loong64 m1 mac mac32 mac64 macOS macos macos10 mips mips64 mips64el mips64le mips64r6 mips64r6el mipsel mipsle mipsr6 mipsr6el msi msvc musl musleabihf netbsd openbsd osx osx10 osx64 pc pkg plan9 powerpc powerpc64le ppc64 ppc64el ppc64le riscv64 s390x sh solaris solaris11 stable static tar universal unknown v1 v2 v6 v7 win win32 win64 windows x64 x86 xz zip

{NAME}
{NAME}-aarch64-apple-darwin.zip
{NAME}-aarch64-pc-windows-msvc.zip
{NAME}-aarch64-unknown-linux-gnu
{NAME}-aarch64-unknown-linux-musl
{NAME}-aarch64-unknown-linux-musl.tar.gz
{NAME}-alpine-aarch64.tar.gz
{NAME}-alpine-x86_64.tar.gz
{NAME}-android-arm64.tar.gz
{NAME}-armv7-unknown-linux-gnueabihf
{NAME}-armv7-unknown-linux-musleabihf
{NAME}-armv7-unknown-linux-musleabihf.tar.gz
{NAME}-darwin
{NAME}-darwin-386.tar.gz
{NAME}-darwin-aarch64.zip
{NAME}-darwin-amd64
{NAME}-darwin-amd64.tar.gz
{NAME}-darwin-amd64.zip
{NAME}-darwin-arm64
{NAME}-darwin-arm64.gz
{NAME}-darwin-arm64.tar.gz
{NAME}-darwin-x64
{NAME}-darwin-x64.gz
{NAME}-darwin-x64.zip
{NAME}-darwin-x86_64.tar.gz
{NAME}-darwin.zip
{NAME}-dragonfly-amd64-{VER}.tar.gz
{NAME}-dragonfly-amd64.tar.gz
{NAME}-freebsd-386-{VER}.tar.gz
{NAME}-freebsd-386.tar.gz
{NAME}-freebsd-amd64-{VER}.tar.gz
{NAME}-freebsd-amd64.tar.gz
{NAME}-freebsd-arm-{VER}.tar.gz
{NAME}-freebsd-arm.tar.gz
{NAME}-freebsd-arm64-{VER}.tar.gz
{NAME}-freebsd-x64
{NAME}-freebsd-x64.gz
{NAME}-illumos-amd64-{VER}.tar.gz
{NAME}-illumos-amd64.tar.gz
{NAME}-linux-386-{VER}.tar.gz
{NAME}-linux-386.tar.gz
{NAME}-linux-386.zip
{NAME}-linux-aarch64-{VER}.tar.xz
{NAME}-linux-aarch64.tar.gz
{NAME}-linux-aarch64.zip
{NAME}-linux-amd64
{NAME}-linux-amd64-{VER}.tar.gz
{NAME}-linux-amd64.tar.gz
{NAME}-linux-amd64.zip
{NAME}-linux-arm
{NAME}-linux-arm-{VER}.tar.gz
{NAME}-linux-arm.gz
{NAME}-linux-arm.tar.gz
{NAME}-linux-arm64
{NAME}-linux-arm64-{VER}.tar.gz
{NAME}-linux-arm64.gz
{NAME}-linux-arm64.tar.gz
{NAME}-linux-armel
{NAME}-linux-armhf
{NAME}-linux-armv7a-{VER}.tar.xz
{NAME}-linux-i386
{NAME}-linux-ia32
{NAME}-linux-ia32.gz
{NAME}-linux-loong64-{VER}.tar.gz
{NAME}-linux-mips
{NAME}-linux-mips-{VER}.tar.gz
{NAME}-linux-mips.tar.gz
{NAME}-linux-mips64
{NAME}-linux-mips64-{VER}.tar.gz
{NAME}-linux-mips64.tar.gz
{NAME}-linux-mips64el
{NAME}-linux-mips64le-{VER}.tar.gz
{NAME}-linux-mips64le.tar.gz
{NAME}-linux-mips64r6
{NAME}-linux-mips64r6el
{NAME}-linux-mipsel
{NAME}-linux-mipsle-{VER}.tar.gz
{NAME}-linux-mipsle.tar.gz
{NAME}-linux-mipsr6
{NAME}-linux-mipsr6el
{NAME}-linux-powerpc
{NAME}-linux-powerpc-{VER}.tar.xz
{NAME}-linux-powerpc64le-{VER}.tar.xz
{NAME}-linux-ppc64-{VER}.tar.gz
{NAME}-linux-ppc64.tar.gz
{NAME}-linux-ppc64el
{NAME}-linux-ppc64le
{NAME}-linux-ppc64le-{VER}.tar.gz
{NAME}-linux-ppc64le.tar.gz
{NAME}-linux-riscv64
{NAME}-linux-riscv64-{VER}.tar.gz
{NAME}-linux-riscv64-{VER}.tar.xz
{NAME}-linux-s390x
{NAME}-linux-s390x-{VER}.tar.gz
{NAME}-linux-s390x.tar.gz
{NAME}-linux-x64
{NAME}-linux-x64.gz
{NAME}-linux-x64.zip
{NAME}-linux-x86
{NAME}-linux-x86-{VER}.tar.xz
{NAME}-linux-x86_64
{NAME}-linux-x86_64-static
{NAME}-linux-x86_64-{VER}.tar.xz
{NAME}-linux-x86_64.tar.gz
{NAME}-linux32
{NAME}-linux64
{NAME}-macos-aarch64-{VER}.tar.xz
{NAME}-macos-amd64
{NAME}-macos-amd64-{VER}.zip
{NAME}-macos-arm64
{NAME}-macos-arm64-{VER}.zip
{NAME}-macos-universal-{VER}.zip
{NAME}-macos-x86_64-{VER}.tar.xz
{NAME}-netbsd-386-{VER}.tar.gz
{NAME}-netbsd-386.tar.gz
{NAME}-netbsd-amd64-{VER}.tar.gz
{NAME}-netbsd-amd64.tar.gz
{NAME}-netbsd-arm-{VER}.tar.gz
{NAME}-netbsd-arm.tar.gz
{NAME}-netbsd-arm64-{VER}.tar.gz
{NAME}-openbsd-386-{VER}.tar.gz
{NAME}-openbsd-386.tar.gz
{NAME}-openbsd-amd64-{VER}.tar.gz
{NAME}-openbsd-amd64.tar.gz
{NAME}-openbsd-arm-{VER}.tar.gz
{NAME}-openbsd-arm.tar.gz
{NAME}-openbsd-arm64-{VER}.tar.gz
{NAME}-openbsd-arm64.tar.gz
{NAME}-osx-amd64
{NAME}-osx-x86
{NAME}-osx-x86_64
{NAME}-solaris-amd64-{VER}.tar.gz
{NAME}-solaris-amd64.tar.gz
{NAME}-solaris11-32
{NAME}-solaris11-64
{NAME}-win-aarch64.zip
{NAME}-win-x64.zip
{NAME}-win32-ia32
{NAME}-win32-ia32.gz
{NAME}-win32-x64
{NAME}-win32-x64.gz
{NAME}-win32.exe
{NAME}-win64.exe
{NAME}-windows-386-{VER}.zip
{NAME}-windows-386.zip
{NAME}-windows-aarch64-{VER}.zip
{NAME}-windows-amd64
{NAME}-windows-amd64-{VER}.zip
{NAME}-windows-amd64.exe
{NAME}-windows-amd64.zip
{NAME}-windows-arm-{VER}.zip
{NAME}-windows-arm64-{VER}.zip
{NAME}-windows-i386.exe
{NAME}-windows-x86-{VER}.zip
{NAME}-windows-x86_64-{VER}.zip
{NAME}-x86_64-apple-darwin
{NAME}-x86_64-apple-darwin.tar.gz
{NAME}-x86_64-apple-darwin.zip
{NAME}-x86_64-pc-windows-msvc.exe
{NAME}-x86_64-pc-windows-msvc.zip
{NAME}-x86_64-unknown-linux-gnu
{NAME}-x86_64-unknown-linux-gnu.zip
{NAME}-x86_64-unknown-linux-musl
{NAME}-x86_64-unknown-linux-musl.tar.gz
{NAME}-{VER}-32-bit.zip
{NAME}-{VER}-64-bit.zip
{NAME}-{VER}-aarch64-apple-darwin
{NAME}-{VER}-aarch64-apple-darwin.tar.gz
{NAME}-{VER}-aarch64-apple-darwin.tar.xz
{NAME}-{VER}-aarch64-linux-android.tar.gz
{NAME}-{VER}-aarch64-linux-gnu.tar.gz
{NAME}-{VER}-aarch64-pc-windows-msvc.zip
{NAME}-{VER}-aarch64-unknown-linux-gnu
{NAME}-{VER}-aarch64-unknown-linux-gnu.tar.gz
{NAME}-{VER}-aarch64-unknown-linux-gnu.tar.xz
{NAME}-{VER}-aarch64-unknown-linux-musl.tar.gz
{NAME}-{VER}-aarch64-unknown-linux-musl.tar.xz
{NAME}-{VER}-alpine-x86_64.tar.gz
{NAME}-{VER}-arm-linux-gnueabihf-debug.tar.gz
{NAME}-{VER}-arm-linux-gnueabihf.tar.gz
{NAME}-{VER}-arm-unknown-linux-gnueabihf.tar.gz
{NAME}-{VER}-arm-unknown-linux-musleabihf.tar.gz
{NAME}-{VER}-arm64-apple-darwin.dmg
{NAME}-{VER}-arm64-apple-darwin.tar.gz
{NAME}-{VER}-arm64-macOS.pkg
{NAME}-{VER}-arm64-macOS.zip
{NAME}-{VER}-armv7-linux-androideabi.tar.gz
{NAME}-{VER}-armv7-unknown-linux-gnueabihf.tar.gz
{NAME}-{VER}-armv7-unknown-linux-gnueabihf.tar.xz
{NAME}-{VER}-armv7-unknown-linux-musleabihf
{NAME}-{VER}-armv7-unknown-linux-musleabihf.tar.gz
{NAME}-{VER}-darwin-10.12-amd64
{NAME}-{VER}-darwin-10.12-amd64.xz
{NAME}-{VER}-darwin-10.12-arm64
{NAME}-{VER}-darwin-10.12-arm64.xz
{NAME}-{VER}-darwin-amd64.tar.gz
{NAME}-{VER}-darwin-amd64_v2.tar.gz
{NAME}-{VER}-darwin-amd64_v2.tar.xz
{NAME}-{VER}-darwin-arm64.tar.gz
{NAME}-{VER}-darwin-arm64.tar.xz
{NAME}-{VER}-darwin-x86_64.tar.gz
{NAME}-{VER}-darwin_amd64.tar.gz
{NAME}-{VER}-darwin_amd64.zip
{NAME}-{VER}-darwin_arm64.tar.gz
{NAME}-{VER}-darwin_arm64.zip
{NAME}-{VER}-freebsd-386.zip
{NAME}-{VER}-freebsd-amd64.zip
{NAME}-{VER}-freebsd-arm-v6.zip
{NAME}-{VER}-freebsd-arm-v7.zip
{NAME}-{VER}-freebsd-arm.zip
{NAME}-{VER}-freebsd12-amd64
{NAME}-{VER}-freebsd12-amd64.xz
{NAME}-{VER}-freebsd_amd64.tar.gz
{NAME}-{VER}-i686-apple-darwin.tar.gz
{NAME}-{VER}-i686-pc-windows-gnu.zip
{NAME}-{VER}-i686-pc-windows-msvc.zip
{NAME}-{VER}-i686-unknown-linux-gnu.tar.gz
{NAME}-{VER}-i686-unknown-linux-musl.tar.gz
{NAME}-{VER}-i686-unknown-linux-musl.tar.xz
{NAME}-{VER}-linux-386
{NAME}-{VER}-linux-386.tar.gz
{NAME}-{VER}-linux-386.tar.xz
{NAME}-{VER}-linux-386.xz
{NAME}-{VER}-linux-386.zip
{NAME}-{VER}-linux-aarch64.sh
{NAME}-{VER}-linux-aarch64.tar.gz
{NAME}-{VER}-linux-amd64
{NAME}-{VER}-linux-amd64.tar.gz
{NAME}-{VER}-linux-amd64.xz
{NAME}-{VER}-linux-amd64.zip
{NAME}-{VER}-linux-amd64_v1.tar.gz
{NAME}-{VER}-linux-amd64_v1.tar.xz
{NAME}-{VER}-linux-arm-5
{NAME}-{VER}-linux-arm-5.xz
{NAME}-{VER}-linux-arm-6
{NAME}-{VER}-linux-arm-6.xz
{NAME}-{VER}-linux-arm-v6.zip
{NAME}-{VER}-linux-arm-v7.zip
{NAME}-{VER}-linux-arm.tar.gz
{NAME}-{VER}-linux-arm.zip
{NAME}-{VER}-linux-arm32.tar.gz
{NAME}-{VER}-linux-arm64
{NAME}-{VER}-linux-arm64.tar.gz
{NAME}-{VER}-linux-arm64.tar.xz
{NAME}-{VER}-linux-arm64.xz
{NAME}-{VER}-linux-arm64.zip
{NAME}-{VER}-linux-armv5.tar.gz
{NAME}-{VER}-linux-armv6.tar.gz
{NAME}-{VER}-linux-armv6.tar.xz
{NAME}-{VER}-linux-armv7.tar.gz
{NAME}-{VER}-linux-armv7.tar.xz
{NAME}-{VER}-linux-ia32.tar.gz
{NAME}-{VER}-linux-linux-musl-x64.tar.gz
{NAME}-{VER}-linux-mips.zip
{NAME}-{VER}-linux-mipsle.zip
{NAME}-{VER}-linux-musl-x64.tar.gz
{NAME}-{VER}-linux-x64-{NAME}.tar.gz
{NAME}-{VER}-linux-x64.tar.gz
{NAME}-{VER}-linux-x86_64.sh
{NAME}-{VER}-linux-x86_64.tar.gz
{NAME}-{VER}-linux-{NAME}.tar.gz
{NAME}-{VER}-linux_amd64.tar.gz
{NAME}-{VER}-linux_arm64.tar.gz
{NAME}-{VER}-linux_armv5.tar.gz
{NAME}-{VER}-linux_armv6.tar.gz
{NAME}-{VER}-linux_armv7.tar.gz
{NAME}-{VER}-linux_loong64.tar.gz
{NAME}-{VER}-linux_ppc64le.tar.gz
{NAME}-{VER}-linux_s390x.tar.gz
{NAME}-{VER}-macOS.pkg
{NAME}-{VER}-macOS.zip
{NAME}-{VER}-macos-amd64.tar.gz
{NAME}-{VER}-macos-arm64.tar.gz
{NAME}-{VER}-macos-universal.dmg
{NAME}-{VER}-macos-universal.tar.gz
{NAME}-{VER}-macos-x64.tar.gz
{NAME}-{VER}-macos10.10-universal.dmg
{NAME}-{VER}-macos10.10-universal.tar.gz
{NAME}-{VER}-netbsd-386.zip
{NAME}-{VER}-netbsd-amd64.zip
{NAME}-{VER}-netbsd-arm-v6.zip
{NAME}-{VER}-netbsd-arm-v7.zip
{NAME}-{VER}-netbsd-arm.zip
{NAME}-{VER}-openbsd-386.zip
{NAME}-{VER}-openbsd-amd64.zip
{NAME}-{VER}-openbsd_amd64.tar.gz
{NAME}-{VER}-osx-amd64.zip
{NAME}-{VER}-osx-arm64.tar.gz
{NAME}-{VER}-osx-arm64.zip
{NAME}-{VER}-osx-x64.tar.gz
{NAME}-{VER}-osx-{NAME}.zip
{NAME}-{VER}-osx.dmg
{NAME}-{VER}-osx64.tar.gz
{NAME}-{VER}-plan9-386.zip
{NAME}-{VER}-plan9-amd64.zip
{NAME}-{VER}-powerpc64le-unknown-linux-gnu.tar.xz
{NAME}-{VER}-riscv64-linux-gnu.tar.gz
{NAME}-{VER}-s390x-unknown-linux-gnu.tar.xz
{NAME}-{VER}-solaris-amd64.zip
{NAME}-{VER}-win-arm32.zip
{NAME}-{VER}-win-arm64.zip
{NAME}-{VER}-win-x64.msi
{NAME}-{VER}-win-x64.zip
{NAME}-{VER}-win-x86.msi
{NAME}-{VER}-win-x86.zip
{NAME}-{VER}-win64.zip
{NAME}-{VER}-windows-386.zip
{NAME}-{VER}-windows-amd64.debug.zip
{NAME}-{VER}-windows-amd64.zip
{NAME}-{VER}-windows-arm64.msi
{NAME}-{VER}-windows-arm64.zip
{NAME}-{VER}-windows-i386.msi
{NAME}-{VER}-windows-i386.zip
{NAME}-{VER}-windows-ia32.zip
{NAME}-{VER}-windows-x64.zip
{NAME}-{VER}-windows-x86_64.msi
{NAME}-{VER}-windows-x86_64.zip
{NAME}-{VER}-windows.zip
{NAME}-{VER}-windows_amd64.zip
{NAME}-{VER}-windows_arm64.zip
{NAME}-{VER}-windows_armv5.zip
{NAME}-{VER}-windows_armv6.zip
{NAME}-{VER}-windows_armv7.zip
{NAME}-{VER}-windows{NAME}386.exe
{NAME}-{VER}-windows{NAME}386.exe.xz
{NAME}-{VER}-windows{NAME}amd64.exe
{NAME}-{VER}-windows{NAME}amd64.exe.xz
{NAME}-{VER}-x86_64-apple-darwin
{NAME}-{VER}-x86_64-apple-darwin.dmg
{NAME}-{VER}-x86_64-apple-darwin.tar.gz
{NAME}-{VER}-x86_64-apple-darwin.tar.xz
{NAME}-{VER}-x86_64-apple-darwin.zip
{NAME}-{VER}-x86_64-linux-gnu.tar.gz
{NAME}-{VER}-x86_64-linux.tar.gz
{NAME}-{VER}-x86_64-macOS.pkg
{NAME}-{VER}-x86_64-macOS.zip
{NAME}-{VER}-x86_64-osx.tar.gz
{NAME}-{VER}-x86_64-pc-windows-gnu.exe
{NAME}-{VER}-x86_64-pc-windows-gnu.tar.gz
{NAME}-{VER}-x86_64-pc-windows-gnu.zip
{NAME}-{VER}-x86_64-pc-windows-msvc.exe
{NAME}-{VER}-x86_64-pc-windows-msvc.zip
{NAME}-{VER}-x86_64-unknown-freebsd
{NAME}-{VER}-x86_64-unknown-linux-gnu
{NAME}-{VER}-x86_64-unknown-linux-gnu.tar.gz
{NAME}-{VER}-x86_64-unknown-linux-gnu.tar.xz
{NAME}-{VER}-x86_64-unknown-linux-gnu.zip
{NAME}-{VER}-x86_64-unknown-linux-musl
{NAME}-{VER}-x86_64-unknown-linux-musl.tar.gz
{NAME}-{VER}-x86_64-unknown-linux-musl.tar.xz
{NAME}-{VER}-x86_64-unknown-netbsd.tar.gz
{NAME}-{VER}.app.zip
{NAME}-{VER}.darwin.x86_64.tar.xz
{NAME}-{VER}.linux.aarch64.tar.xz
{NAME}-{VER}.linux.armv6hf.tar.xz
{NAME}-{VER}.linux.x86_64.tar.xz
{NAME}-{VER}.tar.gz
{NAME}-{VER}.x86_64-apple-darwin.zip
{NAME}-{VER}.x86_64-pc-windows-msvc.zip
{NAME}-{VER}.x86_64-unknown-linux-gnu.zip
{NAME}-{VER}.zip
{NAME}.app.zip
{NAME}.dmg
{NAME}.git
{NAME}.{VER}-.x86_64-apple-darwin.zip
{NAME}.{VER}-.x86_64-pc-windows-msvc.zip
{NAME}.{VER}-.x86_64-unknown-linux-gnu.zip
{NAME}/{VER}/{NAME}.tar.gz
{NAME}/{VER}/{NAME}.zip
{NAME}Alpine.zip
{NAME}Linux.zip
{NAME}MacOS.zip
{NAME}Windows.zip
{NAME}WindowsX86.zip
{NAME}_Darwin_all.tar.gz
{NAME}_Darwin_amd64.tar.gz
{NAME}_Darwin_arm64.tar.gz
{NAME}_Darwin_x86_64.tar.gz
{NAME}_Linux_amd64.tar.gz
{NAME}_Linux_arm.tar.gz
{NAME}_Linux_arm64.tar.gz
{NAME}_Linux_armv7.tar.gz
{NAME}_Linux_i386.tar.gz
{NAME}_Linux_ppc64.tar.gz
{NAME}_Linux_ppc64le.tar.gz
{NAME}_Linux_s390x.tar.gz
{NAME}_Linux_x86_64.tar.gz
{NAME}_Windows_amd64.tar.gz
{NAME}_Windows_amd64.zip
{NAME}_Windows_arm.tar.gz
{NAME}_Windows_arm.zip
{NAME}_Windows_arm64.tar.gz
{NAME}_Windows_arm64.zip
{NAME}_Windows_armv7.zip
{NAME}_Windows_i386.zip
{NAME}_Windows_x86_64.tar.gz
{NAME}_Windows_x86_64.zip
{NAME}_aix_ppc64_{VER}.tar.gz
{NAME}_darwin_amd64
{NAME}_darwin_amd64.tar.gz
{NAME}_darwin_amd64_{VER}.tar.gz
{NAME}_darwin_arm64
{NAME}_darwin_arm64.tar.gz
{NAME}_darwin_arm64_{VER}.tar.gz
{NAME}_dragonfly_amd64_{VER}.tar.gz
{NAME}_freebsd_386
{NAME}_freebsd_386.tar.gz
{NAME}_freebsd_386_{VER}.tar.gz
{NAME}_freebsd_amd64
{NAME}_freebsd_amd64.tar.gz
{NAME}_freebsd_amd64_{VER}.tar.gz
{NAME}_freebsd_arm
{NAME}_freebsd_arm.tar.gz
{NAME}_freebsd_arm64_{VER}.tar.gz
{NAME}_freebsd_arm7
{NAME}_freebsd_arm_{VER}.tar.gz
{NAME}_linux_386
{NAME}_linux_386.tar.gz
{NAME}_linux_386_{VER}.tar.gz
{NAME}_linux_amd64
{NAME}_linux_amd64.tar.gz
{NAME}_linux_amd64_{VER}.tar.gz
{NAME}_linux_arm
{NAME}_linux_arm.tar.gz
{NAME}_linux_arm64
{NAME}_linux_arm64.tar.gz
{NAME}_linux_arm64_{VER}.tar.gz
{NAME}_linux_arm7
{NAME}_linux_arm_{VER}.tar.gz
{NAME}_linux_mips
{NAME}_linux_mips.tar.gz
{NAME}_linux_mips64
{NAME}_linux_mips64.tar.gz
{NAME}_linux_mips64_{VER}.tar.gz
{NAME}_linux_mips64le
{NAME}_linux_mips64le.tar.gz
{NAME}_linux_mips64le_{VER}.tar.gz
{NAME}_linux_mips_{VER}.tar.gz
{NAME}_linux_mipsle
{NAME}_linux_mipsle.tar.gz
{NAME}_linux_mipsle_{VER}.tar.gz
{NAME}_linux_ppc64
{NAME}_linux_ppc64.tar.gz
{NAME}_linux_ppc64_{VER}.tar.gz
{NAME}_linux_ppc64le
{NAME}_linux_ppc64le.tar.gz
{NAME}_linux_ppc64le_{VER}.tar.gz
{NAME}_linux_riscv64_{VER}.tar.gz
{NAME}_linux_s390x
{NAME}_linux_s390x.tar.gz
{NAME}_linux_s390x_{VER}.tar.gz
{NAME}_linux_{VER}-beta.tar.xz
{NAME}_linux_{VER}-dev.tar.xz
{NAME}_linux_{VER}-stable.tar.xz
{NAME}_mac_amd64
{NAME}_macos_{VER}-beta.zip
{NAME}_macos_{VER}-dev.zip
{NAME}_macos_{VER}-stable.zip
{NAME}_netbsd_386
{NAME}_netbsd_386.tar.gz
{NAME}_netbsd_386_{VER}.tar.gz
{NAME}_netbsd_amd64
{NAME}_netbsd_amd64.tar.gz
{NAME}_netbsd_amd64_{VER}.tar.gz
{NAME}_netbsd_arm
{NAME}_netbsd_arm.tar.gz
{NAME}_netbsd_arm64_{VER}.tar.gz
{NAME}_netbsd_arm_{VER}.tar.gz
{NAME}_openbsd_386
{NAME}_openbsd_386.tar.gz
{NAME}_openbsd_386_{VER}.tar.gz
{NAME}_openbsd_amd64
{NAME}_openbsd_amd64.tar.gz
{NAME}_openbsd_amd64_{VER}.tar.gz
{NAME}_openbsd_arm64_{VER}.tar.gz
{NAME}_openbsd_arm_{VER}.tar.gz
{NAME}_openbsd_mips64_{VER}.tar.gz
{NAME}_solaris_amd64_{VER}.tar.gz
{NAME}_windows_386.exe
{NAME}_windows_386.zip
{NAME}_windows_386_{VER}.tar.gz
{NAME}_windows_386_{VER}.zip
{NAME}_windows_amd64.exe
{NAME}_windows_amd64.zip
{NAME}_windows_amd64_{VER}.tar.gz
{NAME}_windows_amd64_{VER}.zip
{NAME}_windows_arm64_{VER}.tar.gz
{NAME}_windows_arm64_{VER}.zip
{NAME}_windows_arm_{VER}.tar.gz
{NAME}_windows_arm_{VER}.zip
{NAME}_windows_{VER}-beta.zip
{NAME}_windows_{VER}-dev.zip
{NAME}_windows_{VER}-stable.zip
{NAME}_{VER}_Darwin_arm64.tar.gz
{NAME}_{VER}_Darwin_x86_64.tar.gz
{NAME}_{VER}_Linux_arm64.tar.gz
{NAME}_{VER}_Linux_armv6.tar.gz
{NAME}_{VER}_Linux_armv7.tar.gz
{NAME}_{VER}_Linux_i386.tar.gz
{NAME}_{VER}_Linux_x86_64.tar.gz
{NAME}_{VER}_Windows_arm64.zip
{NAME}_{VER}_Windows_armv6.zip
{NAME}_{VER}_Windows_armv7.zip
{NAME}_{VER}_Windows_i386.zip
{NAME}_{VER}_Windows_x86_64.zip
{NAME}_{VER}_darwin-universal.tar.gz
{NAME}_{VER}_darwin_386
{NAME}_{VER}_darwin_386.tar.gz
{NAME}_{VER}_darwin_386.zip
{NAME}_{VER}_darwin_aarch64.tar.gz
{NAME}_{VER}_darwin_all.tar.gz
{NAME}_{VER}_darwin_amd64
{NAME}_{VER}_darwin_amd64.tar.gz
{NAME}_{VER}_darwin_amd64.zip
{NAME}_{VER}_darwin_amd64v2.tar.xz
{NAME}_{VER}_darwin_arm64
{NAME}_{VER}_darwin_arm64.tar.gz
{NAME}_{VER}_darwin_arm64.tar.xz
{NAME}_{VER}_darwin_arm64.zip
{NAME}_{VER}_darwin_x86-64.tar.gz
{NAME}_{VER}_darwin_x86_64.tar.gz
{NAME}_{VER}_dragonfly-amd64.tar.gz
{NAME}_{VER}_freebsd-amd64.tar.gz
{NAME}_{VER}_freebsd_386
{NAME}_{VER}_freebsd_386.tar.gz
{NAME}_{VER}_freebsd_386.zip
{NAME}_{VER}_freebsd_aarch64.tar.gz
{NAME}_{VER}_freebsd_amd64
{NAME}_{VER}_freebsd_amd64.tar.gz
{NAME}_{VER}_freebsd_amd64.zip
{NAME}_{VER}_freebsd_amd64v2.tar.xz
{NAME}_{VER}_freebsd_arm
{NAME}_{VER}_freebsd_arm.zip
{NAME}_{VER}_freebsd_arm64.tar.gz
{NAME}_{VER}_freebsd_arm64.tar.xz
{NAME}_{VER}_freebsd_armv6.tar.gz
{NAME}_{VER}_freebsd_armv7.tar.gz
{NAME}_{VER}_freebsd_armv7.tar.xz
{NAME}_{VER}_freebsd_i386.tar.gz
{NAME}_{VER}_freebsd_x86-64.tar.gz
{NAME}_{VER}_freebsd_x86_64.tar.gz
{NAME}_{VER}_linux-amd64.tar.gz
{NAME}_{VER}_linux-arm.tar.gz
{NAME}_{VER}_linux-arm64.tar.gz
{NAME}_{VER}_linux_386
{NAME}_{VER}_linux_386.tar.gz
{NAME}_{VER}_linux_386.zip
{NAME}_{VER}_linux_aarch64.tar.gz
{NAME}_{VER}_linux_amd64
{NAME}_{VER}_linux_amd64.tar.gz
{NAME}_{VER}_linux_amd64.zip
{NAME}_{VER}_linux_amd64v2.tar.xz
{NAME}_{VER}_linux_arm
{NAME}_{VER}_linux_arm.zip
{NAME}_{VER}_linux_arm64
{NAME}_{VER}_linux_arm64.tar.gz
{NAME}_{VER}_linux_arm64.tar.xz
{NAME}_{VER}_linux_arm64.zip
{NAME}_{VER}_linux_armhf.tar.gz
{NAME}_{VER}_linux_armv5.tar.gz
{NAME}_{VER}_linux_armv6
{NAME}_{VER}_linux_armv6.tar.gz
{NAME}_{VER}_linux_armv7
{NAME}_{VER}_linux_armv7.tar.gz
{NAME}_{VER}_linux_armv7.tar.xz
{NAME}_{VER}_linux_i386.tar.gz
{NAME}_{VER}_linux_mips
{NAME}_{VER}_linux_mips64
{NAME}_{VER}_linux_mips64le
{NAME}_{VER}_linux_mipsle
{NAME}_{VER}_linux_ppc64le.tar.gz
{NAME}_{VER}_linux_riscv64.tar.gz
{NAME}_{VER}_linux_s390x
{NAME}_{VER}_linux_s390x.tar.gz
{NAME}_{VER}_linux_x86-64.tar.gz
{NAME}_{VER}_linux_x86_64.tar.gz
{NAME}_{VER}_macOS_386.tar.gz
{NAME}_{VER}_macOS_amd64.tar.gz
{NAME}_{VER}_macOS_amd64.zip
{NAME}_{VER}_macOS_arm64.tar.gz
{NAME}_{VER}_macOS_arm64.zip
{NAME}_{VER}_mac_amd64
{NAME}_{VER}_mac_amd64.tar.gz
{NAME}_{VER}_mac_arm64.tar.gz
{NAME}_{VER}_netbsd-amd64.tar.gz
{NAME}_{VER}_netbsd_386
{NAME}_{VER}_netbsd_amd64
{NAME}_{VER}_netbsd_arm
{NAME}_{VER}_openbsd-amd64.tar.gz
{NAME}_{VER}_openbsd_386
{NAME}_{VER}_openbsd_386.tar.gz
{NAME}_{VER}_openbsd_386.zip
{NAME}_{VER}_openbsd_amd64
{NAME}_{VER}_openbsd_amd64.tar.gz
{NAME}_{VER}_openbsd_amd64.zip
{NAME}_{VER}_openbsd_arm64.tar.gz
{NAME}_{VER}_openbsd_armv6.tar.gz
{NAME}_{VER}_solaris-amd64.tar.gz
{NAME}_{VER}_solaris_amd64.zip
{NAME}_{VER}_windows-amd64.zip
{NAME}_{VER}_windows-arm64.zip
{NAME}_{VER}_windows_386.exe
{NAME}_{VER}_windows_386.msi
{NAME}_{VER}_windows_386.tar.gz
{NAME}_{VER}_windows_386.zip
{NAME}_{VER}_windows_amd64
{NAME}_{VER}_windows_amd64.exe
{NAME}_{VER}_windows_amd64.msi
{NAME}_{VER}_windows_amd64.tar.gz
{NAME}_{VER}_windows_amd64.zip
{NAME}_{VER}_windows_amd64v2.zip
{NAME}_{VER}_windows_arm64.tar.gz
{NAME}_{VER}_windows_arm64.zip
{NAME}_{VER}_windows_armhf.zip
{NAME}_{VER}_windows_armv5.zip
{NAME}_{VER}_windows_armv6.tar.gz
{NAME}_{VER}_windows_armv6.zip
{NAME}_{VER}_windows_armv7.tar.gz
{NAME}_{VER}_windows_armv7.zip
{NAME}_{VER}_windows_i386.zip
{NAME}_{VER}_windows_x86-64.zip
{NAME}_{VER}_windows_x86_64.zip
{NAME}_{VER}{NAME}_{VER}_darwin_amd64.zip
{NAME}_{VER}{NAME}_{VER}_freebsd_386.zip
{NAME}_{VER}{NAME}_{VER}_freebsd_amd64.zip
{NAME}_{VER}{NAME}_{VER}_freebsd_arm.zip
{NAME}_{VER}{NAME}_{VER}_linux_386.zip
{NAME}_{VER}{NAME}_{VER}_linux_amd64.zip
{NAME}_{VER}{NAME}_{VER}_linux_arm.zip
{NAME}_{VER}{NAME}_{VER}_openbsd_386.zip
{NAME}_{VER}{NAME}_{VER}_openbsd_amd64.zip
{NAME}_{VER}{NAME}_{VER}_solaris_amd64.zip
{NAME}_{VER}{NAME}_{VER}_windows_386.zip
{NAME}_{VER}{NAME}_{VER}_windows_amd64.zip
{NAME}{NAME}-{VER}.dmg
{NAME}{VER}.aix-ppc64.tar.gz
{NAME}{VER}.darwin-386-osx10.6.pkg
{NAME}{VER}.darwin-386-osx10.6.tar.gz
{NAME}{VER}.darwin-386-osx10.8.pkg
{NAME}{VER}.darwin-386-osx10.8.tar.gz
{NAME}{VER}.darwin-amd64-osx10.6.pkg
{NAME}{VER}.darwin-amd64-osx10.6.tar.gz
{NAME}{VER}.darwin-amd64-osx10.8.pkg
{NAME}{VER}.darwin-amd64-osx10.8.tar.gz
{NAME}{VER}.darwin-amd64.pkg
{NAME}{VER}.darwin-amd64.tar.gz
{NAME}{VER}.darwin-arm64.pkg
{NAME}{VER}.darwin-arm64.tar.gz
{NAME}{VER}.dragonfly-amd64.tar.gz
{NAME}{VER}.freebsd-386.tar.gz
{NAME}{VER}.freebsd-amd64.tar.gz
{NAME}{VER}.freebsd-arm.tar.gz
{NAME}{VER}.freebsd-arm64.tar.gz
{NAME}{VER}.freebsd-riscv64.tar.gz
{NAME}{VER}.illumos-amd64.tar.gz
{NAME}{VER}.linux-386.tar.gz
{NAME}{VER}.linux-amd64.tar.gz
{NAME}{VER}.linux-arm.tar.gz
{NAME}{VER}.linux-arm6.tar.gz
{NAME}{VER}.linux-arm64.tar.gz
{NAME}{VER}.linux-armv6l.tar.gz
{NAME}{VER}.linux-loong64.tar.gz
{NAME}{VER}.linux-mips.tar.gz
{NAME}{VER}.linux-mips64.tar.gz
{NAME}{VER}.linux-mips64le.tar.gz
{NAME}{VER}.linux-mipsle.tar.gz
{NAME}{VER}.linux-ppc64.tar.gz
{NAME}{VER}.linux-ppc64le.tar.gz
{NAME}{VER}.linux-riscv64.tar.gz
{NAME}{VER}.linux-s390x.tar.gz
{NAME}{VER}.netbsd-386.tar.gz
{NAME}{VER}.netbsd-amd64.tar.gz
{NAME}{VER}.netbsd-arm.tar.gz
{NAME}{VER}.netbsd-arm64.tar.gz
{NAME}{VER}.openbsd-386.tar.gz
{NAME}{VER}.openbsd-amd64.tar.gz
{NAME}{VER}.openbsd-arm.tar.gz
{NAME}{VER}.openbsd-arm64.tar.gz
{NAME}{VER}.plan9-386.tar.gz
{NAME}{VER}.plan9-amd64.tar.gz
{NAME}{VER}.plan9-arm.tar.gz
{NAME}{VER}.solaris-amd64.tar.gz
{NAME}{VER}.windows-386.msi
{NAME}{VER}.windows-386.zip
{NAME}{VER}.windows-amd64.msi
{NAME}{VER}.windows-amd64.zip
{NAME}{VER}.windows-arm.msi
{NAME}{VER}.windows-arm.zip
{NAME}{VER}.windows-arm64.msi
{NAME}{VER}.windows-arm64.zip
{VER}/{NAME}-freebsd-x86_64-{VER}.tar.xz
{VER}/{NAME}-linux-aarch64-{VER}.tar.xz
{VER}/{NAME}-linux-armv6kz-{VER}.tar.xz
{VER}/{NAME}-linux-armv7a-{VER}.tar.xz
{VER}/{NAME}-linux-i386-{VER}.tar.xz
{VER}/{NAME}-linux-powerpc-{VER}.tar.xz
{VER}/{NAME}-linux-powerpc64le-{VER}.tar.xz
{VER}/{NAME}-linux-riscv64-{VER}.tar.xz
{VER}/{NAME}-linux-x86-{VER}.tar.xz
{VER}/{NAME}-linux-x86_64-{VER}.tar.xz
{VER}/{NAME}-macos-aarch64-{VER}.tar.xz
{VER}/{NAME}-macos-x86_64-{VER}.tar.xz
{VER}/{NAME}-win64-{VER}.zip
{VER}/{NAME}-windows-aarch64-{VER}.zip
{VER}/{NAME}-windows-i386-{VER}.zip
{VER}/{NAME}-windows-x86-{VER}.zip
{VER}/{NAME}-windows-x86_64-{VER}.zip
{VER}/{NAME}-{VER}-aix-ppc64.tar.gz
{VER}/{NAME}-{VER}-aix-ppc64.tar.xz
{VER}/{NAME}-{VER}-darwin-arm64.tar.gz
{VER}/{NAME}-{VER}-darwin-arm64.tar.xz
{VER}/{NAME}-{VER}-darwin-x64.pkg
{VER}/{NAME}-{VER}-darwin-x64.tar.gz
{VER}/{NAME}-{VER}-darwin-x64.tar.xz
{VER}/{NAME}-{VER}-linux-arm64.tar.gz
{VER}/{NAME}-{VER}-linux-arm64.tar.xz
{VER}/{NAME}-{VER}-linux-armv6l.tar.gz
{VER}/{NAME}-{VER}-linux-armv6l.tar.xz
{VER}/{NAME}-{VER}-linux-armv7l.tar.gz
{VER}/{NAME}-{VER}-linux-armv7l.tar.xz
{VER}/{NAME}-{VER}-linux-loong64.tar.gz
{VER}/{NAME}-{VER}-linux-loong64.tar.xz
{VER}/{NAME}-{VER}-linux-ppc64le.tar.gz
{VER}/{NAME}-{VER}-linux-ppc64le.tar.xz
{VER}/{NAME}-{VER}-linux-riscv64.tar.gz
{VER}/{NAME}-{VER}-linux-riscv64.tar.xz
{VER}/{NAME}-{VER}-linux-s390x.tar.gz
{VER}/{NAME}-{VER}-linux-s390x.tar.xz
{VER}/{NAME}-{VER}-linux-x64-musl.tar.gz
{VER}/{NAME}-{VER}-linux-x64-musl.tar.xz
{VER}/{NAME}-{VER}-linux-x64.tar.gz
{VER}/{NAME}-{VER}-linux-x64.tar.xz
{VER}/{NAME}-{VER}-linux-x86.tar.gz
{VER}/{NAME}-{VER}-linux-x86.tar.xz
{VER}/{NAME}-{VER}-win-arm64.zip
{VER}/{NAME}-{VER}-win-x64.zip
{VER}/{NAME}-{VER}-win-x86.zip
{VER}/{NAME}-{VER}-x64.msi
{VER}/{NAME}-{VER}-x86.msi
{VER}/{NAME}_linux32.zip
{VER}/{NAME}_linux64.zip
{VER}/{NAME}_mac32.zip
{VER}/{NAME}_mac64.zip
{VER}/{NAME}_mac64_m1.zip
{VER}/{NAME}_mac_arm64.zip
{VER}/{NAME}_win32.zip
{VER}/{NAME}_win32_debug.zip

All potentially ambiguous arms:

NAME-VER-arm-linux-gnueabihf-debug.tar.gz	dashcore
NAME-VER-arm-linux-gnueabihf-debug.tar.gz	dashd
NAME-VER-arm-linux-gnueabihf.tar.gz	dashcore
NAME-VER-arm-linux-gnueabihf.tar.gz	dashd
NAME-VER-arm-unknown-linux-gnueabihf.tar.gz	bat
NAME-VER-arm-unknown-linux-gnueabihf.tar.gz	delta
NAME-VER-arm-unknown-linux-gnueabihf.tar.gz	fd
NAME-VER-arm-unknown-linux-gnueabihf.tar.gz	hexyl
NAME-VER-arm-unknown-linux-gnueabihf.tar.gz	lsd
NAME-VER-arm-unknown-linux-gnueabihf.tar.gz	rg
NAME-VER-arm-unknown-linux-gnueabihf.tar.gz	sd
NAME-VER-arm-unknown-linux-musleabihf.tar.gz	bat
NAME-VER-arm-unknown-linux-musleabihf.tar.gz	fd
NAME-VER-arm-unknown-linux-musleabihf.tar.gz	hexyl
NAME-VER-arm-unknown-linux-musleabihf.tar.gz	zoxide
NAME-VER-freebsd-arm.zip	rclone
NAME-VER-linux-arm.tar.gz	sass
NAME-VER-linux-arm.zip	rclone
NAME-VER-netbsd-arm.zip	rclone
NAME-freebsd-arm-VER.tar.gz	syncthing
NAME-freebsd-arm.tar.gz	lf
NAME-linux-arm	ffmpeg
NAME-linux-arm	kind
NAME-linux-arm-VER.tar.gz	syncthing
NAME-linux-arm.gz	ffmpeg
NAME-linux-arm.tar.gz	lf
NAME-netbsd-arm-VER.tar.gz	syncthing
NAME-netbsd-arm.tar.gz	lf
NAME-openbsd-arm-VER.tar.gz	syncthing
NAME-openbsd-arm.tar.gz	lf
NAME-windows-arm-VER.zip	syncthing
NAMEVER.freebsd-arm.tar.gz	go
NAMEVER.linux-arm.tar.gz	tinygo
NAMEVER.netbsd-arm.tar.gz	go
NAMEVER.openbsd-arm.tar.gz	go
NAMEVER.plan9-arm.tar.gz	go
NAMEVER.windows-arm.msi	go
NAMEVER.windows-arm.zip	go
NAME_VER_linux-arm.tar.gz	hugo
linux-arm	ffmpeg
linux-arm.gz	ffmpeg
cut -f1,2 builds.tsv | sort -u -k1 | rg -v '^#|^https?:' | rg 'go|ffmpeg|hugo|syncthing|lf|kind|rclone|sass|hexyl|dashd' | rg 'arm64|aarch64' | cut -f2 | sort -u

All of them can be disambiguated as NOT arm64.

I think Terraform is the only one that actually uses arm to mean arm64, and that's already being handled as a special case.

Thank you for pushing this through to the finish line. Hotfix appears to have fixed my installation errors.

Closing this out since not just the workaround, but the permanent fix is now live in production.

Oh, and although I didn't add a "unit test" per se, _webi/lint-builds.js fulfills the function of detecting mismatched triple targets.

There's a hierarchy of matches in which arm matches later than arm64, so if a perfect match, such as arm64 or aarch64 is found, but the suggested build target is something different, it throws.