diff options
Diffstat (limited to 'editors/code/src')
-rw-r--r-- | editors/code/src/installation/download_artifact.ts | 50 | ||||
-rw-r--r-- | editors/code/src/installation/downloads.ts (renamed from editors/code/src/installation/download_file.ts) | 46 |
2 files changed, 46 insertions, 50 deletions
diff --git a/editors/code/src/installation/download_artifact.ts b/editors/code/src/installation/download_artifact.ts deleted file mode 100644 index 97e4d67c2..000000000 --- a/editors/code/src/installation/download_artifact.ts +++ /dev/null | |||
@@ -1,50 +0,0 @@ | |||
1 | import * as vscode from "vscode"; | ||
2 | import * as path from "path"; | ||
3 | import { promises as fs } from "fs"; | ||
4 | |||
5 | import { ArtifactReleaseInfo } from "./interfaces"; | ||
6 | import { downloadFile } from "./download_file"; | ||
7 | import { assert } from "../util"; | ||
8 | |||
9 | /** | ||
10 | * Downloads artifact from given `downloadUrl`. | ||
11 | * Creates `installationDir` if it is not yet created and put the artifact under | ||
12 | * `artifactFileName`. | ||
13 | * Displays info about the download progress in an info message printing the name | ||
14 | * of the artifact as `displayName`. | ||
15 | */ | ||
16 | export async function downloadArtifact( | ||
17 | { downloadUrl, releaseName }: ArtifactReleaseInfo, | ||
18 | artifactFileName: string, | ||
19 | installationDir: string, | ||
20 | displayName: string, | ||
21 | ) { | ||
22 | await fs.mkdir(installationDir).catch(err => assert( | ||
23 | err?.code === "EEXIST", | ||
24 | `Couldn't create directory "${installationDir}" to download ` + | ||
25 | `${artifactFileName} artifact: ${err?.message}` | ||
26 | )); | ||
27 | |||
28 | const installationPath = path.join(installationDir, artifactFileName); | ||
29 | |||
30 | await vscode.window.withProgress( | ||
31 | { | ||
32 | location: vscode.ProgressLocation.Notification, | ||
33 | cancellable: false, // FIXME: add support for canceling download? | ||
34 | title: `Downloading ${displayName} (${releaseName})` | ||
35 | }, | ||
36 | async (progress, _cancellationToken) => { | ||
37 | let lastPrecentage = 0; | ||
38 | const filePermissions = 0o755; // (rwx, r_x, r_x) | ||
39 | await downloadFile(downloadUrl, installationPath, filePermissions, (readBytes, totalBytes) => { | ||
40 | const newPercentage = (readBytes / totalBytes) * 100; | ||
41 | progress.report({ | ||
42 | message: newPercentage.toFixed(0) + "%", | ||
43 | increment: newPercentage - lastPrecentage | ||
44 | }); | ||
45 | |||
46 | lastPrecentage = newPercentage; | ||
47 | }); | ||
48 | } | ||
49 | ); | ||
50 | } | ||
diff --git a/editors/code/src/installation/download_file.ts b/editors/code/src/installation/downloads.ts index ee8949d61..7ce2e2960 100644 --- a/editors/code/src/installation/download_file.ts +++ b/editors/code/src/installation/downloads.ts | |||
@@ -1,8 +1,11 @@ | |||
1 | import fetch from "node-fetch"; | 1 | import fetch from "node-fetch"; |
2 | import * as vscode from "vscode"; | ||
3 | import * as path from "path"; | ||
2 | import * as fs from "fs"; | 4 | import * as fs from "fs"; |
3 | import * as stream from "stream"; | 5 | import * as stream from "stream"; |
4 | import * as util from "util"; | 6 | import * as util from "util"; |
5 | import { log, assert } from "../util"; | 7 | import { log, assert } from "../util"; |
8 | import { ArtifactReleaseInfo } from "./interfaces"; | ||
6 | 9 | ||
7 | const pipeline = util.promisify(stream.pipeline); | 10 | const pipeline = util.promisify(stream.pipeline); |
8 | 11 | ||
@@ -49,3 +52,46 @@ export async function downloadFile( | |||
49 | // Issue at nodejs repo: https://github.com/nodejs/node/issues/31776 | 52 | // Issue at nodejs repo: https://github.com/nodejs/node/issues/31776 |
50 | }); | 53 | }); |
51 | } | 54 | } |
55 | |||
56 | /** | ||
57 | * Downloads artifact from given `downloadUrl`. | ||
58 | * Creates `installationDir` if it is not yet created and puts the artifact under | ||
59 | * `artifactFileName`. | ||
60 | * Displays info about the download progress in an info message printing the name | ||
61 | * of the artifact as `displayName`. | ||
62 | */ | ||
63 | export async function downloadArtifactWithProgressUi( | ||
64 | { downloadUrl, releaseName }: ArtifactReleaseInfo, | ||
65 | artifactFileName: string, | ||
66 | installationDir: string, | ||
67 | displayName: string, | ||
68 | ) { | ||
69 | await fs.promises.mkdir(installationDir).catch(err => assert( | ||
70 | err?.code === "EEXIST", | ||
71 | `Couldn't create directory "${installationDir}" to download ` + | ||
72 | `${artifactFileName} artifact: ${err?.message}` | ||
73 | )); | ||
74 | |||
75 | const installationPath = path.join(installationDir, artifactFileName); | ||
76 | |||
77 | await vscode.window.withProgress( | ||
78 | { | ||
79 | location: vscode.ProgressLocation.Notification, | ||
80 | cancellable: false, // FIXME: add support for canceling download? | ||
81 | title: `Downloading rust-analyzer ${displayName} (${releaseName})` | ||
82 | }, | ||
83 | async (progress, _cancellationToken) => { | ||
84 | let lastPrecentage = 0; | ||
85 | const filePermissions = 0o755; // (rwx, r_x, r_x) | ||
86 | await downloadFile(downloadUrl, installationPath, filePermissions, (readBytes, totalBytes) => { | ||
87 | const newPercentage = (readBytes / totalBytes) * 100; | ||
88 | progress.report({ | ||
89 | message: newPercentage.toFixed(0) + "%", | ||
90 | increment: newPercentage - lastPrecentage | ||
91 | }); | ||
92 | |||
93 | lastPrecentage = newPercentage; | ||
94 | }); | ||
95 | } | ||
96 | ); | ||
97 | } | ||