diff options
author | Aleksey Kladov <[email protected]> | 2020-03-16 18:23:38 +0000 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2020-03-16 21:02:11 +0000 |
commit | ae662617a2bc49d025adaf9c4a8ff2dfa557d36c (patch) | |
tree | f321ad0a529283bbb276095da7644d8f1ba663d2 /editors/code/src/installation/server.ts | |
parent | 2e9b6320e66cb764b9683a38c284a06b7c35aab6 (diff) |
Separate persistent mutable state from config
That way, we clearly see which things are not change, and we also
clearly see which things are persistent.
Diffstat (limited to 'editors/code/src/installation/server.ts')
-rw-r--r-- | editors/code/src/installation/server.ts | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/editors/code/src/installation/server.ts b/editors/code/src/installation/server.ts index 05730a778..05d326131 100644 --- a/editors/code/src/installation/server.ts +++ b/editors/code/src/installation/server.ts | |||
@@ -7,8 +7,9 @@ import { fetchArtifactReleaseInfo } from "./fetch_artifact_release_info"; | |||
7 | import { downloadArtifactWithProgressUi } from "./downloads"; | 7 | import { downloadArtifactWithProgressUi } from "./downloads"; |
8 | import { log, assert, notReentrant } from "../util"; | 8 | import { log, assert, notReentrant } from "../util"; |
9 | import { Config, NIGHTLY_TAG } from "../config"; | 9 | import { Config, NIGHTLY_TAG } from "../config"; |
10 | import { PersistentState } from "../persistent_state"; | ||
10 | 11 | ||
11 | export async function ensureServerBinary(config: Config): Promise<null | string> { | 12 | export async function ensureServerBinary(config: Config, state: PersistentState): Promise<null | string> { |
12 | const source = config.serverSource; | 13 | const source = config.serverSource; |
13 | 14 | ||
14 | if (!source) { | 15 | if (!source) { |
@@ -37,7 +38,7 @@ export async function ensureServerBinary(config: Config): Promise<null | string> | |||
37 | return null; | 38 | return null; |
38 | } | 39 | } |
39 | case ArtifactSource.Type.GithubRelease: { | 40 | case ArtifactSource.Type.GithubRelease: { |
40 | if (!shouldDownloadServer(source, config)) { | 41 | if (!shouldDownloadServer(state, source)) { |
41 | return path.join(source.dir, source.file); | 42 | return path.join(source.dir, source.file); |
42 | } | 43 | } |
43 | 44 | ||
@@ -50,24 +51,24 @@ export async function ensureServerBinary(config: Config): Promise<null | string> | |||
50 | if (userResponse !== "Download now") return null; | 51 | if (userResponse !== "Download now") return null; |
51 | } | 52 | } |
52 | 53 | ||
53 | return await downloadServer(source, config); | 54 | return await downloadServer(state, source); |
54 | } | 55 | } |
55 | } | 56 | } |
56 | } | 57 | } |
57 | 58 | ||
58 | function shouldDownloadServer( | 59 | function shouldDownloadServer( |
60 | state: PersistentState, | ||
59 | source: ArtifactSource.GithubRelease, | 61 | source: ArtifactSource.GithubRelease, |
60 | config: Config | ||
61 | ): boolean { | 62 | ): boolean { |
62 | if (!isBinaryAvailable(path.join(source.dir, source.file))) return true; | 63 | if (!isBinaryAvailable(path.join(source.dir, source.file))) return true; |
63 | 64 | ||
64 | const installed = { | 65 | const installed = { |
65 | tag: config.serverReleaseTag.get(), | 66 | tag: state.serverReleaseTag.get(), |
66 | date: config.serverReleaseDate.get() | 67 | date: state.serverReleaseDate.get() |
67 | }; | 68 | }; |
68 | const required = { | 69 | const required = { |
69 | tag: source.tag, | 70 | tag: source.tag, |
70 | date: config.installedNightlyExtensionReleaseDate.get() | 71 | date: state.installedNightlyExtensionReleaseDate.get() |
71 | }; | 72 | }; |
72 | 73 | ||
73 | log.debug("Installed server:", installed, "required:", required); | 74 | log.debug("Installed server:", installed, "required:", required); |
@@ -86,16 +87,16 @@ function shouldDownloadServer( | |||
86 | * Enforcing no reentrancy for this is best-effort. | 87 | * Enforcing no reentrancy for this is best-effort. |
87 | */ | 88 | */ |
88 | const downloadServer = notReentrant(async ( | 89 | const downloadServer = notReentrant(async ( |
90 | state: PersistentState, | ||
89 | source: ArtifactSource.GithubRelease, | 91 | source: ArtifactSource.GithubRelease, |
90 | config: Config, | ||
91 | ): Promise<null | string> => { | 92 | ): Promise<null | string> => { |
92 | try { | 93 | try { |
93 | const releaseInfo = await fetchArtifactReleaseInfo(source.repo, source.file, source.tag); | 94 | const releaseInfo = await fetchArtifactReleaseInfo(source.repo, source.file, source.tag); |
94 | 95 | ||
95 | await downloadArtifactWithProgressUi(releaseInfo, source.file, source.dir, "language server"); | 96 | await downloadArtifactWithProgressUi(releaseInfo, source.file, source.dir, "language server"); |
96 | await Promise.all([ | 97 | await Promise.all([ |
97 | config.serverReleaseTag.set(releaseInfo.releaseName), | 98 | state.serverReleaseTag.set(releaseInfo.releaseName), |
98 | config.serverReleaseDate.set(releaseInfo.releaseDate) | 99 | state.serverReleaseDate.set(releaseInfo.releaseDate) |
99 | ]); | 100 | ]); |
100 | } catch (err) { | 101 | } catch (err) { |
101 | log.downloadError(err, "language server", source.repo.name); | 102 | log.downloadError(err, "language server", source.repo.name); |