Skip to content
This repository was archived by the owner on Nov 18, 2022. It is now read-only.

Commit 5a4dde0

Browse files
committed
Wholly use vscode.Memento API to store installed RA release tag
1 parent 3cfc22a commit 5a4dde0

File tree

2 files changed

+19
-92
lines changed

2 files changed

+19
-92
lines changed

src/rust-analyzer/persistent_state.ts

+6-73
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,8 @@
1-
import * as fs from 'fs';
2-
import * as path from 'path';
3-
import { promisify } from 'util';
41
import * as vscode from 'vscode';
52

6-
const stat = promisify(fs.stat);
7-
const mkdir = promisify(fs.mkdir);
8-
const readFile = promisify(fs.readFile);
9-
const writeFile = promisify(fs.writeFile);
10-
11-
/** Returns a path where persistent data for rust-analyzer should be installed. */
12-
function metadataDir(): string | undefined {
13-
if (process.platform === 'linux' || process.platform === 'darwin') {
14-
// Prefer, in this order:
15-
// 1. $XDG_CONFIG_HOME/rust-analyzer
16-
// 2. $HOME/.config/rust-analyzer
17-
const { HOME, XDG_CONFIG_HOME } = process.env;
18-
const baseDir = XDG_CONFIG_HOME || (HOME && path.join(HOME, '.config'));
19-
20-
return baseDir && path.resolve(path.join(baseDir, 'rust-analyzer'));
21-
} else if (process.platform === 'win32') {
22-
// %LocalAppData%\rust-analyzer\
23-
const { LocalAppData } = process.env;
24-
return (
25-
LocalAppData && path.resolve(path.join(LocalAppData, 'rust-analyzer'))
26-
);
27-
}
28-
29-
return undefined;
30-
}
31-
32-
export interface Metadata {
33-
releaseTag: string;
34-
}
35-
36-
export async function readMetadata(): Promise<Partial<Metadata>> {
37-
const stateDir = metadataDir();
38-
if (!stateDir) {
39-
throw new Error('Not supported');
40-
}
41-
42-
const filePath = path.join(stateDir, 'metadata.json');
43-
if (!(await stat(filePath).catch(() => false))) {
44-
throw new Error('File missing');
45-
}
46-
47-
const contents = await readFile(filePath, 'utf8');
48-
const obj = JSON.parse(contents) as unknown;
49-
return typeof obj === 'object' ? obj || {} : {};
50-
}
51-
52-
export async function writeMetadata(config: Metadata) {
53-
const stateDir = metadataDir();
54-
if (!stateDir) {
55-
return false;
56-
}
57-
58-
if (!(await ensureDir(stateDir))) {
59-
return false;
60-
}
61-
62-
const filePath = path.join(stateDir, 'metadata.json');
63-
return writeFile(filePath, JSON.stringify(config)).then(() => true);
64-
}
65-
66-
function ensureDir(path: string) {
67-
return !!path && stat(path).catch(() => mkdir(path, { recursive: true }));
68-
}
69-
703
export class PersistentState {
714
constructor(private readonly globalState: vscode.Memento) {
72-
const { lastCheck, releaseId, serverVersion } = this;
5+
const { lastCheck, releaseId, releaseTag: serverVersion } = this;
736
console.info('PersistentState:', { lastCheck, releaseId, serverVersion });
747
}
758

@@ -95,13 +28,13 @@ export class PersistentState {
9528
}
9629

9730
/**
98-
* Version of the extension that installed the server.
31+
* Release tag of the installed server.
9932
* Used to check if we need to update the server.
10033
*/
101-
get serverVersion(): string | undefined {
102-
return this.globalState.get('serverVersion');
34+
get releaseTag(): string | undefined {
35+
return this.globalState.get('releaseTag');
10336
}
104-
async updateServerVersion(value: string | undefined) {
105-
await this.globalState.update('serverVersion', value);
37+
async updateReleaseTag(value: string | undefined) {
38+
await this.globalState.update('releaseTag', value);
10639
}
10740
}

src/rust-analyzer/rustAnalyzer.ts

+13-19
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,7 @@ import { WorkspaceProgress } from '../extension';
1010
import { download, fetchRelease } from '../net';
1111
import * as rustup from '../rustup';
1212
import { Observable } from '../utils/observable';
13-
import {
14-
Metadata,
15-
readMetadata,
16-
writeMetadata,
17-
PersistentState,
18-
} from './persistent_state';
13+
import { PersistentState } from './persistent_state';
1914

2015
const stat = promisify(fs.stat);
2116
const mkdir = promisify(fs.mkdir);
@@ -64,8 +59,6 @@ export async function getServer(
6459
config: RustAnalyzerConfig,
6560
state: PersistentState,
6661
): Promise<string | undefined> {
67-
const { askBeforeDownload, package: pkg } = config;
68-
6962
let binaryName: string | undefined;
7063
if (process.arch === 'x64' || process.arch === 'ia32') {
7164
if (process.platform === 'linux') {
@@ -96,22 +89,25 @@ export async function getServer(
9689
}
9790
await ensureDir(dir);
9891

99-
const metadata: Partial<Metadata> = await readMetadata().catch(() => ({}));
100-
10192
const dest = path.join(dir, binaryName);
10293
const exists = await stat(dest).catch(() => false);
103-
if (exists && metadata.releaseTag === pkg.releaseTag) {
94+
95+
if (!exists) {
96+
await state.updateReleaseTag(undefined);
97+
} else if (state.releaseTag === config.package.releaseTag) {
10498
return dest;
10599
}
106100

107-
if (askBeforeDownload) {
101+
if (config.askBeforeDownload) {
108102
const userResponse = await vs.window.showInformationMessage(
109103
`${
110-
metadata.releaseTag && metadata.releaseTag !== pkg.releaseTag
111-
? `You seem to have installed release \`${metadata.releaseTag}\` but requested a different one.`
104+
state.releaseTag && state.releaseTag !== config.package.releaseTag
105+
? `You seem to have installed release \`${state.releaseTag}\` but requested a different one.`
112106
: ''
113107
}
114-
Release \`${pkg.releaseTag}\` of rust-analyzer is not installed.\n
108+
Release \`${
109+
config.package.releaseTag
110+
}\` of rust-analyzer is not installed.\n
115111
Install to ${dir}?`,
116112
'Download',
117113
);
@@ -123,7 +119,7 @@ export async function getServer(
123119
const release = await fetchRelease(
124120
'rust-analyzer',
125121
'rust-analyzer',
126-
pkg.releaseTag,
122+
config.package.releaseTag,
127123
);
128124
const artifact = release.assets.find(asset => asset.name === binaryName);
129125
if (!artifact) {
@@ -137,9 +133,7 @@ export async function getServer(
137133
mode: 0o755,
138134
});
139135

140-
await writeMetadata({ releaseTag: pkg.releaseTag }).catch(() => {
141-
vs.window.showWarningMessage(`Couldn't save rust-analyzer metadata`);
142-
});
136+
await state.updateReleaseTag(config.package.releaseTag);
143137

144138
return dest;
145139
}

0 commit comments

Comments
 (0)