Skip to content

Commit 9eb1115

Browse files
Enable starting using a cached nigthly (#519)
Fixes #515 When using latest-nightly, enable starting using a cached nigthly when there is no internet connection
1 parent 3a05984 commit 9eb1115

File tree

2 files changed

+55
-42
lines changed

2 files changed

+55
-42
lines changed

src/language/dafnyToolInstaller.ts

+40-33
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class DafnyToolInstaller {
6161

6262
private async getDotnetToolVersion(): Promise<string> {
6363
if(this.toolVersionCache === undefined) {
64-
this.toolVersionCache = await DafnyToolInstaller.getDotnetToolVersionUncached(this.context);
64+
this.toolVersionCache = await this.getDotnetToolVersionUncached(this.context);
6565
}
6666
return this.toolVersionCache;
6767
}
@@ -81,42 +81,49 @@ class DafnyToolInstaller {
8181
3.7.1.40621 Downloads: 754
8282
3.7.2.40713 Downloads: 324
8383
*/
84-
private static async getDotnetToolVersionUncached(context: ExtensionContext): Promise<string> {
84+
private async getDotnetToolVersionUncached(context: ExtensionContext): Promise<string> {
8585
const { path: dotnetExecutable } = await getDotnetExecutablePath();
86-
const { stdout } = await execFileAsync(dotnetExecutable, [ 'tool', 'search', 'Dafny', '--detail', '--prerelease' ]);
87-
const entries = stdout.split('----------------').map(entry => entry.split('\n').filter(e => e !== ''));
88-
const dafnyEntry = entries.filter(entry => entry[0] === 'dafny')[0];
89-
const versionsIndex = dafnyEntry.findIndex(v => v.startsWith('Versions:'));
90-
const versions = dafnyEntry.slice(versionsIndex + 1).map(versionLine => versionLine.trimStart().split(' ')[0]);
86+
try {
87+
const { stdout } = await execFileAsync(dotnetExecutable, [ 'tool', 'search', 'Dafny', '--detail', '--prerelease' ]);
88+
const entries = stdout.split('----------------').map(entry => entry.split('\n').filter(e => e !== ''));
89+
const dafnyEntry = entries.filter(entry => entry[0] === 'dafny')[0];
90+
const versionsIndex = dafnyEntry.findIndex(v => v.startsWith('Versions:'));
91+
const versions = dafnyEntry.slice(versionsIndex + 1).map(versionLine => versionLine.trimStart().split(' ')[0]);
9192

92-
const versionDescription = getPreferredVersion();
93-
let toolVersion: string;
93+
const versionDescription = getPreferredVersion();
94+
let toolVersion: string;
9495

95-
switch(versionDescription) {
96-
case LanguageServerConstants.LatestStable: {
97-
const version = LanguageServerConstants.LatestVersion;
98-
toolVersion = await DafnyInstaller.dafny4upgradeCheck(
99-
context, versionDescription, versions.filter(l => l.startsWith(version))[0]);
100-
window.showInformationMessage(`Using latest stable version: ${toolVersion}`);
101-
break;
102-
}
103-
case LanguageServerConstants.LatestNightly: {
104-
const nightlies = versions.filter(l => l.includes('nightly'));
105-
const dates: { index: number, date: string }[] = nightlies.map((n, index) => {
106-
const split: string[] = n.split('-');
107-
return { index, date: split[2] + split[3] + split[4] };
108-
});
109-
dates.sort((a, b) => a.date < b.date ? 1 : -1);
110-
toolVersion = nightlies[dates[0].index];
111-
window.showInformationMessage(`Using latest nightly version: ${toolVersion}`);
112-
break;
113-
}
114-
default: {
115-
toolVersion = versions.filter(l => l.startsWith(versionDescription))[0];
116-
context.globalState.update(DafnyInstaller.CurrentVersionTag, versionDescription);
117-
}
96+
switch(versionDescription) {
97+
case LanguageServerConstants.LatestStable: {
98+
const version = LanguageServerConstants.LatestVersion;
99+
toolVersion = await DafnyInstaller.dafny4upgradeCheck(
100+
context, versionDescription, versions.filter(l => l.startsWith(version))[0]);
101+
window.showInformationMessage(`Using latest stable version: ${toolVersion}`);
102+
break;
103+
}
104+
case LanguageServerConstants.LatestNightly: {
105+
const nightlies = versions.filter(l => l.includes('nightly'));
106+
const dates: { index: number, date: string }[] = nightlies.map((n, index) => {
107+
const split: string[] = n.split('-');
108+
return { index, date: split[2] + split[3] + split[4] };
109+
});
110+
dates.sort((a, b) => a.date < b.date ? 1 : -1);
111+
toolVersion = nightlies[dates[0].index];
112+
window.showInformationMessage(`Using latest nightly version: ${toolVersion}`);
113+
break;
114+
}
115+
default: {
116+
toolVersion = versions.filter(l => l.startsWith(versionDescription))[0];
117+
context.globalState.update(DafnyInstaller.CurrentVersionTag, versionDescription);
118+
}
119+
}
120+
return toolVersion;
121+
} catch(e: unknown) {
122+
if(e instanceof Error) {
123+
this.statusOutput.appendLine('Failed to find current Dafny versions because:' + e.message);
124+
}
125+
return LanguageServerConstants.LatestVersion;
118126
}
119-
return toolVersion;
120127
}
121128
private writeStatus(message: string): void {
122129
this.statusOutput.appendLine(message);

src/language/githubReleaseInstaller.ts

+15-9
Original file line numberDiff line numberDiff line change
@@ -147,15 +147,21 @@ export class GitHubReleaseInstaller {
147147
LanguageServerConstants.LatestVersion);
148148
break;
149149
case LanguageServerConstants.LatestNightly: {
150-
const result: any = await (await fetch('https://api.github.com/repos/dafny-lang/dafny/releases/tags/nightly')).json();
151-
if(result.name !== undefined) {
152-
const name: string = result.name;
153-
const versionPrefix = 'Dafny ';
154-
if(name.startsWith(versionPrefix)) {
155-
const version = name.substring(versionPrefix.length);
156-
this.context.globalState.update('nightly-version', version);
157-
return [ 'nightly', version ];
150+
let name: string | undefined;
151+
try {
152+
const result: any = await (await fetch('https://api.github.com/repos/dafny-lang/dafny/releases/tags/nightly')).json();
153+
if(result.name !== undefined) {
154+
name = result.name!;
155+
const versionPrefix = 'Dafny ';
156+
// eslint-disable-next-line max-depth
157+
if(name!.startsWith(versionPrefix)) {
158+
const version = name!.substring(versionPrefix.length);
159+
this.context.globalState.update('nightly-version', version);
160+
return [ 'nightly', version ];
161+
}
158162
}
163+
} catch{
164+
// continue
159165
}
160166
// Github has some API limitations on how many times to call its API, so this is a good fallback.
161167
const cachedVersion = this.context.globalState.get('nightly-version');
@@ -164,7 +170,7 @@ export class GitHubReleaseInstaller {
164170
return [ 'nightly', version ];
165171
}
166172
window.showWarningMessage('Failed to install latest nightly version of Dafny. Using latest stable version instead.\n'
167-
+ `The name of the nightly release we found was: ${result.name}`);
173+
+ (name !== undefined ? `The name of the nightly release we found was: ${name}` : ''));
168174
version = LanguageServerConstants.LatestVersion;
169175
}
170176
}

0 commit comments

Comments
 (0)