about summary refs log tree commit diff
path: root/editors/code/src
diff options
context:
space:
mode:
authorVeetaha <gerzoh1@gmail.com>2020-03-08 00:01:48 +0200
committerVeetaha <gerzoh1@gmail.com>2020-03-08 00:01:48 +0200
commitc29a502e2549aba7e47a6f40581e5ccf74b5f481 (patch)
tree72e84436a18794f40ffc93757d4c29075f9c3de8 /editors/code/src
parent9dae94a78dd5b660dd97f884b91067c55b4a418e (diff)
downloadrust-c29a502e2549aba7e47a6f40581e5ccf74b5f481.tar.gz
rust-c29a502e2549aba7e47a6f40581e5ccf74b5f481.zip
vscode: care about alwaysDownloadServer option before asking
Also renamed BinarySource to ArtifactSource in anticipation of
nightlies installation that requires downloading
not a binary itself but .vsix package, thus generalized
to `artifact` term
Diffstat (limited to 'editors/code/src')
-rw-r--r--editors/code/src/config.ts11
-rw-r--r--editors/code/src/installation/interfaces.ts15
-rw-r--r--editors/code/src/installation/server.ts28
3 files changed, 31 insertions, 23 deletions
diff --git a/editors/code/src/config.ts b/editors/code/src/config.ts
index bf915102c80..c4acb632dbf 100644
--- a/editors/code/src/config.ts
+++ b/editors/code/src/config.ts
@@ -1,6 +1,6 @@
 import * as os from "os";
 import * as vscode from 'vscode';
-import { BinarySource } from "./installation/interfaces";
+import { ArtifactSource } from "./installation/interfaces";
 import { log } from "./util";
 
 const RA_LSP_DEBUG = process.env.__RA_LSP_SERVER_DEBUG;
@@ -114,12 +114,12 @@ export class Config {
         }
     }
 
-    get serverSource(): null | BinarySource {
+    get serverSource(): null | ArtifactSource {
         const serverPath = RA_LSP_DEBUG ?? this.cfg.get<null | string>("serverPath");
 
         if (serverPath) {
             return {
-                type: BinarySource.Type.ExplicitPath,
+                type: ArtifactSource.Type.ExplicitPath,
                 path: Config.replaceTildeWithHomeDir(serverPath)
             };
         }
@@ -129,11 +129,12 @@ export class Config {
         if (!prebuiltBinaryName) return null;
 
         return {
-            type: BinarySource.Type.GithubRelease,
+            type: ArtifactSource.Type.GithubRelease,
             dir: this.ctx.globalStoragePath,
             file: prebuiltBinaryName,
             storage: this.ctx.globalState,
-            version: Config.extensionVersion,
+            tag: Config.extensionVersion,
+            askBeforeDownload: !(this.cfg.get("alwaysDownloadServer") as boolean),
             repo: {
                 name: "rust-analyzer",
                 owner: "rust-analyzer",
diff --git a/editors/code/src/installation/interfaces.ts b/editors/code/src/installation/interfaces.ts
index e40839e4b2b..50b63592186 100644
--- a/editors/code/src/installation/interfaces.ts
+++ b/editors/code/src/installation/interfaces.ts
@@ -14,14 +14,14 @@ export interface ArtifactReleaseInfo {
 }
 
 /**
- * Represents the source of a binary artifact which is either specified by the user
+ * Represents the source of a an artifact which is either specified by the user
  * explicitly, or bundled by this extension from GitHub releases.
  */
-export type BinarySource = BinarySource.ExplicitPath | BinarySource.GithubRelease;
+export type ArtifactSource = ArtifactSource.ExplicitPath | ArtifactSource.GithubRelease;
 
-export namespace BinarySource {
+export namespace ArtifactSource {
     /**
-     * Type tag for `BinarySource` discriminated union.
+     * Type tag for `ArtifactSource` discriminated union.
      */
     export const enum Type { ExplicitPath, GithubRelease }
 
@@ -56,13 +56,18 @@ export namespace BinarySource {
         /**
          * Tag of github release that denotes a version required by this extension.
          */
-        version: string;
+        tag: string;
 
         /**
          * Object that provides `get()/update()` operations to store metadata
          * about the actual binary, e.g. its actual version.
          */
         storage: vscode.Memento;
+
+        /**
+         * Ask for the user permission before downloading the artifact.
+         */
+        askBeforeDownload: boolean;
     }
 
 }
diff --git a/editors/code/src/installation/server.ts b/editors/code/src/installation/server.ts
index 6a6cf4f8c3a..ef1c45ff659 100644
--- a/editors/code/src/installation/server.ts
+++ b/editors/code/src/installation/server.ts
@@ -3,12 +3,12 @@ import * as path from "path";
 import { promises as dns } from "dns";
 import { spawnSync } from "child_process";
 
-import { BinarySource } from "./interfaces";
+import { ArtifactSource } from "./interfaces";
 import { fetchArtifactReleaseInfo } from "./fetch_artifact_release_info";
 import { downloadArtifact } from "./download_artifact";
 import { log, assert } from "../util";
 
-export async function ensureServerBinary(source: null | BinarySource): Promise<null | string> {
+export async function ensureServerBinary(source: null | ArtifactSource): Promise<null | string> {
     if (!source) {
         vscode.window.showErrorMessage(
             "Unfortunately we don't ship binaries for your platform yet. " +
@@ -22,7 +22,7 @@ export async function ensureServerBinary(source: null | BinarySource): Promise<n
     }
 
     switch (source.type) {
-        case BinarySource.Type.ExplicitPath: {
+        case ArtifactSource.Type.ExplicitPath: {
             if (isBinaryAvailable(source.path)) {
                 return source.path;
             }
@@ -34,11 +34,11 @@ export async function ensureServerBinary(source: null | BinarySource): Promise<n
             );
             return null;
         }
-        case BinarySource.Type.GithubRelease: {
+        case ArtifactSource.Type.GithubRelease: {
             const prebuiltBinaryPath = path.join(source.dir, source.file);
 
             const installedVersion: null | string = getServerVersion(source.storage);
-            const requiredVersion: string = source.version;
+            const requiredVersion: string = source.tag;
 
             log.debug("Installed version:", installedVersion, "required:", requiredVersion);
 
@@ -46,12 +46,14 @@ export async function ensureServerBinary(source: null | BinarySource): Promise<n
                 return prebuiltBinaryPath;
             }
 
-            const userResponse = await vscode.window.showInformationMessage(
-                `Language server version ${source.version} for rust-analyzer is not installed. ` +
-                "Do you want to download it now?",
-                "Download now", "Cancel"
-            );
-            if (userResponse !== "Download now") return null;
+            if (source.askBeforeDownload) {
+                const userResponse = await vscode.window.showInformationMessage(
+                    `Language server version ${source.tag} for rust-analyzer is not installed. ` +
+                    "Do you want to download it now?",
+                    "Download now", "Cancel"
+                );
+                if (userResponse !== "Download now") return null;
+            }
 
             if (!await downloadServer(source)) return null;
 
@@ -60,9 +62,9 @@ export async function ensureServerBinary(source: null | BinarySource): Promise<n
     }
 }
 
-async function downloadServer(source: BinarySource.GithubRelease): Promise<boolean> {
+async function downloadServer(source: ArtifactSource.GithubRelease): Promise<boolean> {
     try {
-        const releaseInfo = await fetchArtifactReleaseInfo(source.repo, source.file, source.version);
+        const releaseInfo = await fetchArtifactReleaseInfo(source.repo, source.file, source.tag);
 
         await downloadArtifact(releaseInfo, source.file, source.dir, "language server");
         await setServerVersion(source.storage, releaseInfo.releaseName);