Skip to content

Commit aaf96c6

Browse files
Merge pull request #841 from DustinCampbell/cleanup-platform-info
Cleanup platform and Linux distribution detection logic
2 parents 56973aa + 94889d1 commit aaf96c6

File tree

11 files changed

+460
-209
lines changed

11 files changed

+460
-209
lines changed

.vscode/settings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,6 @@
1212
"out/": true
1313
},
1414

15-
"tslint.rulesDirectory": "node_modules/tslint-microsoft-contrib"
15+
"tslint.rulesDirectory": "node_modules/tslint-microsoft-contrib",
16+
"typescript.tsdk": "./node_modules/typescript/lib"
1617
}

gulpfile.js

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,16 @@ const platform = require('./out/src/platform');
2323
const child_process = require('child_process');
2424

2525
const Flavor = omnisharp.Flavor;
26-
const Platform = platform.Platform;
26+
const CoreClrFlavor = platform.CoreClrFlavor;
27+
const PlatformInformation = platform.PlatformInformation;
2728

2829
/// used in offline packaging run so does not clean .vsix
2930
function clean() {
3031
cleanDebugger();
3132
return cleanOmnisharp();
3233
}
3334

34-
gulp.task('clean', ['omnisharp:clean', 'debugger:clean', 'package:clean'], () => {
35+
gulp.task('clean', ['omnisharp:clean', 'debugger:clean', 'package:clean'], () => {
3536

3637
});
3738

@@ -40,7 +41,7 @@ function installOmnisharp(omnisharps) {
4041
const promises = omnisharps.map((omni, index) => {
4142
const log = new logger.Logger(message => process.stdout.write(message), index.toString());
4243

43-
return download.go(omni.flavor, omni.platform, log);
44+
return download.go(omni.flavor, omni.coreClrFlavor, log);
4445
});
4546

4647
return Promise.all(promises);
@@ -56,9 +57,11 @@ gulp.task('omnisharp:clean', () => {
5657

5758
gulp.task('omnisharp:install', ['omnisharp:clean'], () => {
5859
const flavor = gulpUtil.env.flavor || Flavor.CoreCLR;
59-
const platform = gulpUtil.env.platform || platform.getCurrentPlatform();
6060

61-
return installOmnisharp([{flavor, platform}]);
61+
return PlatformInformation.GetCurrent().then(info => {
62+
const coreClrFlavor = gulpUtil.env.coreClrFlavor || info.getCoreClrFlavor();
63+
return installOmnisharp([{ flavor, coreClrFlavor }]);
64+
});
6265
});
6366

6467
/// Debugger Tasks
@@ -134,15 +137,15 @@ gulp.task('package:offline', ['clean'], () => {
134137
var packageName = name + '.' + version;
135138

136139
var packages = [];
137-
packages.push({rid: 'win7-x64', omnisharps: [{flavor: Flavor.CoreCLR, platform: Platform.Windows}, {flavor: Flavor.Desktop, platform: Platform.Windows}]});
138-
packages.push({rid: 'osx.10.11-x64', omnisharps: [{flavor: Flavor.CoreCLR, platform: Platform.OSX}]});
139-
packages.push({rid: 'centos.7-x64', omnisharps: [{flavor: Flavor.CoreCLR, platform: Platform.CentOS}]});
140-
packages.push({rid: 'debian.8-x64', omnisharps: [{flavor: Flavor.CoreCLR, platform: Platform.Debian}]});
141-
packages.push({rid: 'fedora.23-x64', omnisharps: [{flavor: Flavor.CoreCLR, platform: Platform.Fedora}]});
142-
packages.push({rid: 'opensuse.13.2-x64', omnisharps: [{flavor: Flavor.CoreCLR, platform: Platform.OpenSUSE}]});
143-
packages.push({rid: 'rhel.7.2-x64', omnisharps: [{flavor: Flavor.CoreCLR, platform: Platform.RHEL}]});
144-
packages.push({rid: 'ubuntu.14.04-x64', omnisharps: [{flavor: Flavor.CoreCLR, platform: Platform.Ubuntu14}]});
145-
packages.push({rid: 'ubuntu.16.04-x64', omnisharps: [{flavor: Flavor.CoreCLR, platform: Platform.Ubuntu16}]});
140+
packages.push({ rid: 'win7-x64', omnisharps: [{ flavor: Flavor.CoreCLR, coreClrFlavor: CoreClrFlavor.Windows }, { flavor: Flavor.Desktop, coreClrFlavor: CoreClrFlavor.Windows }] });
141+
packages.push({ rid: 'osx.10.11-x64', omnisharps: [{ flavor: Flavor.CoreCLR, coreClrFlavor: CoreClrFlavor.OSX }] });
142+
packages.push({ rid: 'centos.7-x64', omnisharps: [{ flavor: Flavor.CoreCLR, coreClrFlavor: CoreClrFlavor.CentOS }] });
143+
packages.push({ rid: 'debian.8-x64', omnisharps: [{ flavor: Flavor.CoreCLR, coreClrFlavor: CoreClrFlavor.Debian }] });
144+
packages.push({ rid: 'fedora.23-x64', omnisharps: [{ flavor: Flavor.CoreCLR, coreClrFlavor: CoreClrFlavor.Fedora }] });
145+
packages.push({ rid: 'opensuse.13.2-x64', omnisharps: [{ flavor: Flavor.CoreCLR, coreClrFlavor: CoreClrFlavor.OpenSUSE }] });
146+
packages.push({ rid: 'rhel.7.2-x64', omnisharps: [{ flavor: Flavor.CoreCLR, coreClrFlavor: CoreClrFlavor.RHEL }] });
147+
packages.push({ rid: 'ubuntu.14.04-x64', omnisharps: [{ flavor: Flavor.CoreCLR, coreClrFlavor: CoreClrFlavor.Ubuntu14 }] });
148+
packages.push({ rid: 'ubuntu.16.04-x64', omnisharps: [{ flavor: Flavor.CoreCLR, coreClrFlavor: CoreClrFlavor.Ubuntu16 }] });
146149

147150
var promise = Promise.resolve();
148151

@@ -158,7 +161,7 @@ gulp.task('package:offline', ['clean'], () => {
158161
/// Test Task
159162
gulp.task('test', () => {
160163
gulp.src('out/test/**/*.tests.js')
161-
.pipe(mocha({ui: "tdd"}))
164+
.pipe(mocha({ ui: "tdd" }))
162165
.once('error', () => {
163166
process.exit(1);
164167
})
@@ -175,17 +178,17 @@ const allTypeScript = [
175178
];
176179

177180
const lintReporter = (output, file, options) => {
178-
//emits: src/helloWorld.c:5:3: warning: implicit declaration of function ‘prinft’
179-
var relativeBase = file.base.substring(file.cwd.length + 1).replace('\\', '/');
180-
output.forEach(e => {
181-
var message = relativeBase + e.name + ':' + (e.startPosition.line + 1) + ':' + (e.startPosition.character + 1) + ': ' + e.failure;
182-
console.log('[tslint] ' + message);
183-
});
181+
//emits: src/helloWorld.c:5:3: warning: implicit declaration of function ‘prinft’
182+
var relativeBase = file.base.substring(file.cwd.length + 1).replace('\\', '/');
183+
output.forEach(e => {
184+
var message = relativeBase + e.name + ':' + (e.startPosition.line + 1) + ':' + (e.startPosition.character + 1) + ': ' + e.failure;
185+
console.log('[tslint] ' + message);
186+
});
184187
};
185188

186189
gulp.task('tslint', () => {
187-
gulp.src(allTypeScript)
188-
.pipe(tslint({
190+
gulp.src(allTypeScript)
191+
.pipe(tslint({
189192
rulesDirectory: "node_modules/tslint-microsoft-contrib"
190193
}))
191194
.pipe(tslint.report(lintReporter, {

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
"scripts": {
2222
"compile": "node ./node_modules/vscode/bin/compile -p ./",
2323
"watch": "node ./node_modules/vscode/bin/compile -watch -p ./",
24-
"test": "mocha --timeout 15000 -u tdd ./out/test/**/*.tests.js",
24+
"test": "mocha --timeout 15000 -u tdd ./out/test/*.tests.js ./out/test/**/*.tests.js",
2525
"postinstall": "node ./node_modules/vscode/bin/install"
2626
},
2727
"dependencies": {

src/common.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
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 * as cp from 'child_process';
7+
8+
let extensionPath: string;
9+
10+
export function setExtensionPath(path: string) {
11+
extensionPath = path;
12+
}
13+
14+
export function getExtensionPath() {
15+
if (!extensionPath) {
16+
throw new Error('Failed to set extension path');
17+
}
18+
19+
return extensionPath;
20+
}
21+
22+
export function execChildProcess(command: string, workingDirectory: string = getExtensionPath()): Promise<string> {
23+
return new Promise<string>((resolve, reject) => {
24+
cp.exec(command, { cwd: workingDirectory, maxBuffer: 500 * 1024 }, (error, stdout, stderr) => {
25+
if (error) {
26+
reject(error);
27+
}
28+
else if (stderr && stderr.length > 0) {
29+
reject(new Error(stderr));
30+
}
31+
else {
32+
resolve(stdout);
33+
}
34+
});
35+
});
36+
}

src/coreclr-debug/activate.ts

Lines changed: 38 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import * as fs from 'fs';
99
import TelemetryReporter from 'vscode-extension-telemetry';
1010
import { CoreClrDebugUtil } from './util';
1111
import * as debugInstall from './install';
12-
import { Platform, getCurrentPlatform } from './../platform';
12+
import { PlatformInformation, OperatingSystem, CoreClrFlavor } from './../platform';
1313
import * as semver from 'semver';
1414

1515
const MINIMUM_SUPPORTED_DOTNET_CLI: string = '1.0.0-preview2-003121';
@@ -39,15 +39,18 @@ export function activate(context: vscode.ExtensionContext, reporter: TelemetryRe
3939
let installer = new debugInstall.DebugInstaller(_util);
4040
_util.createInstallLog();
4141

42-
let runtimeId = getPlatformRuntimeId();
43-
4442
let statusBarMessage = vscode.window.setStatusBarMessage("Downloading and configuring the .NET Core Debugger...");
4543

44+
let runtimeId: string = '';
4645
let installStage: string = "installBegin";
4746
let installError: string = '';
4847
let moreErrors: string = '';
4948

50-
writeInstallBeginFile().then(() => {
49+
getPlatformRuntimeId().then(rid => {
50+
runtimeId = rid;
51+
}).then(() => {
52+
return writeInstallBeginFile();
53+
}).then(() => {
5154
return installer.install(runtimeId);
5255
}).then(() => {
5356
installStage = "completeSuccess";
@@ -162,34 +165,35 @@ function deleteInstallBeginFile() {
162165
}
163166
}
164167

165-
function getPlatformRuntimeId() : string {
166-
switch (process.platform) {
167-
case 'win32':
168-
return 'win7-x64';
169-
case 'darwin':
170-
return 'osx.10.11-x64';
171-
case 'linux':
172-
switch (getCurrentPlatform())
173-
{
174-
case Platform.CentOS:
175-
return 'centos.7-x64';
176-
case Platform.Fedora:
177-
return 'fedora.23-x64';
178-
case Platform.OpenSUSE:
179-
return 'opensuse.13.2-x64';
180-
case Platform.RHEL:
181-
return 'rhel.7-x64';
182-
case Platform.Debian:
183-
return 'debian.8-x64';
184-
case Platform.Ubuntu14:
185-
return 'ubuntu.14.04-x64';
186-
case Platform.Ubuntu16:
187-
return 'ubuntu.16.04-x64';
188-
default:
189-
throw Error('Error: Unsupported linux platform');
190-
}
191-
default:
192-
_util.log('Error: Unsupported platform ' + process.platform);
193-
throw Error('Unsupported platform ' + process.platform);
194-
}
168+
function getPlatformRuntimeId(): Promise<string> {
169+
return PlatformInformation.GetCurrent().then(info => {
170+
switch (info.getCoreClrFlavor()) {
171+
case CoreClrFlavor.Windows:
172+
return 'win7-x64';
173+
case CoreClrFlavor.OSX:
174+
return 'osx.10.11-x64';
175+
case CoreClrFlavor.CentOS:
176+
return 'centos.7-x64';
177+
case CoreClrFlavor.Fedora:
178+
return 'fedora.23-x64';
179+
case CoreClrFlavor.OpenSUSE:
180+
return 'opensuse.13.2-x64';
181+
case CoreClrFlavor.RHEL:
182+
return 'rhel.7-x64';
183+
case CoreClrFlavor.Debian:
184+
return 'debian.8-x64';
185+
case CoreClrFlavor.Ubuntu14:
186+
return 'ubuntu.14.04-x64';
187+
case CoreClrFlavor.Ubuntu16:
188+
return 'ubuntu.16.04-x64';
189+
190+
default:
191+
if (info.operatingSystem == OperatingSystem.Linux) {
192+
throw new Error('Error: Unsupported linux platform');
193+
}
194+
195+
_util.log('Error: Unsupported platform ' + process.platform);
196+
throw Error('Unsupported platform ' + process.platform);
197+
}
198+
});
195199
}

src/main.ts

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import {addAssetsIfNecessary, AddAssetResult} from './assets';
2828
import * as vscode from 'vscode';
2929
import TelemetryReporter from 'vscode-extension-telemetry';
3030
import {DefinitionMetadataDocumentProvider} from './features/definitionMetadataDocumentProvider';
31+
import * as util from './common';
3132

3233
export function activate(context: vscode.ExtensionContext): any {
3334

@@ -36,9 +37,11 @@ export function activate(context: vscode.ExtensionContext): any {
3637
const extensionVersion = extension.packageJSON.version;
3738
const aiKey = extension.packageJSON.contributes.debuggers[0].aiKey;
3839

40+
util.setExtensionPath(extension.extensionPath);
41+
3942
const reporter = new TelemetryReporter(extensionId, extensionVersion, aiKey);
4043

41-
const _selector: vscode.DocumentSelector = {
44+
const documentSelector: vscode.DocumentSelector = {
4245
language: 'csharp',
4346
scheme: 'file' // only files from disk
4447
};
@@ -54,21 +57,21 @@ export function activate(context: vscode.ExtensionContext): any {
5457
definitionMetadataDocumentProvider.register();
5558
localDisposables.push(definitionMetadataDocumentProvider);
5659

57-
localDisposables.push(vscode.languages.registerDefinitionProvider(_selector, new DefinitionProvider(server, definitionMetadataDocumentProvider)));
58-
localDisposables.push(vscode.languages.registerCodeLensProvider(_selector, new CodeLensProvider(server)));
59-
localDisposables.push(vscode.languages.registerDocumentHighlightProvider(_selector, new DocumentHighlightProvider(server)));
60-
localDisposables.push(vscode.languages.registerDocumentSymbolProvider(_selector, new DocumentSymbolProvider(server)));
61-
localDisposables.push(vscode.languages.registerReferenceProvider(_selector, new ReferenceProvider(server)));
62-
localDisposables.push(vscode.languages.registerHoverProvider(_selector, new HoverProvider(server)));
63-
localDisposables.push(vscode.languages.registerRenameProvider(_selector, new RenameProvider(server)));
64-
localDisposables.push(vscode.languages.registerDocumentRangeFormattingEditProvider(_selector, new FormatProvider(server)));
65-
localDisposables.push(vscode.languages.registerOnTypeFormattingEditProvider(_selector, new FormatProvider(server), '}', ';'));
66-
localDisposables.push(vscode.languages.registerCompletionItemProvider(_selector, new CompletionItemProvider(server), '.', '<'));
60+
localDisposables.push(vscode.languages.registerDefinitionProvider(documentSelector, new DefinitionProvider(server, definitionMetadataDocumentProvider)));
61+
localDisposables.push(vscode.languages.registerCodeLensProvider(documentSelector, new CodeLensProvider(server)));
62+
localDisposables.push(vscode.languages.registerDocumentHighlightProvider(documentSelector, new DocumentHighlightProvider(server)));
63+
localDisposables.push(vscode.languages.registerDocumentSymbolProvider(documentSelector, new DocumentSymbolProvider(server)));
64+
localDisposables.push(vscode.languages.registerReferenceProvider(documentSelector, new ReferenceProvider(server)));
65+
localDisposables.push(vscode.languages.registerHoverProvider(documentSelector, new HoverProvider(server)));
66+
localDisposables.push(vscode.languages.registerRenameProvider(documentSelector, new RenameProvider(server)));
67+
localDisposables.push(vscode.languages.registerDocumentRangeFormattingEditProvider(documentSelector, new FormatProvider(server)));
68+
localDisposables.push(vscode.languages.registerOnTypeFormattingEditProvider(documentSelector, new FormatProvider(server), '}', ';'));
69+
localDisposables.push(vscode.languages.registerCompletionItemProvider(documentSelector, new CompletionItemProvider(server), '.', '<'));
6770
localDisposables.push(vscode.languages.registerWorkspaceSymbolProvider(new WorkspaceSymbolProvider(server)));
68-
localDisposables.push(vscode.languages.registerSignatureHelpProvider(_selector, new SignatureHelpProvider(server), '(', ','));
71+
localDisposables.push(vscode.languages.registerSignatureHelpProvider(documentSelector, new SignatureHelpProvider(server), '(', ','));
6972
const codeActionProvider = new CodeActionProvider(server);
7073
localDisposables.push(codeActionProvider);
71-
localDisposables.push(vscode.languages.registerCodeActionsProvider(_selector, codeActionProvider));
74+
localDisposables.push(vscode.languages.registerCodeActionsProvider(documentSelector, codeActionProvider));
7275
localDisposables.push(reportDiagnostics(server, advisor));
7376
localDisposables.push(forwardChanges(server));
7477
}));

0 commit comments

Comments
 (0)