Merge #7729
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:
commit
0b4ec3c4e8
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user