Skip to content

Commit d0c1d2e

Browse files
authored
Retry fetching release notes on failure, and display failures (microsoft#101158)
* Retry getting release notes on failure, and show xhr failures * improved release notes errors * improve async code in loadReleaseNotes
1 parent e0d4a2f commit d0c1d2e

3 files changed

Lines changed: 41 additions & 24 deletions

File tree

src/vs/base/parts/request/browser/request.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export function request(options: IRequestOptions, token: CancellationToken): Pro
2121
setRequestHeaders(xhr, options);
2222

2323
xhr.responseType = 'arraybuffer';
24-
xhr.onerror = e => reject(new Error(xhr.statusText && ('XHR failed: ' + xhr.statusText)));
24+
xhr.onerror = e => reject(new Error(xhr.statusText && ('XHR failed: ' + xhr.statusText) || 'XHR failed'));
2525
xhr.onload = (e) => {
2626
resolve({
2727
res: {

src/vs/workbench/contrib/update/browser/releaseNotesEditor.ts

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,10 @@ export class ReleaseNotesManager {
9595
return true;
9696
}
9797

98-
private loadReleaseNotes(version: string): Promise<string> {
98+
private async loadReleaseNotes(version: string): Promise<string> {
9999
const match = /^(\d+\.\d+)\./.exec(version);
100100
if (!match) {
101-
return Promise.reject(new Error('not found'));
101+
throw new Error('not found');
102102
}
103103

104104
const versionLabel = match[1].replace(/\./g, '_');
@@ -138,17 +138,30 @@ export class ReleaseNotesManager {
138138
.replace(/kbstyle\(([^\)]+)\)/gi, kbstyle);
139139
};
140140

141-
if (!this._releaseNotesCache.has(version)) {
142-
this._releaseNotesCache.set(version, this._requestService.request({ url }, CancellationToken.None)
143-
.then(asText)
144-
.then(text => {
145-
if (!text || !/^#\s/.test(text)) { // release notes always starts with `#` followed by whitespace
146-
return Promise.reject(new Error('Invalid release notes'));
147-
}
141+
const fetchReleaseNotes = async () => {
142+
let text;
143+
try {
144+
text = await asText(await this._requestService.request({ url }, CancellationToken.None));
145+
} catch {
146+
throw new Error('Failed to fetch release notes');
147+
}
148+
149+
if (!text || !/^#\s/.test(text)) { // release notes always starts with `#` followed by whitespace
150+
throw new Error('Invalid release notes');
151+
}
148152

149-
return Promise.resolve(text);
150-
})
151-
.then(text => patchKeybindings(text)));
153+
return patchKeybindings(text);
154+
};
155+
156+
if (!this._releaseNotesCache.has(version)) {
157+
this._releaseNotesCache.set(version, (async () => {
158+
try {
159+
return await fetchReleaseNotes();
160+
} catch (err) {
161+
this._releaseNotesCache.delete(version);
162+
throw err;
163+
}
164+
})());
152165
}
153166

154167
return this._releaseNotesCache.get(version)!;

src/vs/workbench/contrib/update/browser/update.ts

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,12 @@ export class OpenLatestReleaseNotesInBrowserAction extends Action {
5151
super('update.openLatestReleaseNotes', nls.localize('releaseNotes', "Release Notes"), undefined, true);
5252
}
5353

54-
run(): Promise<any> {
54+
async run(): Promise<void> {
5555
if (this.productService.releaseNotesUrl) {
5656
const uri = URI.parse(this.productService.releaseNotesUrl);
57-
return this.openerService.open(uri);
57+
await this.openerService.open(uri);
5858
}
59-
return Promise.resolve(false);
59+
throw new Error('This version of Visual Studio Code does not have release notes online');
6060
}
6161
}
6262

@@ -71,18 +71,22 @@ export abstract class AbstractShowReleaseNotesAction extends Action {
7171
super(id, label, undefined, true);
7272
}
7373

74-
run(): Promise<boolean> {
74+
async run(): Promise<void> {
7575
if (!this.enabled) {
76-
return Promise.resolve(false);
76+
return;
7777
}
78-
7978
this.enabled = false;
8079

81-
return showReleaseNotes(this.instantiationService, this.version)
82-
.then(undefined, () => {
83-
const action = this.instantiationService.createInstance(OpenLatestReleaseNotesInBrowserAction);
84-
return action.run().then(() => false);
85-
});
80+
try {
81+
await showReleaseNotes(this.instantiationService, this.version);
82+
} catch (err) {
83+
const action = this.instantiationService.createInstance(OpenLatestReleaseNotesInBrowserAction);
84+
try {
85+
await action.run();
86+
} catch (err2) {
87+
throw new Error(`${err.message} and ${err2.message}`);
88+
}
89+
}
8690
}
8791
}
8892

0 commit comments

Comments
 (0)