diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index 2d953670e38..386cada6f75 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -53,8 +53,8 @@ import { ITelemetryAppenderChannel, TelemetryAppenderClient } from 'vs/platform/ import { TelemetryService, ITelemetryServiceConfig } from 'vs/platform/telemetry/common/telemetryService'; import { resolveCommonProperties } from 'vs/platform/telemetry/node/commonProperties'; import { getDelayedChannel } from 'vs/base/parts/ipc/common/ipc'; -import product from 'vs/platform/product'; -import pkg from 'vs/platform/package'; +import product from 'vs/platform/node/product'; +import pkg from 'vs/platform/node/package'; import * as fs from 'original-fs'; import * as cp from 'child_process'; diff --git a/src/vs/code/electron-main/menus.ts b/src/vs/code/electron-main/menus.ts index c45fdf9ea17..9a89145c64f 100644 --- a/src/vs/code/electron-main/menus.ts +++ b/src/vs/code/electron-main/menus.ts @@ -19,7 +19,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IUpdateService, State as UpdateState } from 'vs/platform/update/common/update'; import { Keybinding } from 'vs/base/common/keyCodes'; import { KeybindingLabels } from 'vs/base/common/keybinding'; -import product from 'vs/platform/product'; +import product from 'vs/platform/node/product'; import { RunOnceScheduler } from 'vs/base/common/async'; interface IResolvedKeybinding { diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index 435082d9be2..a26de77fea4 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -15,7 +15,7 @@ import { IEnvironmentService, ParsedArgs } from 'vs/platform/environment/common/ import { ILogService } from 'vs/code/electron-main/log'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { parseArgs } from 'vs/platform/environment/node/argv'; -import product from 'vs/platform/product'; +import product from 'vs/platform/node/product'; import { getCommonHTTPHeaders } from 'vs/platform/environment/node/http'; import { IWindowSettings } from 'vs/platform/windows/common/windows'; diff --git a/src/vs/code/electron-main/windows.ts b/src/vs/code/electron-main/windows.ts index 185f4a0dc37..a7dcb1b83e0 100644 --- a/src/vs/code/electron-main/windows.ts +++ b/src/vs/code/electron-main/windows.ts @@ -27,7 +27,7 @@ import { getPathLabel } from 'vs/base/common/labels'; import { createDecorator, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IWindowSettings } from 'vs/platform/windows/common/windows'; import CommonEvent, { Emitter } from 'vs/base/common/event'; -import product from 'vs/platform/product'; +import product from 'vs/platform/node/product'; enum WindowError { UNRESPONSIVE, diff --git a/src/vs/code/node/cli.ts b/src/vs/code/node/cli.ts index 1e814e1e921..5847fc676dc 100644 --- a/src/vs/code/node/cli.ts +++ b/src/vs/code/node/cli.ts @@ -8,8 +8,8 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { assign } from 'vs/base/common/objects'; import { parseCLIProcessArgv, buildHelpMessage } from 'vs/platform/environment/node/argv'; import { ParsedArgs } from 'vs/platform/environment/common/environment'; -import product from 'vs/platform/product'; -import pkg from 'vs/platform/package'; +import product from 'vs/platform/node/product'; +import pkg from 'vs/platform/node/package'; function shouldSpawnCliProcess(argv: ParsedArgs): boolean { return argv['list-extensions'] || !!argv['install-extension'] || !!argv['uninstall-extension']; diff --git a/src/vs/code/node/cliProcessMain.ts b/src/vs/code/node/cliProcessMain.ts index cd2bbef07fd..3cedfc323c7 100644 --- a/src/vs/code/node/cliProcessMain.ts +++ b/src/vs/code/node/cliProcessMain.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { localize } from 'vs/nls'; -import product from 'vs/platform/product'; -import pkg from 'vs/platform/package'; +import product from 'vs/platform/node/product'; +import pkg from 'vs/platform/node/package'; import * as path from 'path'; import { TPromise } from 'vs/base/common/winjs.base'; diff --git a/src/vs/code/node/sharedProcessMain.ts b/src/vs/code/node/sharedProcessMain.ts index 5ca599fadda..e4ae2d9af2e 100644 --- a/src/vs/code/node/sharedProcessMain.ts +++ b/src/vs/code/node/sharedProcessMain.ts @@ -5,8 +5,8 @@ import * as fs from 'fs'; import * as platform from 'vs/base/common/platform'; -import product from 'vs/platform/product'; -import pkg from 'vs/platform/package'; +import product from 'vs/platform/node/product'; +import pkg from 'vs/platform/node/package'; import { serve, Server, connect } from 'vs/base/parts/ipc/node/ipc.net'; import { TPromise } from 'vs/base/common/winjs.base'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index dffb97f6b02..a95ec8f2bea 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -47,6 +47,8 @@ export interface IEnvironmentService { userProductHome: string; userDataPath: string; + appNameLong: string; + appQuality: string; appSettingsHome: string; appSettingsPath: string; appKeybindingsPath: string; diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts index b9a85d5bc4f..7e61cdd8c2f 100644 --- a/src/vs/platform/environment/node/environmentService.ts +++ b/src/vs/platform/environment/node/environmentService.ts @@ -10,8 +10,8 @@ import * as os from 'os'; import * as path from 'path'; import URI from 'vs/base/common/uri'; import { memoize } from 'vs/base/common/decorators'; -import pkg from 'vs/platform/package'; -import product from 'vs/platform/product'; +import pkg from 'vs/platform/node/package'; +import product from 'vs/platform/node/product'; function getUniqueUserId(): string { let username: string; @@ -70,6 +70,10 @@ export class EnvironmentService implements IEnvironmentService { @memoize get userDataPath(): string { return parseUserDataDir(this._args, process); } + get appNameLong(): string { return product.nameLong; } + + get appQuality(): string { return product.quality; } + @memoize get appSettingsHome(): string { return path.join(this.userDataPath, 'User'); } diff --git a/src/vs/platform/environment/node/http.ts b/src/vs/platform/environment/node/http.ts index d1bf7af0181..cbc0b80a6e6 100644 --- a/src/vs/platform/environment/node/http.ts +++ b/src/vs/platform/environment/node/http.ts @@ -5,7 +5,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { getMachineId } from 'vs/base/node/id'; -import pkg from 'vs/platform/package'; +import pkg from 'vs/platform/node/package'; export function getCommonHTTPHeaders(): TPromise<{ [key: string]: string; }> { return getMachineId().then(machineId => ({ diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index 46a53a1f471..d26da5c17ee 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -19,8 +19,8 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IPager } from 'vs/base/common/paging'; import { IRequestOptions, IRequestContext, download, asJson, asText } from 'vs/base/node/request'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import pkg from 'vs/platform/package'; -import product from 'vs/platform/product'; +import pkg from 'vs/platform/node/package'; +import product from 'vs/platform/node/product'; import { isVersionValid } from 'vs/platform/extensions/node/extensionValidator'; import { getCommonHTTPHeaders } from 'vs/platform/environment/node/http'; diff --git a/src/vs/platform/integrity/node/integrityServiceImpl.ts b/src/vs/platform/integrity/node/integrityServiceImpl.ts index 930bf306551..30078cac385 100644 --- a/src/vs/platform/integrity/node/integrityServiceImpl.ts +++ b/src/vs/platform/integrity/node/integrityServiceImpl.ts @@ -10,7 +10,7 @@ import * as crypto from 'crypto'; import { TPromise } from 'vs/base/common/winjs.base'; import { IIntegrityService, IntegrityTestResult, ChecksumPair } from 'vs/platform/integrity/common/integrity'; import { IMessageService } from 'vs/platform/message/common/message'; -import product from 'vs/platform/product'; +import product from 'vs/platform/node/product'; import URI from 'vs/base/common/uri'; import Severity from 'vs/base/common/severity'; import { Action } from 'vs/base/common/actions'; diff --git a/src/vs/platform/package.ts b/src/vs/platform/node/package.ts similarity index 100% rename from src/vs/platform/package.ts rename to src/vs/platform/node/package.ts diff --git a/src/vs/platform/product.ts b/src/vs/platform/node/product.ts similarity index 100% rename from src/vs/platform/product.ts rename to src/vs/platform/node/product.ts diff --git a/src/vs/platform/update/electron-main/auto-updater.linux.ts b/src/vs/platform/update/electron-main/auto-updater.linux.ts index 0b8b21d6107..bdc9c183329 100644 --- a/src/vs/platform/update/electron-main/auto-updater.linux.ts +++ b/src/vs/platform/update/electron-main/auto-updater.linux.ts @@ -11,7 +11,7 @@ import { Promise } from 'vs/base/common/winjs.base'; import { asJson } from 'vs/base/node/request'; import { IRequestService } from 'vs/platform/request/node/request'; import { IAutoUpdater } from 'vs/platform/update/common/update'; -import product from 'vs/platform/product'; +import product from 'vs/platform/node/product'; interface IUpdate { url: string; diff --git a/src/vs/platform/update/electron-main/auto-updater.win32.ts b/src/vs/platform/update/electron-main/auto-updater.win32.ts index a368f5ae273..1e0b72718c6 100644 --- a/src/vs/platform/update/electron-main/auto-updater.win32.ts +++ b/src/vs/platform/update/electron-main/auto-updater.win32.ts @@ -17,7 +17,7 @@ import { Promise, TPromise } from 'vs/base/common/winjs.base'; import { download, asJson } from 'vs/base/node/request'; import { IRequestService } from 'vs/platform/request/node/request'; import { IAutoUpdater } from 'vs/platform/update/common/update'; -import product from 'vs/platform/product'; +import product from 'vs/platform/node/product'; interface IUpdate { url: string; diff --git a/src/vs/platform/update/electron-main/updateService.ts b/src/vs/platform/update/electron-main/updateService.ts index e2baeda6ea5..f9fe6fc471b 100644 --- a/src/vs/platform/update/electron-main/updateService.ts +++ b/src/vs/platform/update/electron-main/updateService.ts @@ -18,7 +18,7 @@ import { Win32AutoUpdaterImpl } from './auto-updater.win32'; import { LinuxAutoUpdaterImpl } from './auto-updater.linux'; import { ILifecycleService } from 'vs/code/electron-main/lifecycle'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import product from 'vs/platform/product'; +import product from 'vs/platform/node/product'; import { TPromise } from 'vs/base/common/winjs.base'; import { IUpdateService, State, IAutoUpdater, IUpdate, IRawUpdate } from 'vs/platform/update/common/update'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; diff --git a/src/vs/platform/url/electron-main/urlService.ts b/src/vs/platform/url/electron-main/urlService.ts index 08c2206dad6..ee2a7b87407 100644 --- a/src/vs/platform/url/electron-main/urlService.ts +++ b/src/vs/platform/url/electron-main/urlService.ts @@ -8,7 +8,7 @@ import Event, { mapEvent, chain, buffer, Emitter, any } from 'vs/base/common/event'; import { fromEventEmitter } from 'vs/base/node/event'; import { IURLService } from 'vs/platform/url/common/url'; -import product from 'vs/platform/product'; +import product from 'vs/platform/node/product'; import { app } from 'electron'; import URI from 'vs/base/common/uri'; diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index dd4b87a17c5..b773d324ecb 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -10,8 +10,8 @@ import { score } from 'vs/editor/common/modes/languageSelector'; import * as Platform from 'vs/base/common/platform'; import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; import * as errors from 'vs/base/common/errors'; -import product from 'vs/platform/product'; -import pkg from 'vs/platform/package'; +import product from 'vs/platform/node/product'; +import pkg from 'vs/platform/node/package'; import { ExtHostFileSystemEventService } from 'vs/workbench/api/node/extHostFileSystemEventService'; import { ExtHostDocuments } from 'vs/workbench/api/node/extHostDocuments'; import { ExtHostDocumentSaveParticipant } from 'vs/workbench/api/node/extHostDocumentSaveParticipant'; diff --git a/src/vs/workbench/api/node/mainThreadExtensionService.ts b/src/vs/workbench/api/node/mainThreadExtensionService.ts index 18ddb4701c3..195282ff12b 100644 --- a/src/vs/workbench/api/node/mainThreadExtensionService.ts +++ b/src/vs/workbench/api/node/mainThreadExtensionService.ts @@ -6,7 +6,7 @@ import Severity from 'vs/base/common/severity'; import { TPromise } from 'vs/base/common/winjs.base'; -import pkg from 'vs/platform/package'; +import pkg from 'vs/platform/node/package'; import { localize } from 'vs/nls'; import * as path from 'path'; import URI from 'vs/base/common/uri'; diff --git a/src/vs/workbench/electron-browser/actions.ts b/src/vs/workbench/electron-browser/actions.ts index b1dc8154e65..792ab20740f 100644 --- a/src/vs/workbench/electron-browser/actions.ts +++ b/src/vs/workbench/electron-browser/actions.ts @@ -14,8 +14,8 @@ import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/edi import { EditorInput } from 'vs/workbench/common/editor'; import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; import nls = require('vs/nls'); -import product from 'vs/platform/product'; -import pkg from 'vs/platform/package'; +import product from 'vs/platform/node/product'; +import pkg from 'vs/platform/node/package'; import errors = require('vs/base/common/errors'); import { IMessageService, Severity } from 'vs/platform/message/common/message'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; diff --git a/src/vs/workbench/electron-browser/crashReporter.ts b/src/vs/workbench/electron-browser/crashReporter.ts index 302f8671bdc..d1a677fd783 100644 --- a/src/vs/workbench/electron-browser/crashReporter.ts +++ b/src/vs/workbench/electron-browser/crashReporter.ts @@ -13,8 +13,8 @@ import { IWindowsService } from 'vs/platform/windows/common/windows'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { Registry } from 'vs/platform/platform'; import { crashReporter } from 'electron'; -import product from 'vs/platform/product'; -import pkg from 'vs/platform/package'; +import product from 'vs/platform/node/product'; +import pkg from 'vs/platform/node/package'; const TELEMETRY_SECTION_ID = 'telemetry'; diff --git a/src/vs/workbench/electron-browser/extensionHost.ts b/src/vs/workbench/electron-browser/extensionHost.ts index ccbd2f1392c..3963bc46802 100644 --- a/src/vs/workbench/electron-browser/extensionHost.ts +++ b/src/vs/workbench/electron-browser/extensionHost.ts @@ -21,7 +21,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IWindowIPCService } from 'vs/workbench/services/window/electron-browser/windowService'; import { ChildProcess, fork } from 'child_process'; import { ipcRenderer as ipc } from 'electron'; -import product from 'vs/platform/product'; +import product from 'vs/platform/node/product'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { ReloadWindowAction } from 'vs/workbench/electron-browser/actions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index 0dd85b2957b..cebf0abbf80 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -7,7 +7,7 @@ import { Registry } from 'vs/platform/platform'; import nls = require('vs/nls'); -import product from 'vs/platform/product'; +import product from 'vs/platform/node/product'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actionRegistry'; diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index c3686f69955..8b04cc04e01 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -16,9 +16,9 @@ import aria = require('vs/base/browser/ui/aria/aria'); import { dispose, IDisposable, Disposables } from 'vs/base/common/lifecycle'; import errors = require('vs/base/common/errors'); import { toErrorMessage } from 'vs/base/common/errorMessage'; -import product from 'vs/platform/product'; +import product from 'vs/platform/node/product'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; -import pkg from 'vs/platform/package'; +import pkg from 'vs/platform/node/package'; import { ContextViewService } from 'vs/platform/contextview/browser/contextViewService'; import { Workbench, IWorkbenchStartedInfo } from 'vs/workbench/electron-browser/workbench'; import { StorageService, inMemoryLocalStorageInstance } from 'vs/workbench/services/storage/common/storageService'; diff --git a/src/vs/workbench/electron-browser/workbench.main.ts b/src/vs/workbench/electron-browser/workbench.main.ts index 4f87788f2e7..00480dbd261 100644 --- a/src/vs/workbench/electron-browser/workbench.main.ts +++ b/src/vs/workbench/electron-browser/workbench.main.ts @@ -90,13 +90,13 @@ import 'vs/workbench/parts/contentprovider/common/contentprovider.contribution'; import 'vs/workbench/parts/themes/electron-browser/themes.contribution'; -import 'vs/workbench/parts/feedback/browser/feedback.contribution'; +import 'vs/workbench/parts/feedback/electron-browser/feedback.contribution'; -import 'vs/workbench/parts/welcome/browser/gettingStarted.contribution'; +import 'vs/workbench/parts/welcome/electron-browser/gettingStarted.contribution'; import 'vs/workbench/parts/update/electron-browser/update.contribution'; -import 'vs/workbench/parts/nps/browser/nps.contribution'; +import 'vs/workbench/parts/nps/electron-browser/nps.contribution'; import 'vs/workbench/parts/cli/electron-browser/cli.contribution'; diff --git a/src/vs/workbench/parts/cli/electron-browser/cli.contribution.ts b/src/vs/workbench/parts/cli/electron-browser/cli.contribution.ts index 1a0a44ef982..69bdbdd4425 100644 --- a/src/vs/workbench/parts/cli/electron-browser/cli.contribution.ts +++ b/src/vs/workbench/parts/cli/electron-browser/cli.contribution.ts @@ -20,7 +20,7 @@ import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { IMessageService, Severity } from 'vs/platform/message/common/message'; import { IEditorService } from 'vs/platform/editor/common/editor'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import product from 'vs/platform/product'; +import product from 'vs/platform/node/product'; interface ILegacyUse { file: string; diff --git a/src/vs/workbench/parts/extensions/browser/extensionEditor.ts b/src/vs/workbench/parts/extensions/browser/extensionEditor.ts index 70975873fe8..9e759f642bf 100644 --- a/src/vs/workbench/parts/extensions/browser/extensionEditor.ts +++ b/src/vs/workbench/parts/extensions/browser/extensionEditor.ts @@ -33,7 +33,6 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { ITemplateData } from 'vs/workbench/parts/extensions/browser/extensionsList'; import { RatingsWidget, InstallWidget } from 'vs/workbench/parts/extensions/browser/extensionsWidgets'; import { EditorOptions } from 'vs/workbench/common/editor'; -import product from 'vs/platform/product'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { CombinedInstallAction, UpdateAction, EnableAction, DisableAction, BuiltinStatusLabelAction, ReloadAction } from 'vs/workbench/parts/extensions/browser/extensionsActions'; import WebView from 'vs/workbench/parts/html/browser/webview'; @@ -241,11 +240,9 @@ export class ExtensionEditor extends BaseEditor { this.publisher.textContent = extension.publisherDisplayName; this.description.textContent = extension.description; - if (product.extensionsGallery) { - const extensionUrl = `${product.extensionsGallery.itemUrl}?itemName=${extension.publisher}.${extension.name}`; - - this.name.onclick = finalHandler(() => window.open(extensionUrl)); - this.rating.onclick = finalHandler(() => window.open(`${extensionUrl}#review-details`)); + if (extension.url) { + this.name.onclick = finalHandler(() => window.open(extension.url)); + this.rating.onclick = finalHandler(() => window.open(`${extension.url}#review-details`)); this.publisher.onclick = finalHandler(() => { this.viewletService.openViewlet(VIEWLET_ID, true) .then(viewlet => viewlet as IExtensionsViewlet) diff --git a/src/vs/workbench/parts/extensions/common/extensions.ts b/src/vs/workbench/parts/extensions/common/extensions.ts index d9501bf6ff9..01ac0bdb78e 100644 --- a/src/vs/workbench/parts/extensions/common/extensions.ts +++ b/src/vs/workbench/parts/extensions/common/extensions.ts @@ -34,6 +34,7 @@ export interface IExtension { version: string; latestVersion: string; description: string; + url: string; iconUrl: string; iconUrlFallback: string; licenseUrl: string; diff --git a/src/vs/workbench/parts/extensions/browser/extensionTipsService.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts similarity index 99% rename from src/vs/workbench/parts/extensions/browser/extensionTipsService.ts rename to src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts index 8dd390481f3..bbff5c3023c 100644 --- a/src/vs/workbench/parts/extensions/browser/extensionTipsService.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts @@ -14,7 +14,7 @@ import { IExtensionManagementService, IExtensionGalleryService, IExtensionTipsSe import { IModelService } from 'vs/editor/common/services/modelService'; import { IModel } from 'vs/editor/common/editorCommon'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; -import product from 'vs/platform/product'; +import product from 'vs/platform/node/product'; import { IChoiceService } from 'vs/platform/message/common/message'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ShowRecommendedExtensionsAction, ShowWorkspaceRecommendedExtensionsAction } from 'vs/workbench/parts/extensions/browser/extensionsActions'; diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts index 041fe078216..e0ea965c2dd 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts @@ -13,7 +13,7 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IExtensionGalleryService, IExtensionTipsService, ExtensionsLabel, ExtensionsChannelId, PreferencesLabel } from 'vs/platform/extensionManagement/common/extensionManagement'; import { ExtensionGalleryService } from 'vs/platform/extensionManagement/node/extensionGalleryService'; import { IWorkbenchActionRegistry, Extensions as WorkbenchActionExtensions } from 'vs/workbench/common/actionRegistry'; -import { ExtensionTipsService } from 'vs/workbench/parts/extensions/browser/extensionTipsService'; +import { ExtensionTipsService } from 'vs/workbench/parts/extensions/electron-browser/extensionTipsService'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; import { IOutputChannelRegistry, Extensions as OutputExtensions } from 'vs/workbench/parts/output/common/output'; import { EditorDescriptor } from 'vs/workbench/browser/parts/editor/baseEditor'; diff --git a/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts b/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts index 2e04b54eb74..9dedbf25e0d 100644 --- a/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts +++ b/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts @@ -35,6 +35,7 @@ import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/edi import { IURLService } from 'vs/platform/url/common/url'; import { ExtensionsInput } from 'vs/workbench/parts/extensions/common/extensionsInput'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import product from 'vs/platform/node/product'; interface IExtensionStateProvider { (extension: Extension): ExtensionState; @@ -100,6 +101,14 @@ class Extension implements IExtension { return this.gallery ? this.gallery.description : this.local.manifest.description; } + get url(): string { + if (!product.extensionsGallery) { + return null; + } + + return `${product.extensionsGallery.itemUrl}?itemName=${this.publisher}.${this.name}`; + } + get iconUrl(): string { return this.galleryIconUrl || this.localIconUrl || this.defaultIconUrl; } diff --git a/src/vs/workbench/parts/extensions/test/extensionsActions.test.ts b/src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts similarity index 99% rename from src/vs/workbench/parts/extensions/test/extensionsActions.test.ts rename to src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts index 3b09abb1afa..70e248a8b93 100644 --- a/src/vs/workbench/parts/extensions/test/extensionsActions.test.ts +++ b/src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts @@ -17,7 +17,7 @@ import { DidInstallExtensionEvent, DidUninstallExtensionEvent, InstallExtensionEvent } from 'vs/platform/extensionManagement/common/extensionManagement'; import { ExtensionManagementService } from 'vs/platform/extensionManagement/node/extensionManagementService'; -import { ExtensionTipsService } from 'vs/workbench/parts/extensions/browser/extensionTipsService'; +import { ExtensionTipsService } from 'vs/workbench/parts/extensions/electron-browser/extensionTipsService'; import { TestExtensionEnablementService } from 'vs/platform/extensionManagement/test/common/extensionEnablementService.test'; import { ExtensionGalleryService } from 'vs/platform/extensionManagement/node/extensionGalleryService'; import { IURLService } from 'vs/platform/url/common/url'; diff --git a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsWorkbenchService.test.ts b/src/vs/workbench/parts/extensions/test/electron-browser/extensionsWorkbenchService.test.ts index b039168960d..4ea4820caf1 100644 --- a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsWorkbenchService.test.ts +++ b/src/vs/workbench/parts/extensions/test/electron-browser/extensionsWorkbenchService.test.ts @@ -18,7 +18,7 @@ import { DidInstallExtensionEvent, DidUninstallExtensionEvent, InstallExtensionEvent, IGalleryExtensionAssets } from 'vs/platform/extensionManagement/common/extensionManagement'; import { ExtensionManagementService } from 'vs/platform/extensionManagement/node/extensionManagementService'; -import { ExtensionTipsService } from 'vs/workbench/parts/extensions/browser/extensionTipsService'; +import { ExtensionTipsService } from 'vs/workbench/parts/extensions/electron-browser/extensionTipsService'; import { TestExtensionEnablementService } from 'vs/platform/extensionManagement/test/common/extensionEnablementService.test'; import { ExtensionGalleryService } from 'vs/platform/extensionManagement/node/extensionGalleryService'; import { IURLService } from 'vs/platform/url/common/url'; diff --git a/src/vs/workbench/parts/feedback/browser/feedback.contribution.ts b/src/vs/workbench/parts/feedback/electron-browser/feedback.contribution.ts similarity index 88% rename from src/vs/workbench/parts/feedback/browser/feedback.contribution.ts rename to src/vs/workbench/parts/feedback/electron-browser/feedback.contribution.ts index c16f02d9c80..5ae6e8c9f13 100644 --- a/src/vs/workbench/parts/feedback/browser/feedback.contribution.ts +++ b/src/vs/workbench/parts/feedback/electron-browser/feedback.contribution.ts @@ -6,7 +6,7 @@ import { Registry } from 'vs/platform/platform'; import { StatusbarAlignment, IStatusbarRegistry, Extensions, StatusbarItemDescriptor } from 'vs/workbench/browser/parts/statusbar/statusbar'; -import { FeedbackStatusbarItem } from 'vs/workbench/parts/feedback/browser/feedbackStatusbarItem'; +import { FeedbackStatusbarItem } from './feedbackStatusbarItem'; // Register Statusbar item Registry.as(Extensions.Statusbar).registerStatusbarItem(new StatusbarItemDescriptor( diff --git a/src/vs/workbench/parts/feedback/browser/feedback.ts b/src/vs/workbench/parts/feedback/electron-browser/feedback.ts similarity index 99% rename from src/vs/workbench/parts/feedback/browser/feedback.ts rename to src/vs/workbench/parts/feedback/electron-browser/feedback.ts index d2de597a453..d1e539a917a 100644 --- a/src/vs/workbench/parts/feedback/browser/feedback.ts +++ b/src/vs/workbench/parts/feedback/electron-browser/feedback.ts @@ -12,7 +12,7 @@ import { Builder, $ } from 'vs/base/browser/builder'; import { Dropdown } from 'vs/base/browser/ui/dropdown/dropdown'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import product from 'vs/platform/product'; +import product from 'vs/platform/node/product'; import * as dom from 'vs/base/browser/dom'; import { ICommandService } from 'vs/platform/commands/common/commands'; import * as errors from 'vs/base/common/errors'; diff --git a/src/vs/workbench/parts/feedback/browser/feedbackStatusbarItem.ts b/src/vs/workbench/parts/feedback/electron-browser/feedbackStatusbarItem.ts similarity index 93% rename from src/vs/workbench/parts/feedback/browser/feedbackStatusbarItem.ts rename to src/vs/workbench/parts/feedback/electron-browser/feedbackStatusbarItem.ts index 323665c1293..95a32717dfd 100644 --- a/src/vs/workbench/parts/feedback/browser/feedbackStatusbarItem.ts +++ b/src/vs/workbench/parts/feedback/electron-browser/feedbackStatusbarItem.ts @@ -7,10 +7,10 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { IStatusbarItem } from 'vs/workbench/browser/parts/statusbar/statusbar'; -import { FeedbackDropdown, IFeedback, IFeedbackService } from 'vs/workbench/parts/feedback/browser/feedback'; +import { FeedbackDropdown, IFeedback, IFeedbackService } from './feedback'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import product from 'vs/platform/product'; +import product from 'vs/platform/node/product'; class TwitterFeedbackService implements IFeedbackService { diff --git a/src/vs/workbench/parts/feedback/browser/media/close-dark.svg b/src/vs/workbench/parts/feedback/electron-browser/media/close-dark.svg similarity index 100% rename from src/vs/workbench/parts/feedback/browser/media/close-dark.svg rename to src/vs/workbench/parts/feedback/electron-browser/media/close-dark.svg diff --git a/src/vs/workbench/parts/feedback/browser/media/close.svg b/src/vs/workbench/parts/feedback/electron-browser/media/close.svg similarity index 100% rename from src/vs/workbench/parts/feedback/browser/media/close.svg rename to src/vs/workbench/parts/feedback/electron-browser/media/close.svg diff --git a/src/vs/workbench/parts/feedback/browser/media/feedback.css b/src/vs/workbench/parts/feedback/electron-browser/media/feedback.css similarity index 100% rename from src/vs/workbench/parts/feedback/browser/media/feedback.css rename to src/vs/workbench/parts/feedback/electron-browser/media/feedback.css diff --git a/src/vs/workbench/parts/feedback/browser/media/happy.svg b/src/vs/workbench/parts/feedback/electron-browser/media/happy.svg similarity index 100% rename from src/vs/workbench/parts/feedback/browser/media/happy.svg rename to src/vs/workbench/parts/feedback/electron-browser/media/happy.svg diff --git a/src/vs/workbench/parts/feedback/browser/media/info.svg b/src/vs/workbench/parts/feedback/electron-browser/media/info.svg similarity index 100% rename from src/vs/workbench/parts/feedback/browser/media/info.svg rename to src/vs/workbench/parts/feedback/electron-browser/media/info.svg diff --git a/src/vs/workbench/parts/feedback/browser/media/sad.svg b/src/vs/workbench/parts/feedback/electron-browser/media/sad.svg similarity index 100% rename from src/vs/workbench/parts/feedback/browser/media/sad.svg rename to src/vs/workbench/parts/feedback/electron-browser/media/sad.svg diff --git a/src/vs/workbench/parts/feedback/browser/media/smiley.svg b/src/vs/workbench/parts/feedback/electron-browser/media/smiley.svg similarity index 100% rename from src/vs/workbench/parts/feedback/browser/media/smiley.svg rename to src/vs/workbench/parts/feedback/electron-browser/media/smiley.svg diff --git a/src/vs/workbench/parts/feedback/browser/media/twitter.svg b/src/vs/workbench/parts/feedback/electron-browser/media/twitter.svg similarity index 100% rename from src/vs/workbench/parts/feedback/browser/media/twitter.svg rename to src/vs/workbench/parts/feedback/electron-browser/media/twitter.svg diff --git a/src/vs/workbench/parts/files/browser/saveErrorHandler.ts b/src/vs/workbench/parts/files/browser/saveErrorHandler.ts index 31ea4662869..46293cb8122 100644 --- a/src/vs/workbench/parts/files/browser/saveErrorHandler.ts +++ b/src/vs/workbench/parts/files/browser/saveErrorHandler.ts @@ -11,7 +11,6 @@ import { toErrorMessage } from 'vs/base/common/errorMessage'; import paths = require('vs/base/common/paths'); import { Action } from 'vs/base/common/actions'; import URI from 'vs/base/common/uri'; -import product from 'vs/platform/product'; import { ITextEditorModel } from 'vs/workbench/common/editor'; import { EditorInputAction } from 'vs/workbench/browser/parts/editor/baseEditor'; import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; @@ -20,6 +19,7 @@ import { DiffEditorModel } from 'vs/workbench/common/editor/diffEditorModel'; import { FileEditorInput } from 'vs/workbench/parts/files/common/editors/fileEditorInput'; import { SaveFileAsAction, RevertFileAction, SaveFileAction } from 'vs/workbench/parts/files/browser/fileActions'; import { IFileOperationResult, FileOperationResult } from 'vs/platform/files/common/files'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ITextFileService, ISaveErrorHandler, ITextFileEditorModel } from 'vs/workbench/services/textfile/common/textfiles'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -245,7 +245,8 @@ class ResolveSaveConflictMessage implements IMessageWithAction { message: string, @IMessageService private messageService: IMessageService, @IInstantiationService private instantiationService: IInstantiationService, - @IWorkbenchEditorService private editorService: IWorkbenchEditorService + @IWorkbenchEditorService private editorService: IWorkbenchEditorService, + @IEnvironmentService private environmentService: IEnvironmentService ) { this.model = model; @@ -261,7 +262,7 @@ class ResolveSaveConflictMessage implements IMessageWithAction { if (!this.model.isDisposed()) { const originalInput = this.instantiationService.createInstance(FileOnDiskEditorInput, resource, paths.basename(resource.fsPath), resource.fsPath); const modifiedInput = this.instantiationService.createInstance(FileEditorInput, resource, void 0); - const conflictInput = this.instantiationService.createInstance(ConflictResolutionDiffEditorInput, this.model, nls.localize('saveConflictDiffLabel', "{0} (on disk) ↔ {1} (in {2})", modifiedInput.getName(), modifiedInput.getName(), product.nameLong), nls.localize('resolveSaveConflict', "Resolve save conflict"), originalInput, modifiedInput); + const conflictInput = this.instantiationService.createInstance(ConflictResolutionDiffEditorInput, this.model, nls.localize('saveConflictDiffLabel', "{0} (on disk) ↔ {1} (in {2})", modifiedInput.getName(), modifiedInput.getName(), this.environmentService.appNameLong), nls.localize('resolveSaveConflict', "Resolve save conflict"), originalInput, modifiedInput); return this.editorService.openEditor(conflictInput).then(() => { diff --git a/src/vs/workbench/parts/git/browser/views/gitless/gitlessView.ts b/src/vs/workbench/parts/git/browser/views/gitless/gitlessView.ts index 78c73c8d013..e615cf87e76 100644 --- a/src/vs/workbench/parts/git/browser/views/gitless/gitlessView.ts +++ b/src/vs/workbench/parts/git/browser/views/gitless/gitlessView.ts @@ -13,7 +13,6 @@ import ee = require('vs/base/common/eventEmitter'); import view = require('vs/workbench/parts/git/browser/views/view'); import builder = require('vs/base/browser/builder'); import actions = require('vs/base/common/actions'); -import product from 'vs/platform/product'; var $ = builder.$; @@ -68,7 +67,7 @@ export class GitlessView '
', '

', nls.localize('looksLike', "It looks like git is not installed on your system."), '

', '

', instructions, '

', - '

', nls.localize('pleaseRestart', "Once git is installed, please restart {0}.", product.nameLong), '

', + '

', nls.localize('pleaseRestart', "Once git is installed, please restart VSCode."), '

', '
' ].join('')).getHTMLElement(); } diff --git a/src/vs/workbench/parts/nps/browser/nps.contribution.ts b/src/vs/workbench/parts/nps/electron-browser/nps.contribution.ts similarity index 97% rename from src/vs/workbench/parts/nps/browser/nps.contribution.ts rename to src/vs/workbench/parts/nps/electron-browser/nps.contribution.ts index ef8feee60df..f48dd5b57b9 100644 --- a/src/vs/workbench/parts/nps/browser/nps.contribution.ts +++ b/src/vs/workbench/parts/nps/electron-browser/nps.contribution.ts @@ -15,8 +15,8 @@ import { IMessageService, Severity } from 'vs/platform/message/common/message'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; -import pkg from 'vs/platform/package'; -import product from 'vs/platform/product'; +import pkg from 'vs/platform/node/package'; +import product from 'vs/platform/node/product'; const PROBABILITY = 0.15; const SESSION_COUNT_KEY = 'nps/sessionCount'; diff --git a/src/vs/workbench/parts/update/electron-browser/update.ts b/src/vs/workbench/parts/update/electron-browser/update.ts index 9ccc80e3f6b..3e74855267d 100644 --- a/src/vs/workbench/parts/update/electron-browser/update.ts +++ b/src/vs/workbench/parts/update/electron-browser/update.ts @@ -10,8 +10,8 @@ import severity from 'vs/base/common/severity'; import { TPromise } from 'vs/base/common/winjs.base'; import { Action } from 'vs/base/common/actions'; import { IMessageService, CloseAction, Severity } from 'vs/platform/message/common/message'; -import pkg from 'vs/platform/package'; -import product from 'vs/platform/product'; +import pkg from 'vs/platform/node/package'; +import product from 'vs/platform/node/product'; import URI from 'vs/base/common/uri'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/workbench/parts/welcome/browser/gettingStarted.ts b/src/vs/workbench/parts/welcome/browser/gettingStarted.ts deleted file mode 100644 index 48759e78af4..00000000000 --- a/src/vs/workbench/parts/welcome/browser/gettingStarted.ts +++ /dev/null @@ -1,28 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import { AbstractGettingStarted } from 'vs/workbench/parts/welcome/common/abstractGettingStarted'; -import * as platform from 'vs/base/common/platform'; - -export class GettingStarted extends AbstractGettingStarted implements IWorkbenchContribution { - - protected openExternal(url: string) { - // Don't open the welcome page as the root user on Linux, this is due to a bug with xdg-open - // which recommends against running itself as root. - if (platform.isLinux && platform.isRootUser) { - return; - } - window.open(url); - } - - protected handleWelcome(): void { - //make sure the user is online, otherwise refer to the next run to show the welcome page - if (navigator.onLine) { - super.handleWelcome(); - } - } -} \ No newline at end of file diff --git a/src/vs/workbench/parts/welcome/browser/gettingStarted.contribution.ts b/src/vs/workbench/parts/welcome/electron-browser/gettingStarted.contribution.ts similarity index 71% rename from src/vs/workbench/parts/welcome/browser/gettingStarted.contribution.ts rename to src/vs/workbench/parts/welcome/electron-browser/gettingStarted.contribution.ts index 674b43b1805..b7a3f9e9851 100644 --- a/src/vs/workbench/parts/welcome/browser/gettingStarted.contribution.ts +++ b/src/vs/workbench/parts/welcome/electron-browser/gettingStarted.contribution.ts @@ -5,9 +5,9 @@ 'use strict'; import { Registry } from 'vs/platform/platform'; -import { GettingStarted } from 'vs/workbench/parts/welcome/browser/gettingStarted'; +import { GettingStarted } from './gettingStarted'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; -Registry.as(WorkbenchExtensions.Workbench).registerWorkbenchContribution( - GettingStarted -); \ No newline at end of file +Registry + .as(WorkbenchExtensions.Workbench) + .registerWorkbenchContribution(GettingStarted); \ No newline at end of file diff --git a/src/vs/workbench/parts/welcome/common/abstractGettingStarted.ts b/src/vs/workbench/parts/welcome/electron-browser/gettingStarted.ts similarity index 51% rename from src/vs/workbench/parts/welcome/common/abstractGettingStarted.ts rename to src/vs/workbench/parts/welcome/electron-browser/gettingStarted.ts index 3d022a3d2b0..ee9546ccc85 100644 --- a/src/vs/workbench/parts/welcome/common/abstractGettingStarted.ts +++ b/src/vs/workbench/parts/welcome/electron-browser/gettingStarted.ts @@ -8,12 +8,10 @@ import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { ITelemetryService, ITelemetryInfo } from 'vs/platform/telemetry/common/telemetry'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import product from 'vs/platform/product'; +import * as platform from 'vs/base/common/platform'; +import product from 'vs/platform/node/product'; -/** - * This extensions handles the first launch expereince for new users - */ -export abstract class AbstractGettingStarted implements IWorkbenchContribution { +abstract class AbstractGettingStarted implements IWorkbenchContribution { protected static hideWelcomeSettingskey = 'workbench.hide.welcome'; protected welcomePageURL: string; @@ -54,7 +52,64 @@ export abstract class AbstractGettingStarted implements IWorkbenchContribution { throw new Error('implement me'); } - public getId(): string { + getId(): string { return 'vs.gettingstarted'; } +} + +export class GettingStarted implements IWorkbenchContribution { + + private static hideWelcomeSettingskey = 'workbench.hide.welcome'; + + private welcomePageURL: string; + private appName: string; + + constructor( + @IStorageService private storageService: IStorageService, + @IEnvironmentService environmentService: IEnvironmentService, + @ITelemetryService private telemetryService: ITelemetryService + ) { + this.appName = product.nameLong; + + if (product.welcomePage && !environmentService.isExtensionDevelopment /* do not open a browser when we run an extension */) { + this.welcomePageURL = product.welcomePage; + this.handleWelcome(); + } + } + + getId(): string { + return 'vs.gettingstarted'; + } + + private getUrl(telemetryInfo: ITelemetryInfo): string { + return `${this.welcomePageURL}&&from=${this.appName}&&id=${telemetryInfo.machineId}`; + } + + private openExternal(url: string) { + // Don't open the welcome page as the root user on Linux, this is due to a bug with xdg-open + // which recommends against running itself as root. + if (platform.isLinux && platform.isRootUser) { + return; + } + window.open(url); + } + + private handleWelcome(): void { + //make sure the user is online, otherwise refer to the next run to show the welcome page + if (!navigator.onLine) { + return; + } + + let firstStartup = !this.storageService.get(GettingStarted.hideWelcomeSettingskey); + + if (firstStartup && this.welcomePageURL) { + this.telemetryService.getTelemetryInfo().then(info => { + if (this.telemetryService.getExperiments().openGettingStarted !== false) { + let url = this.getUrl(info); + this.openExternal(url); + } + this.storageService.store(GettingStarted.hideWelcomeSettingskey, true); + }); + } + } } \ No newline at end of file diff --git a/src/vs/workbench/services/history/browser/history.ts b/src/vs/workbench/services/history/browser/history.ts index 5f05347788a..fd8611dca06 100644 --- a/src/vs/workbench/services/history/browser/history.ts +++ b/src/vs/workbench/services/history/browser/history.ts @@ -11,7 +11,6 @@ import platform = require('vs/base/common/platform'); import nls = require('vs/nls'); import labels = require('vs/base/common/labels'); import URI from 'vs/base/common/uri'; -import product from 'vs/platform/product'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { IEditor as IBaseEditor, IEditorInput, ITextEditorOptions, IResourceInput } from 'vs/platform/editor/common/editor'; import { EditorInput, IGroupEvent, IEditorRegistry, Extensions, asFileEditorInput, IEditorGroup } from 'vs/workbench/common/editor'; @@ -198,7 +197,7 @@ export abstract class BaseHistoryService { } private doGetWindowTitle(input?: IEditorInput): string { - const appName = product.nameLong; + const appName = this.environmentService.appNameLong; let prefix: string; const fileInput = asFileEditorInput(input); diff --git a/src/vs/workbench/services/message/electron-browser/messageService.ts b/src/vs/workbench/services/message/electron-browser/messageService.ts index 70dfd1b0e39..c77460eb071 100644 --- a/src/vs/workbench/services/message/electron-browser/messageService.ts +++ b/src/vs/workbench/services/message/electron-browser/messageService.ts @@ -7,7 +7,7 @@ import { IWindowIPCService } from 'vs/workbench/services/window/electron-browser/windowService'; import nls = require('vs/nls'); -import product from 'vs/platform/product'; +import product from 'vs/platform/node/product'; import { TPromise } from 'vs/base/common/winjs.base'; import { WorkbenchMessageService } from 'vs/workbench/services/message/browser/messageService'; import { IConfirmation, Severity, IChoiceService } from 'vs/platform/message/common/message'; diff --git a/src/vs/workbench/services/telemetry/common/workspaceStats.ts b/src/vs/workbench/services/telemetry/common/workspaceStats.ts index 05c6ee63993..79ad84e73e9 100644 --- a/src/vs/workbench/services/telemetry/common/workspaceStats.ts +++ b/src/vs/workbench/services/telemetry/common/workspaceStats.ts @@ -10,12 +10,11 @@ import errors = require('vs/base/common/errors'); import URI from 'vs/base/common/uri'; import { ArraySet } from 'vs/base/common/set'; import { IFileService } from 'vs/platform/files/common/files'; -import product from 'vs/platform/product'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IOptions } from 'vs/workbench/common/options'; - const SshProtocolMatcher = /^([^@:]+@)?([^:]+):/; const SecondLevelDomainMatcher = /([^@:.]+\.[^@:.]+)(:\d+)?$/; const RemoteMatcher = /^\s*url\s*=\s*(.+\S)\s*$/mg; @@ -37,11 +36,53 @@ const SecondLevelDomainWhitelist = [ type Tags = { [index: string]: boolean | number }; +function stripLowLevelDomains(domain: string): string { + let match = domain.match(SecondLevelDomainMatcher); + return match ? match[1] : null; +} + +function extractDomain(url: string): string { + if (url.indexOf('://') === -1) { + let match = url.match(SshProtocolMatcher); + if (match) { + return stripLowLevelDomains(match[2]); + } + } + try { + let uri = URI.parse(url); + if (uri.authority) { + return stripLowLevelDomains(uri.authority); + } + } catch (e) { + // ignore invalid URIs + } + return null; +} + +export function getDomainsOfRemotes(text: string, whitelist: string[]): string[] { + let domains = new ArraySet(), match; + while (match = RemoteMatcher.exec(text)) { + let domain = extractDomain(match[1]); + if (domain) { + domains.set(domain); + } + } + + const whitemap = whitelist.reduce((map, key) => { + map[key] = true; + return map; + }, Object.create(null)); + + return domains.elements + .map(key => whitemap[key] ? key : key.replace(AnyButDot, 'a')); +} + export class WorkspaceStats { constructor( @IFileService private fileService: IFileService, @IWorkspaceContextService private contextService: IWorkspaceContextService, - @ITelemetryService private telemetryService: ITelemetryService + @ITelemetryService private telemetryService: ITelemetryService, + @IEnvironmentService private environmentService: IEnvironmentService ) { } @@ -60,7 +101,7 @@ export class WorkspaceStats { const workspace = this.contextService.getWorkspace(); tags['workspace.empty'] = !workspace; - const folder = workspace ? workspace.resource : product.quality !== 'stable' && this.findFolder(workbenchOptions); + const folder = workspace ? workspace.resource : this.environmentService.appQuality !== 'stable' && this.findFolder(workbenchOptions); if (folder && this.fileService) { return this.fileService.resolveFile(folder).then(stats => { let names = (stats.children || []).map(c => c.name); @@ -155,55 +196,11 @@ export class WorkspaceStats { }, error => errors.onUnexpectedError(error)); } - private stripLowLevelDomains(domain: string): string { - let match = domain.match(SecondLevelDomainMatcher); - return match ? match[1] : null; - } - - private extractDomain(url: string): string { - if (url.indexOf('://') === -1) { - let match = url.match(SshProtocolMatcher); - if (match) { - return this.stripLowLevelDomains(match[2]); - } - } - try { - let uri = URI.parse(url); - if (uri.authority) { - return this.stripLowLevelDomains(uri.authority); - } - } catch (e) { - // ignore invalid URIs - } - return null; - } - - /** - * Public for testing. - */ - public getDomainsOfRemotes(text: string, whitelist: string[]): string[] { - let domains = new ArraySet(), match; - while (match = RemoteMatcher.exec(text)) { - let domain = this.extractDomain(match[1]); - if (domain) { - domains.set(domain); - } - } - - const whitemap = whitelist.reduce((map, key) => { - map[key] = true; - return map; - }, Object.create(null)); - - return domains.elements - .map(key => whitemap[key] ? key : key.replace(AnyButDot, 'a')); - } - private reportRemotes(workspaceUri: URI): void { let uri = workspaceUri.with({ path: `${workspaceUri.path}/.git/config` }); this.fileService.resolveContent(uri, { acceptTextOnly: true }).then( content => { - let domains = this.getDomainsOfRemotes(content.value, SecondLevelDomainWhitelist); + let domains = getDomainsOfRemotes(content.value, SecondLevelDomainWhitelist); this.telemetryService.publicLog('workspace.remotes', { domains }); }, err => { diff --git a/src/vs/workbench/services/telemetry/test/workspaceStats.test.ts b/src/vs/workbench/services/telemetry/test/workspaceStats.test.ts index 22568bfa692..ac093fcbe5b 100644 --- a/src/vs/workbench/services/telemetry/test/workspaceStats.test.ts +++ b/src/vs/workbench/services/telemetry/test/workspaceStats.test.ts @@ -6,7 +6,7 @@ 'use strict'; import * as assert from 'assert'; -import { WorkspaceStats } from 'vs/workbench/services/telemetry/common/workspaceStats'; +import { getDomainsOfRemotes } from 'vs/workbench/services/telemetry/common/workspaceStats'; suite('Telemetry - WorkspaceStats', () => { @@ -22,43 +22,37 @@ suite('Telemetry - WorkspaceStats', () => { ]; test('HTTPS remotes', function () { - const stats = new WorkspaceStats(null, null, null); - assert.deepStrictEqual(stats.getDomainsOfRemotes(remote('https://github.com/Microsoft/vscode.git'), whitelist), ['github.com']); - assert.deepStrictEqual(stats.getDomainsOfRemotes(remote('https://git.example.com/gitproject.git'), whitelist), ['example.com']); - assert.deepStrictEqual(stats.getDomainsOfRemotes(remote('https://username@github2.com/username/repository.git'), whitelist), ['github2.com']); - assert.deepStrictEqual(stats.getDomainsOfRemotes(remote('https://username:password@github3.com/username/repository.git'), whitelist), ['github3.com']); - assert.deepStrictEqual(stats.getDomainsOfRemotes(remote('https://username:password@example2.com:1234/username/repository.git'), whitelist), ['example2.com']); - assert.deepStrictEqual(stats.getDomainsOfRemotes(remote('https://example3.com:1234/username/repository.git'), whitelist), ['example3.com']); + assert.deepStrictEqual(getDomainsOfRemotes(remote('https://github.com/Microsoft/vscode.git'), whitelist), ['github.com']); + assert.deepStrictEqual(getDomainsOfRemotes(remote('https://git.example.com/gitproject.git'), whitelist), ['example.com']); + assert.deepStrictEqual(getDomainsOfRemotes(remote('https://username@github2.com/username/repository.git'), whitelist), ['github2.com']); + assert.deepStrictEqual(getDomainsOfRemotes(remote('https://username:password@github3.com/username/repository.git'), whitelist), ['github3.com']); + assert.deepStrictEqual(getDomainsOfRemotes(remote('https://username:password@example2.com:1234/username/repository.git'), whitelist), ['example2.com']); + assert.deepStrictEqual(getDomainsOfRemotes(remote('https://example3.com:1234/username/repository.git'), whitelist), ['example3.com']); }); test('SSH remotes', function () { - const stats = new WorkspaceStats(null, null, null); - assert.deepStrictEqual(stats.getDomainsOfRemotes(remote('ssh://user@git.server.org/project.git'), whitelist), ['server.org']); + assert.deepStrictEqual(getDomainsOfRemotes(remote('ssh://user@git.server.org/project.git'), whitelist), ['server.org']); }); test('SCP-like remotes', function () { - const stats = new WorkspaceStats(null, null, null); - assert.deepStrictEqual(stats.getDomainsOfRemotes(remote('git@github.com:Microsoft/vscode.git'), whitelist), ['github.com']); - assert.deepStrictEqual(stats.getDomainsOfRemotes(remote('user@git.server.org:project.git'), whitelist), ['server.org']); - assert.deepStrictEqual(stats.getDomainsOfRemotes(remote('git.server2.org:project.git'), whitelist), ['server2.org']); + assert.deepStrictEqual(getDomainsOfRemotes(remote('git@github.com:Microsoft/vscode.git'), whitelist), ['github.com']); + assert.deepStrictEqual(getDomainsOfRemotes(remote('user@git.server.org:project.git'), whitelist), ['server.org']); + assert.deepStrictEqual(getDomainsOfRemotes(remote('git.server2.org:project.git'), whitelist), ['server2.org']); }); test('Local remotes', function () { - const stats = new WorkspaceStats(null, null, null); - assert.deepStrictEqual(stats.getDomainsOfRemotes(remote('/opt/git/project.git'), whitelist), []); - assert.deepStrictEqual(stats.getDomainsOfRemotes(remote('file:///opt/git/project.git'), whitelist), []); + assert.deepStrictEqual(getDomainsOfRemotes(remote('/opt/git/project.git'), whitelist), []); + assert.deepStrictEqual(getDomainsOfRemotes(remote('file:///opt/git/project.git'), whitelist), []); }); test('Multiple remotes', function () { - const stats = new WorkspaceStats(null, null, null); const config = ['https://github.com/Microsoft/vscode.git', 'https://git.example.com/gitproject.git'].map(remote).join(''); - assert.deepStrictEqual(stats.getDomainsOfRemotes(config, whitelist).sort(), ['example.com', 'github.com']); + assert.deepStrictEqual(getDomainsOfRemotes(config, whitelist).sort(), ['example.com', 'github.com']); }); test('Whitelisting', function () { - const stats = new WorkspaceStats(null, null, null); const config = ['https://github.com/Microsoft/vscode.git', 'https://git.foobar.com/gitproject.git'].map(remote).join(''); - assert.deepStrictEqual(stats.getDomainsOfRemotes(config, whitelist).sort(), ['aaaaaa.aaa', 'github.com']); + assert.deepStrictEqual(getDomainsOfRemotes(config, whitelist).sort(), ['aaaaaa.aaa', 'github.com']); }); function remote(url: string): string { diff --git a/src/vs/workbench/services/textfile/electron-browser/textFileService.ts b/src/vs/workbench/services/textfile/electron-browser/textFileService.ts index e284e2e0063..edfc479811e 100644 --- a/src/vs/workbench/services/textfile/electron-browser/textFileService.ts +++ b/src/vs/workbench/services/textfile/electron-browser/textFileService.ts @@ -25,7 +25,7 @@ import { IWindowIPCService } from 'vs/workbench/services/window/electron-browser import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; import { IModelService } from 'vs/editor/common/services/modelService'; import { ModelBuilder } from 'vs/editor/node/model/modelBuilder'; -import product from 'vs/platform/product'; +import product from 'vs/platform/node/product'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IBackupModelService } from 'vs/workbench/services/backup/common/backup';