Skip to content

Commit 1329923

Browse files
committed
Add logic for retry
1 parent 8cf6c72 commit 1329923

File tree

5 files changed

+51
-10
lines changed

5 files changed

+51
-10
lines changed

src/observers/CsharpChannelObserver.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { BaseChannelObserver } from "./BaseChannelObserver";
7-
import { BaseEvent, InstallationFailure, DebuggerNotInstalledFailure, DebuggerPrerequisiteFailure, ProjectJsonDeprecatedWarning, PackageInstallStart } from "../omnisharp/loggingEvents";
7+
import { BaseEvent, InstallationFailure, DebuggerNotInstalledFailure, DebuggerPrerequisiteFailure, ProjectJsonDeprecatedWarning, PackageInstallStart, CorruptedDownloadError } from "../omnisharp/loggingEvents";
88

99
export class CsharpChannelObserver extends BaseChannelObserver {
1010
public post = (event: BaseEvent) => {
1111
switch (event.constructor.name) {
1212
case PackageInstallStart.name:
13+
case CorruptedDownloadError.name:
1314
this.showChannel(true);
1415
break;
1516
case InstallationFailure.name:

src/observers/CsharpLoggerObserver.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,23 @@ export class CsharpLoggerObserver extends BaseLoggerObserver {
5858
case Event.LatestBuildDownloadStart.name:
5959
this.logger.appendLine("Getting latest OmniSharp version information");
6060
break;
61+
case Event.DownloadRetry.name:
62+
this.handleDownloadRetry(<Event.DownloadRetry>event);
63+
break;
64+
case Event.CorruptedDownloadError.name:
65+
this.handleCorruptedDownloadError(<Event.CorruptedDownloadError>event);
66+
break;
6167
}
6268
}
6369

70+
private handleCorruptedDownloadError(event: Event.CorruptedDownloadError){
71+
this.logger.appendLine(`There was a problem downloading ${event.packageDescription}. Some functionalities may not work as expected. Please restart vscode to retrigger the download or download the package manually from ${event.url}`);
72+
}
73+
74+
private handleDownloadRetry(event: Event.DownloadRetry) {
75+
this.logger.appendLine(`Corrupt download obtained for package ${event.packageDescription}. Retrying..`);
76+
}
77+
6478
private handleDownloadSizeObtained(event: Event.DownloadSizeObtained) {
6579
this.logger.append(`(${Math.ceil(event.packageSize / 1024)} KB)`);
6680
}

src/observers/ErrorMessageObserver.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { BaseEvent, ZipError, DotNetTestRunFailure, DotNetTestDebugStartFailure } from "../omnisharp/loggingEvents";
6+
import { BaseEvent, ZipError, DotNetTestRunFailure, DotNetTestDebugStartFailure, CorruptedDownloadError } from "../omnisharp/loggingEvents";
77
import { vscode } from "../vscodeAdapter";
88
import showErrorMessage from "./utils/ShowErrorMessage";
99

1010
export class ErrorMessageObserver {
11-
1211
constructor(private vscode: vscode) {
1312
}
1413

@@ -23,9 +22,15 @@ export class ErrorMessageObserver {
2322
case DotNetTestDebugStartFailure.name:
2423
this.handleDotNetTestDebugStartFailure(<DotNetTestDebugStartFailure>event);
2524
break;
25+
case CorruptedDownloadError.name:
26+
this.handleCorruptedDownloadError(<CorruptedDownloadError> event);
2627
}
2728
}
2829

30+
handleCorruptedDownloadError(event: CorruptedDownloadError): any {
31+
showErrorMessage(this.vscode, `There was a problem downloading ${event.packageDescription}. Some functionalities may not work as expected. Please restart vscode to retrigger the download or download the package manually from ${event.url}`);
32+
}
33+
2934
private handleZipError(event: ZipError) {
3035
showErrorMessage(this.vscode, event.message);
3136
}

src/omnisharp/loggingEvents.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,14 @@ export class OpenURL {
162162
constructor(public url: string) { }
163163
}
164164

165+
export class DownloadRetry {
166+
constructor(public packageDescription: string){ }
167+
}
168+
169+
export class CorruptedDownloadError {
170+
constructor(public packageDescription: string, public url: string){ }
171+
}
172+
165173
export class RazorPluginPathSpecified implements BaseEvent {
166174
constructor(public path: string) {}
167175
}

src/packageManager/downloadAndInstallPackages.ts

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { EventStream } from '../EventStream';
1111
import { NetworkSettingsProvider } from "../NetworkSettings";
1212
import { AbsolutePathPackage } from "./AbsolutePathPackage";
1313
import { touchInstallFile, InstallFileType, deleteInstallFile, installFileExists } from "../common";
14-
import { InstallationFailure } from "../omnisharp/loggingEvents";
14+
import { InstallationFailure, DownloadRetry, CorruptedDownloadError } from "../omnisharp/loggingEvents";
1515
import { mkdirpSync } from "fs-extra";
1616
import { PackageInstallStart } from "../omnisharp/loggingEvents";
1717
import { isValidDownload } from './isValidInstallation';
@@ -24,12 +24,25 @@ export async function downloadAndInstallPackages(packages: AbsolutePathPackage[]
2424
try {
2525
mkdirpSync(pkg.installPath.value);
2626
await touchInstallFile(pkg.installPath, InstallFileType.Begin);
27-
installationStage = 'downloadAndInstallPackages';
28-
let buffer = await DownloadFile(pkg.description, eventStream, provider, pkg.url, pkg.fallbackUrl);
29-
if (await isValidDownload(buffer, pkg.integrity)) {
30-
await InstallZip(buffer, pkg.description, pkg.installPath, pkg.binaries, eventStream);
31-
installationStage = 'touchLockFile';
32-
await touchInstallFile(pkg.installPath, InstallFileType.Lock);
27+
let count = 0;
28+
while (count < 2) {
29+
count++;
30+
let buffer = await DownloadFile(pkg.description, eventStream, provider, pkg.url, pkg.fallbackUrl);
31+
if (await isValidDownload(buffer, pkg.integrity)) {
32+
await InstallZip(buffer, pkg.description, pkg.installPath, pkg.binaries, eventStream);
33+
installationStage = 'touchLockFile';
34+
await touchInstallFile(pkg.installPath, InstallFileType.Lock);
35+
break;
36+
}
37+
else {
38+
if (count == 1) {
39+
eventStream.post(new DownloadRetry(pkg.description));
40+
}
41+
else {
42+
eventStream.post(new CorruptedDownloadError(pkg.description, pkg.url));
43+
break;
44+
}
45+
}
3346
}
3447
}
3548
catch (error) {

0 commit comments

Comments
 (0)