Skip to content

Commit 799416d

Browse files
authored
Merge pull request #2711 from akshita31/refactor_downloads
Allow to control what is posted to the event stream based on if there are any downloads
2 parents ad8fea9 + 5830338 commit 799416d

15 files changed

+323
-191
lines changed

src/CSharpExtDownloader.ts

Lines changed: 0 additions & 49 deletions
This file was deleted.

src/InstallRuntimeDependencies.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import { PlatformInformation } from './platform';
7+
import { PackageInstallation, LogPlatformInfo, InstallationSuccess } from './omnisharp/loggingEvents';
8+
import { EventStream } from './EventStream';
9+
import { getRuntimeDependenciesPackages } from './tools/RuntimeDependencyPackageUtils';
10+
import { getAbsolutePathPackagesToInstall } from './packageManager/getAbsolutePathPackagesToInstall';
11+
import IInstallDependencies from './packageManager/IInstallDependencies';
12+
13+
export async function installRuntimeDependencies(packageJSON: any, extensionPath: string, installDependencies: IInstallDependencies, eventStream: EventStream, platformInfo: PlatformInformation): Promise<boolean>{
14+
let runTimeDependencies = getRuntimeDependenciesPackages(packageJSON);
15+
let packagesToInstall = await getAbsolutePathPackagesToInstall(runTimeDependencies, platformInfo, extensionPath);
16+
if (packagesToInstall && packagesToInstall.length > 0) {
17+
eventStream.post(new PackageInstallation("C# dependencies"));
18+
try {
19+
// Display platform information and RID
20+
eventStream.post(new LogPlatformInfo(platformInfo));
21+
await installDependencies(packagesToInstall);
22+
eventStream.post(new InstallationSuccess());
23+
return true;
24+
}
25+
catch (error) {
26+
return false;
27+
}
28+
}
29+
30+
//All the required packages are already downloaded and installed
31+
return true;
32+
}
33+

src/coreclr-debug/activate.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { PlatformInformation } from './../platform';
1111
import { DebuggerPrerequisiteWarning, DebuggerPrerequisiteFailure, DebuggerNotInstalledFailure } from '../omnisharp/loggingEvents';
1212
import { EventStream } from '../EventStream';
1313
import CSharpExtensionExports from '../CSharpExtensionExports';
14-
import { getRuntimeDependencyPackageWithId } from '../tools/GetRuntimeDependencyWithId';
14+
import { getRuntimeDependencyPackageWithId } from '../tools/RuntimeDependencyPackageUtils';
1515

1616
let _debugUtil: CoreClrDebugUtil = null;
1717

src/main.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import * as vscode from 'vscode';
1010

1111
import { ActivationFailure, ActiveTextEditorChanged } from './omnisharp/loggingEvents';
1212
import { WarningMessageObserver } from './observers/WarningMessageObserver';
13-
import { CSharpExtDownloader } from './CSharpExtDownloader';
1413
import { CsharpChannelObserver } from './observers/CsharpChannelObserver';
1514
import { CsharpLoggerObserver } from './observers/CsharpLoggerObserver';
1615
import { DotNetChannelObserver } from './observers/DotnetChannelObserver';
@@ -28,7 +27,7 @@ import TelemetryReporter from 'vscode-extension-telemetry';
2827
import { addJSONProviders } from './features/json/jsonContributions';
2928
import { ProjectStatusBarObserver } from './observers/ProjectStatusBarObserver';
3029
import CSharpExtensionExports from './CSharpExtensionExports';
31-
import { vscodeNetworkSettingsProvider, NetworkSettingsProvider } from './NetworkSettings';
30+
import { vscodeNetworkSettingsProvider } from './NetworkSettings';
3231
import { ErrorMessageObserver } from './observers/ErrorMessageObserver';
3332
import OptionProvider from './observers/OptionProvider';
3433
import DotNetTestChannelObserver from './observers/DotnetTestChannelObserver';
@@ -39,6 +38,10 @@ import { CSharpExtensionId } from './constants/CSharpExtensionId';
3938
import { OpenURLObserver } from './observers/OpenURLObserver';
4039
import { activateRazorExtension } from './razor/razor';
4140
import { RazorLoggerObserver } from './observers/RazorLoggerObserver';
41+
import { AbsolutePathPackage } from './packageManager/AbsolutePathPackage';
42+
import { downloadAndInstallPackages } from './packageManager/downloadAndInstallPackages';
43+
import IInstallDependencies from './packageManager/IInstallDependencies';
44+
import { installRuntimeDependencies } from './InstallRuntimeDependencies';
4245

4346
export async function activate(context: vscode.ExtensionContext): Promise<CSharpExtensionExports> {
4447

@@ -116,7 +119,8 @@ export async function activate(context: vscode.ExtensionContext): Promise<CSharp
116119
eventStream.subscribe(telemetryObserver.post);
117120

118121
let networkSettingsProvider = vscodeNetworkSettingsProvider(vscode);
119-
let runtimeDependenciesExist = await ensureRuntimeDependencies(extension, eventStream, platformInfo, networkSettingsProvider);
122+
let installDependencies: IInstallDependencies = (dependencies: AbsolutePathPackage[]) => downloadAndInstallPackages(dependencies, networkSettingsProvider, eventStream);
123+
let runtimeDependenciesExist = await ensureRuntimeDependencies(extension, eventStream, platformInfo, installDependencies);
120124

121125
// activate language services
122126
let langServicePromise = OmniSharp.activate(context, extension.packageJSON, platformInfo, networkSettingsProvider, eventStream, optionProvider, extension.extensionPath);
@@ -158,8 +162,7 @@ export async function activate(context: vscode.ExtensionContext): Promise<CSharp
158162
};
159163
}
160164

161-
async function ensureRuntimeDependencies(extension: vscode.Extension<CSharpExtensionExports>, eventStream: EventStream, platformInfo: PlatformInformation, networkSettingsProvider: NetworkSettingsProvider): Promise<boolean> {
162-
const downloader = new CSharpExtDownloader(networkSettingsProvider, eventStream, extension.packageJSON, platformInfo, extension.extensionPath);
163-
return downloader.installRuntimeDependencies();
165+
async function ensureRuntimeDependencies(extension: vscode.Extension<CSharpExtensionExports>, eventStream: EventStream, platformInfo: PlatformInformation, installDependencies: IInstallDependencies): Promise<boolean> {
166+
return installRuntimeDependencies(extension.packageJSON, extension.extensionPath, installDependencies, eventStream, platformInfo);
164167
}
165168

src/omnisharp/OmnisharpDownloader.ts

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ import { PlatformInformation } from '../platform';
88
import { PackageInstallation, LogPlatformInfo, InstallationSuccess, InstallationFailure, LatestBuildDownloadStart } from './loggingEvents';
99
import { EventStream } from '../EventStream';
1010
import { NetworkSettingsProvider } from '../NetworkSettings';
11-
import { DownloadAndInstallPackages } from '../packageManager/PackageManager';
11+
import { downloadAndInstallPackages } from '../packageManager/downloadAndInstallPackages';
1212
import { DownloadFile } from '../packageManager/FileDownloader';
13+
import { getRuntimeDependenciesPackages } from '../tools/RuntimeDependencyPackageUtils';
14+
import { getAbsolutePathPackagesToInstall } from '../packageManager/getAbsolutePathPackagesToInstall';
1315

1416
export class OmnisharpDownloader {
1517

@@ -22,21 +24,15 @@ export class OmnisharpDownloader {
2224
}
2325

2426
public async DownloadAndInstallOmnisharp(version: string, serverUrl: string, installPath: string) {
25-
this.eventStream.post(new PackageInstallation(`OmniSharp Version = ${version}`));
26-
let installationStage = '';
27-
28-
try {
27+
let runtimeDependencies = getRuntimeDependenciesPackages(this.packageJSON);
28+
let omniSharpPackages = GetPackagesFromVersion(version, runtimeDependencies, serverUrl, installPath);
29+
let packagesToInstall = await getAbsolutePathPackagesToInstall(omniSharpPackages, this.platformInfo, this.extensionPath);
30+
if (packagesToInstall && packagesToInstall.length > 0) {
31+
this.eventStream.post(new PackageInstallation(`OmniSharp Version = ${version}`));
2932
this.eventStream.post(new LogPlatformInfo(this.platformInfo));
30-
installationStage = 'getPackageInfo';
31-
let packages = GetPackagesFromVersion(version, this.packageJSON.runtimeDependencies, serverUrl, installPath);
32-
installationStage = 'downloadAndInstallPackages';
33-
await DownloadAndInstallPackages(packages, this.networkSettingsProvider, this.platformInfo, this.eventStream, this.extensionPath);
33+
await downloadAndInstallPackages(packagesToInstall, this.networkSettingsProvider, this.eventStream);
3434
this.eventStream.post(new InstallationSuccess());
3535
}
36-
catch (error) {
37-
this.eventStream.post(new InstallationFailure(installationStage, error));
38-
throw error;// throw the error up to the server
39-
}
4036
}
4137

4238
public async GetLatestVersion(serverUrl: string, latestVersionFileServerPath: string): Promise<string> {
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import { AbsolutePathPackage } from "./AbsolutePathPackage";
7+
8+
export default interface IInstallDependencies {
9+
(packages: AbsolutePathPackage[]): Promise<void>;
10+
}

src/packageManager/PackageFilterer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { AbsolutePathPackage } from "./AbsolutePathPackage";
1010

1111
const { filterAsync } = require('node-filter-async');
1212

13-
export async function filterPackages(packages: AbsolutePathPackage[], platformInfo: PlatformInformation): Promise<AbsolutePathPackage[]> {
13+
export async function getNotInstalledPackagesForPlatform(packages: AbsolutePathPackage[], platformInfo: PlatformInformation): Promise<AbsolutePathPackage[]> {
1414
let platformPackages = filterPlatformPackages(packages, platformInfo);
1515
return filterAlreadyInstalledPackages(platformPackages);
1616
}

src/packageManager/PackageManager.ts renamed to src/packageManager/downloadAndInstallPackages.ts

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

6-
import { PlatformInformation } from "../platform";
7-
import { Package } from './Package';
86
import { PackageError } from './PackageError';
97
import { NestedError } from "../NestedError";
108
import { DownloadFile } from './FileDownloader';
119
import { InstallZip } from './ZipInstaller';
1210
import { EventStream } from '../EventStream';
1311
import { NetworkSettingsProvider } from "../NetworkSettings";
14-
import { filterPackages } from "./PackageFilterer";
1512
import { AbsolutePathPackage } from "./AbsolutePathPackage";
1613
import { touchInstallFile, InstallFileType, deleteInstallFile, installFileExists } from "../common";
1714
import { InstallationFailure } from "../omnisharp/loggingEvents";
1815
import { mkdirpSync } from "fs-extra";
1916
import { PackageInstallStart } from "../omnisharp/loggingEvents";
2017

21-
export async function DownloadAndInstallPackages(packages: Package[], provider: NetworkSettingsProvider, platformInfo: PlatformInformation, eventStream: EventStream, extensionPath: string): Promise<void> {
22-
let absolutePathPackages = packages.map(pkg => AbsolutePathPackage.getAbsolutePathPackage(pkg, extensionPath));
23-
let filteredPackages = await filterPackages(absolutePathPackages, platformInfo);
24-
25-
if (filteredPackages) {
18+
export async function downloadAndInstallPackages(packages: AbsolutePathPackage[], provider: NetworkSettingsProvider, eventStream: EventStream) {
19+
if (packages) {
2620
eventStream.post(new PackageInstallStart());
27-
for (let pkg of filteredPackages) {
21+
for (let pkg of packages) {
2822
let installationStage = "touchBeginFile";
2923
try {
3024
mkdirpSync(pkg.installPath.value);
@@ -49,7 +43,7 @@ export async function DownloadAndInstallPackages(packages: Package[], provider:
4943
}
5044
finally {
5145
try {
52-
if (installFileExists(pkg.installPath, InstallFileType.Begin)) {
46+
if (await installFileExists(pkg.installPath, InstallFileType.Begin)) {
5347
await deleteInstallFile(pkg.installPath, InstallFileType.Begin);
5448
}
5549
}
@@ -58,4 +52,3 @@ export async function DownloadAndInstallPackages(packages: Package[], provider:
5852
}
5953
}
6054
}
61-
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import { PlatformInformation } from "../platform";
7+
import { AbsolutePathPackage } from "./AbsolutePathPackage";
8+
import { getNotInstalledPackagesForPlatform } from "./PackageFilterer";
9+
import { Package } from "./Package";
10+
11+
export async function getAbsolutePathPackagesToInstall(packages: Package[], platformInfo: PlatformInformation, extensionPath: string): Promise<AbsolutePathPackage[]> {
12+
if (packages && packages.length>0)
13+
{
14+
let absolutePathPackages = packages.map(pkg => AbsolutePathPackage.getAbsolutePathPackage(pkg, extensionPath));
15+
return getNotInstalledPackagesForPlatform(absolutePathPackages, platformInfo);
16+
}
17+
18+
return [];
19+
}

src/tools/GetRuntimeDependencyWithId.ts renamed to src/tools/RuntimeDependencyPackageUtils.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,19 @@
55

66
import { PlatformInformation } from '../platform';
77
import { AbsolutePathPackage } from '../packageManager/AbsolutePathPackage';
8-
import { GetRunTimeDependenciesPackages } from '../CSharpExtDownloader';
98
import { filterPlatformPackages } from '../packageManager/PackageFilterer';
9+
import { Package } from '../packageManager/Package';
1010

1111
export function getRuntimeDependencyPackageWithId(packageId: string, packageJSON: any, platformInfo: PlatformInformation, extensionPath: string): AbsolutePathPackage {
12-
let runtimeDependencies = GetRunTimeDependenciesPackages(packageJSON);
12+
let runtimeDependencies = getRuntimeDependenciesPackages(packageJSON);
1313
let absolutePathPackages = runtimeDependencies.map(pkg => AbsolutePathPackage.getAbsolutePathPackage(pkg, extensionPath));
1414
let platformSpecificPackage = filterPlatformPackages(absolutePathPackages, platformInfo);
1515
return platformSpecificPackage.find(pkg => pkg.id == packageId);
16+
}
17+
18+
export function getRuntimeDependenciesPackages(packageJSON: any): Package[] {
19+
if (packageJSON.runtimeDependencies) {
20+
return JSON.parse(JSON.stringify(<Package[]>packageJSON.runtimeDependencies));
21+
}
22+
throw new Error("No runtime dependencies found");
1623
}

0 commit comments

Comments
 (0)