11047: internal: Prepare Code extension for bundling r=lnicola a=lnicola

CC #10483

This is slightly ugly, but we'll be able to clean it up after ripping the download parts (unless we decide to temporarily drop support for the nightlies).

Co-authored-by: Laurențiu Nicola <lnicola@dend.ro>
This commit is contained in:
bors[bot] 2021-12-18 18:32:20 +00:00 committed by GitHub
commit 4c686721c0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 19 additions and 1 deletions

View file

@ -74,6 +74,8 @@ The server binary is stored in:
* macOS: `~/Library/Application\ Support/Code/User/globalStorage/matklad.rust-analyzer`
* Windows: `%APPDATA%\Code\User\globalStorage\matklad.rust-analyzer`
However, if you are using a version of the extension with a bundled server binary and you are not running NixOS, the server binary might be instead running from: `~/.vscode/extensions/matklad.rust-analyzer-VERSION`.
Note that we only support two most recent versions of VS Code.
==== Updates

View file

@ -10,4 +10,5 @@
!package-lock.json
!package.json
!ra_syntax_tree.tmGrammar.json
!server
!README.md

View file

@ -36,9 +36,11 @@ export class Config {
} = vscode.extensions.getExtension(this.extensionId)!.packageJSON;
readonly globalStorageUri: vscode.Uri;
readonly installUri: vscode.Uri;
constructor(ctx: vscode.ExtensionContext) {
this.globalStorageUri = ctx.globalStorageUri;
this.installUri = ctx.extensionUri;
vscode.workspace.onDidChangeConfiguration(this.onDidChangeConfiguration, this, ctx.subscriptions);
this.refreshLogging();
}

View file

@ -345,7 +345,20 @@ async function getServer(config: Config, state: PersistentState): Promise<string
}
const ext = platform.indexOf("-windows-") !== -1 ? ".exe" : "";
const dest = vscode.Uri.joinPath(config.globalStorageUri, `rust-analyzer-${platform}${ext}`);
const exists = await vscode.workspace.fs.stat(dest).then(() => true, () => false);
const bundled = vscode.Uri.joinPath(config.installUri, "server", `rust-analyzer${ext}`);
const bundledExists = await vscode.workspace.fs.stat(bundled).then(() => true, () => false);
let exists = await vscode.workspace.fs.stat(dest).then(() => true, () => false);
if (bundledExists) {
await state.updateServerVersion(config.package.version);
if (!await isNixOs()) {
return bundled.fsPath;
}
if (!exists) {
await vscode.workspace.fs.copy(bundled, dest);
await patchelf(dest);
exists = true;
}
}
if (!exists) {
await state.updateServerVersion(undefined);
}