mirror of
https://github.com/webinstall/webi-installers.git
synced 2026-04-05 09:56:50 +00:00
fix(bun): prefer baseline linux releases (fix #879)
This commit is contained in:
104
bun/releases.js
104
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);
|
||||
|
||||
61
bun/releases.test.js
Normal file
61
bun/releases.test.js
Normal 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'],
|
||||
);
|
||||
});
|
||||
Reference in New Issue
Block a user