fix(bun): prefer baseline linux releases (fix #879)

This commit is contained in:
Tori0419
2026-03-09 00:25:20 +08:00
committed by AJ ONeal
parent 3e2e7f2f65
commit 303417d513
2 changed files with 138 additions and 27 deletions

View File

@@ -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);

61
bun/releases.test.js Normal file
View File

@@ -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'],
);
});