7729: Try to detect musl distros in the Code extension r=andylizi a=lnicola

Fixes https://github.com/rust-analyzer/rust-analyzer/pull/7658#issuecomment-782701138

Co-authored-by: Laurențiu Nicola <lnicola@dend.ro>
This commit is contained in:
bors[bot] 2021-02-20 17:35:37 +00:00 committed by GitHub
commit 0b4ec3c4e8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -12,7 +12,7 @@ import { PersistentState } from './persistent_state';
import { fetchRelease, download } from './net';
import { activateTaskProvider } from './tasks';
import { setContextValue } from './util';
import { exec } from 'child_process';
import { exec, spawnSync } from 'child_process';
let ctx: Ctx | undefined;
@ -297,7 +297,7 @@ async function getServer(config: Config, state: PersistentState): Promise<string
"arm64 linux": "aarch64-unknown-linux-gnu",
"arm64 darwin": "aarch64-apple-darwin",
};
const platform = platforms[`${process.arch} ${process.platform}`];
let platform = platforms[`${process.arch} ${process.platform}`];
if (platform === undefined) {
await vscode.window.showErrorMessage(
"Unfortunately we don't ship binaries for your platform yet. " +
@ -309,6 +309,9 @@ async function getServer(config: Config, state: PersistentState): Promise<string
);
return undefined;
}
if (platform === "x86_64-unknown-linux-gnu" && isMusl()) {
platform = "x86_64-unknown-linux-musl";
}
const ext = platform.indexOf("-windows-") !== -1 ? ".exe" : "";
const dest = path.join(config.globalStoragePath, `rust-analyzer-${platform}${ext}`);
const exists = await fs.stat(dest).then(() => true, () => false);
@ -365,6 +368,13 @@ async function isNixOs(): Promise<boolean> {
}
}
function isMusl(): boolean {
// We can detect Alpine by checking `/etc/os-release` but not Void Linux musl.
// Instead, we run `ldd` since it advertises the libc which it belongs to.
const res = spawnSync("ldd", ["--version"]);
return res.stderr != null && res.stderr.indexOf("musl libc") >= 0;
}
async function downloadWithRetryDialog<T>(state: PersistentState, downloadFunc: () => Promise<T>): Promise<T> {
while (true) {
try {