From 303417d513cd1a5d89a3bd4623584bfab1549a8b Mon Sep 17 00:00:00 2001 From: Tori0419 <17581705419@163.com> Date: Mon, 9 Mar 2026 00:25:20 +0800 Subject: [PATCH] fix(bun): prefer baseline linux releases (fix #879) --- bun/releases.js | 104 ++++++++++++++++++++++++++++++++----------- bun/releases.test.js | 61 +++++++++++++++++++++++++ 2 files changed, 138 insertions(+), 27 deletions(-) create mode 100644 bun/releases.test.js diff --git a/bun/releases.js b/bun/releases.js index b54035d..f4dd475 100644 --- a/bun/releases.js +++ b/bun/releases.js @@ -4,39 +4,89 @@ var github = require('../_common/github.js'); var owner = 'oven-sh'; var repo = 'bun'; +function isDebugRelease(release) { + return release.name.includes('-profile'); +} + +function isBaselineRelease(release) { + return release.name.includes('-baseline'); +} + +function getLinuxAmd64Target(name) { + let match = name.match(/bun-(linux-x64(?:-musl)?)(?:-baseline)?[.]/); + if (!match) { + return ''; + } + + return match[1]; +} + +function prepareRelease(release) { + if (isDebugRelease(release)) { + return null; + } + + let rel = Object.assign({}, release); + if (isBaselineRelease(rel)) { + rel._baseline = true; + } + + let isMusl = rel.name.includes('-musl'); + if (isMusl) { + rel._musl = true; + rel.libc = 'musl'; + } else if (rel.name.includes('-linux-')) { + rel.libc = 'gnu'; + } + + // bun's baseline Linux x64 builds avoid SIGILL on older/container CPUs. + rel._target = getLinuxAmd64Target(rel.name); + rel.version = rel.version.replace(/bun-/g, ''); + + return rel; +} + +function compareReleasePriority(a, b) { + if (a.version !== b.version) { + return 0; + } + + if (!a._target || a._target !== b._target) { + return 0; + } + + if (a._baseline && !b._baseline) { + return -1; + } + if (!a._baseline && b._baseline) { + return 1; + } + + return 0; +} + +function normalizeReleases(releases) { + return releases + .map(prepareRelease) + .filter(Boolean) + .sort(compareReleasePriority) + .map(function (release) { + delete release._target; + return release; + }); +} + module.exports = function () { return github(null, owner, repo).then(function (all) { - all.releases = all.releases - .filter(function (r) { - let isDebug = r.name.includes('-profile'); - if (isDebug) { - return false; - } - - let isAncient = r.name.includes('-baseline'); - if (isAncient) { - return false; - } - - let isMusl = r.name.includes('-musl'); - if (isMusl) { - r._musl = true; - r.libc = 'musl'; - } else if (r.os === 'linux') { - r.libc = 'gnu'; - } - - return true; - }) - .map(function (r) { - // bun-v0.5.1 => v0.5.1 - r.version = r.version.replace(/bun-/g, ''); - return r; - }); + all.releases = normalizeReleases(all.releases); return all; }); }; +module.exports._normalizeReleases = normalizeReleases; +module.exports._prepareRelease = prepareRelease; +module.exports._compareReleasePriority = compareReleasePriority; + if (module === require.main) { module.exports().then(function (all) { all = require('../_webi/normalize.js')(all); diff --git a/bun/releases.test.js b/bun/releases.test.js new file mode 100644 index 0000000..91ba279 --- /dev/null +++ b/bun/releases.test.js @@ -0,0 +1,61 @@ +'use strict'; + +let test = require('node:test'); +let assert = require('node:assert/strict'); + +let BunReleases = require('./releases.js'); + +test('keeps Linux baseline builds and prefers them over default x64 assets', function () { + let releases = [ + { name: 'bun-linux-x64.zip', version: 'bun-v1.2.21', os: 'linux' }, + { + name: 'bun-linux-x64-baseline.zip', + version: 'bun-v1.2.21', + os: 'linux', + }, + { name: 'bun-linux-x64-musl.zip', version: 'bun-v1.2.21', os: 'linux' }, + { + name: 'bun-linux-x64-musl-baseline.zip', + version: 'bun-v1.2.21', + os: 'linux', + }, + { + name: 'bun-linux-x64-profile.zip', + version: 'bun-v1.2.21', + os: 'linux', + }, + ]; + + let normalized = BunReleases._normalizeReleases(releases); + + assert.deepEqual( + normalized.map(function (release) { + return release.name; + }), + [ + 'bun-linux-x64-baseline.zip', + 'bun-linux-x64.zip', + 'bun-linux-x64-musl-baseline.zip', + 'bun-linux-x64-musl.zip', + ], + ); + assert.equal(normalized[0]._baseline, true); + assert.equal(normalized[0].libc, 'gnu'); + assert.equal(normalized[2].libc, 'musl'); +}); + +test('leaves non-Linux targets in their original order', function () { + let releases = [ + { name: 'bun-darwin-aarch64.zip', version: 'bun-v1.2.21', os: 'macos' }, + { name: 'bun-windows-x64.zip', version: 'bun-v1.2.21', os: 'windows' }, + ]; + + let normalized = BunReleases._normalizeReleases(releases); + + assert.deepEqual( + normalized.map(function (release) { + return release.name; + }), + ['bun-darwin-aarch64.zip', 'bun-windows-x64.zip'], + ); +});