aboutsummaryrefslogtreecommitdiff
path: root/editors/code/src/installation
diff options
context:
space:
mode:
Diffstat (limited to 'editors/code/src/installation')
-rw-r--r--editors/code/src/installation/interfaces.ts15
-rw-r--r--editors/code/src/installation/server.ts28
2 files changed, 25 insertions, 18 deletions
diff --git a/editors/code/src/installation/interfaces.ts b/editors/code/src/installation/interfaces.ts
index e40839e4b..50b635921 100644
--- a/editors/code/src/installation/interfaces.ts
+++ b/editors/code/src/installation/interfaces.ts
@@ -14,14 +14,14 @@ export interface ArtifactReleaseInfo {
14} 14}
15 15
16/** 16/**
17 * Represents the source of a binary artifact which is either specified by the user 17 * Represents the source of a an artifact which is either specified by the user
18 * explicitly, or bundled by this extension from GitHub releases. 18 * explicitly, or bundled by this extension from GitHub releases.
19 */ 19 */
20export type BinarySource = BinarySource.ExplicitPath | BinarySource.GithubRelease; 20export type ArtifactSource = ArtifactSource.ExplicitPath | ArtifactSource.GithubRelease;
21 21
22export namespace BinarySource { 22export namespace ArtifactSource {
23 /** 23 /**
24 * Type tag for `BinarySource` discriminated union. 24 * Type tag for `ArtifactSource` discriminated union.
25 */ 25 */
26 export const enum Type { ExplicitPath, GithubRelease } 26 export const enum Type { ExplicitPath, GithubRelease }
27 27
@@ -56,13 +56,18 @@ export namespace BinarySource {
56 /** 56 /**
57 * Tag of github release that denotes a version required by this extension. 57 * Tag of github release that denotes a version required by this extension.
58 */ 58 */
59 version: string; 59 tag: string;
60 60
61 /** 61 /**
62 * Object that provides `get()/update()` operations to store metadata 62 * Object that provides `get()/update()` operations to store metadata
63 * about the actual binary, e.g. its actual version. 63 * about the actual binary, e.g. its actual version.
64 */ 64 */
65 storage: vscode.Memento; 65 storage: vscode.Memento;
66
67 /**
68 * Ask for the user permission before downloading the artifact.
69 */
70 askBeforeDownload: boolean;
66 } 71 }
67 72
68} 73}
diff --git a/editors/code/src/installation/server.ts b/editors/code/src/installation/server.ts
index 6a6cf4f8c..ef1c45ff6 100644
--- a/editors/code/src/installation/server.ts
+++ b/editors/code/src/installation/server.ts
@@ -3,12 +3,12 @@ import * as path from "path";
3import { promises as dns } from "dns"; 3import { promises as dns } from "dns";
4import { spawnSync } from "child_process"; 4import { spawnSync } from "child_process";
5 5
6import { BinarySource } from "./interfaces"; 6import { ArtifactSource } from "./interfaces";
7import { fetchArtifactReleaseInfo } from "./fetch_artifact_release_info"; 7import { fetchArtifactReleaseInfo } from "./fetch_artifact_release_info";
8import { downloadArtifact } from "./download_artifact"; 8import { downloadArtifact } from "./download_artifact";
9import { log, assert } from "../util"; 9import { log, assert } from "../util";
10 10
11export async function ensureServerBinary(source: null | BinarySource): Promise<null | string> { 11export async function ensureServerBinary(source: null | ArtifactSource): Promise<null | string> {
12 if (!source) { 12 if (!source) {
13 vscode.window.showErrorMessage( 13 vscode.window.showErrorMessage(
14 "Unfortunately we don't ship binaries for your platform yet. " + 14 "Unfortunately we don't ship binaries for your platform yet. " +
@@ -22,7 +22,7 @@ export async function ensureServerBinary(source: null | BinarySource): Promise<n
22 } 22 }
23 23
24 switch (source.type) { 24 switch (source.type) {
25 case BinarySource.Type.ExplicitPath: { 25 case ArtifactSource.Type.ExplicitPath: {
26 if (isBinaryAvailable(source.path)) { 26 if (isBinaryAvailable(source.path)) {
27 return source.path; 27 return source.path;
28 } 28 }
@@ -34,11 +34,11 @@ export async function ensureServerBinary(source: null | BinarySource): Promise<n
34 ); 34 );
35 return null; 35 return null;
36 } 36 }
37 case BinarySource.Type.GithubRelease: { 37 case ArtifactSource.Type.GithubRelease: {
38 const prebuiltBinaryPath = path.join(source.dir, source.file); 38 const prebuiltBinaryPath = path.join(source.dir, source.file);
39 39
40 const installedVersion: null | string = getServerVersion(source.storage); 40 const installedVersion: null | string = getServerVersion(source.storage);
41 const requiredVersion: string = source.version; 41 const requiredVersion: string = source.tag;
42 42
43 log.debug("Installed version:", installedVersion, "required:", requiredVersion); 43 log.debug("Installed version:", installedVersion, "required:", requiredVersion);
44 44
@@ -46,12 +46,14 @@ export async function ensureServerBinary(source: null | BinarySource): Promise<n
46 return prebuiltBinaryPath; 46 return prebuiltBinaryPath;
47 } 47 }
48 48
49 const userResponse = await vscode.window.showInformationMessage( 49 if (source.askBeforeDownload) {
50 `Language server version ${source.version} for rust-analyzer is not installed. ` + 50 const userResponse = await vscode.window.showInformationMessage(
51 "Do you want to download it now?", 51 `Language server version ${source.tag} for rust-analyzer is not installed. ` +
52 "Download now", "Cancel" 52 "Do you want to download it now?",
53 ); 53 "Download now", "Cancel"
54 if (userResponse !== "Download now") return null; 54 );
55 if (userResponse !== "Download now") return null;
56 }
55 57
56 if (!await downloadServer(source)) return null; 58 if (!await downloadServer(source)) return null;
57 59
@@ -60,9 +62,9 @@ export async function ensureServerBinary(source: null | BinarySource): Promise<n
60 } 62 }
61} 63}
62 64
63async function downloadServer(source: BinarySource.GithubRelease): Promise<boolean> { 65async function downloadServer(source: ArtifactSource.GithubRelease): Promise<boolean> {
64 try { 66 try {
65 const releaseInfo = await fetchArtifactReleaseInfo(source.repo, source.file, source.version); 67 const releaseInfo = await fetchArtifactReleaseInfo(source.repo, source.file, source.tag);
66 68
67 await downloadArtifact(releaseInfo, source.file, source.dir, "language server"); 69 await downloadArtifact(releaseInfo, source.file, source.dir, "language server");
68 await setServerVersion(source.storage, releaseInfo.releaseName); 70 await setServerVersion(source.storage, releaseInfo.releaseName);