From 0286f10bbf1a2e337a6984a4b3f78b2b29417494 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 20 Jan 2017 14:58:53 +0100 Subject: [PATCH] scm: add enable/disable scm commands allow users to toggle between git and preview SCM --- src/vs/code/electron-main/main.ts | 10 +- .../api/node/mainThreadExtensionService.ts | 9 +- .../parts/activitybar/activitybarPart.ts | 8 +- src/vs/workbench/electron-browser/shell.ts | 6 +- .../electron-browser/workbench.main.ts | 8 +- .../git/browser/gitActions.contribution.ts | 43 +++--- .../git/browser/gitEditorContributions.ts | 35 ++++- src/vs/workbench/parts/git/browser/gitScm.ts | 125 ++++++++++++++++++ .../git/browser/gitWorkbenchContributions.ts | 6 + .../git/electron-browser/git.contribution.ts | 15 ++- .../parts/scm/browser/scm.contribution.ts | 74 ++++++----- .../workbench/parts/scm/browser/scmPreview.ts | 78 +++++++++++ 12 files changed, 345 insertions(+), 72 deletions(-) create mode 100644 src/vs/workbench/parts/git/browser/gitScm.ts create mode 100644 src/vs/workbench/parts/scm/browser/scmPreview.ts diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index 0e05e86a722..de09965d895 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -24,8 +24,8 @@ import { UpdateService } from 'vs/platform/update/electron-main/updateService'; import { Server as ElectronIPCServer } from 'vs/base/parts/ipc/electron-main/ipc.electron-main'; import { Server, serve, connect } from 'vs/base/parts/ipc/node/ipc.net'; import { TPromise } from 'vs/base/common/winjs.base'; -// import { AskpassChannel } from 'vs/workbench/parts/git/common/gitIpc'; -// import { GitAskpassService } from 'vs/workbench/parts/git/electron-main/askpassService'; +import { AskpassChannel } from 'vs/workbench/parts/git/common/gitIpc'; +import { GitAskpassService } from 'vs/workbench/parts/git/electron-main/askpassService'; import { spawnSharedProcess } from 'vs/code/node/sharedProcess'; import { Mutex } from 'windows-mutex'; import { IDisposable } from 'vs/base/common/lifecycle'; @@ -134,9 +134,9 @@ function main(accessor: ServicesAccessor, mainIpcServer: Server, userEnv: platfo } // Register Main IPC services - // const askpassService = new GitAskpassService(); - // const askpassChannel = new AskpassChannel(askpassService); - // mainIpcServer.registerChannel('askpass', askpassChannel); + const askpassService = new GitAskpassService(); + const askpassChannel = new AskpassChannel(askpassService); + mainIpcServer.registerChannel('askpass', askpassChannel); // Create Electron IPC Server const electronIpcServer = new ElectronIPCServer(); diff --git a/src/vs/workbench/api/node/mainThreadExtensionService.ts b/src/vs/workbench/api/node/mainThreadExtensionService.ts index 195282ff12b..722bf0a86f6 100644 --- a/src/vs/workbench/api/node/mainThreadExtensionService.ts +++ b/src/vs/workbench/api/node/mainThreadExtensionService.ts @@ -59,6 +59,8 @@ export class MainProcessExtensionService extends AbstractExtensionService { this._onExtensionDescriptions(disabledExtensions.length ? extensionDescriptions.filter(e => disabledExtensions.indexOf(`${e.publisher}.${e.name}`) === -1) : extensionDescriptions); }); diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index 8d35c1bfa8b..bc0d6c91f0f 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -29,6 +29,7 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { ToggleActivityBarVisibilityAction } from 'vs/workbench/browser/actions/toggleActivityBarVisibility'; +import SCMPreview from 'vs/workbench/parts/scm/browser/scmPreview'; interface IViewletActivity { badge: IBadge; @@ -77,8 +78,13 @@ export class ActivitybarPart extends Part implements IActivityBarService { if (pinnedViewlets) { // TODO@Ben: Migrate git => scm viewlet + + const map = SCMPreview.enabled + ? (id => id === 'workbench.view.git' ? 'workbench.view.scm' : id) + : (id => id === 'workbench.view.scm' ? 'workbench.view.git' : id); + this.pinnedViewlets = pinnedViewlets - .map(id => id === 'workbench.view.git' ? 'workbench.view.scm' : id) + .map(map) .filter(arrays.uniqueFilter(str => str)); } else { diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index 2340dc31350..41af6b99d75 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -96,6 +96,7 @@ import { ITextMateService } from 'vs/editor/node/textMate/textMateService'; import { MainProcessTextMateSyntax } from 'vs/editor/electron-browser/textMate/TMSyntax'; import { BareFontInfo } from 'vs/editor/common/config/fontInfo'; import { readFontInfo } from 'vs/editor/browser/config/configuration'; +import SCMPreview from 'vs/workbench/parts/scm/browser/scmPreview'; import 'vs/platform/opener/browser/opener.contribution'; /** @@ -331,7 +332,10 @@ export class WorkbenchShell { serviceCollection.set(IThreadService, this.threadService); this.timerService.beforeExtensionLoad = new Date(); - this.extensionService = instantiationService.createInstance(MainProcessExtensionService); + + // TODO@Joao: remove + const disabledExtensions = SCMPreview.enabled ? [] : ['vscode.git']; + this.extensionService = instantiationService.createInstance(MainProcessExtensionService, disabledExtensions); serviceCollection.set(IExtensionService, this.extensionService); extensionHostProcessWorker.start(this.extensionService); this.extensionService.onReady().done(() => { diff --git a/src/vs/workbench/electron-browser/workbench.main.ts b/src/vs/workbench/electron-browser/workbench.main.ts index 0cc830ceb80..a535aa73334 100644 --- a/src/vs/workbench/electron-browser/workbench.main.ts +++ b/src/vs/workbench/electron-browser/workbench.main.ts @@ -46,10 +46,10 @@ import 'vs/workbench/parts/search/browser/openAnythingHandler'; // can be packag import 'vs/workbench/parts/scm/browser/scm.contribution'; import 'vs/workbench/parts/scm/browser/scmViewlet'; // can be packaged separately -// import 'vs/workbench/parts/git/electron-browser/git.contribution'; -// import 'vs/workbench/parts/git/browser/gitQuickOpen'; -// import 'vs/workbench/parts/git/browser/gitActions.contribution'; -// import 'vs/workbench/parts/git/browser/gitViewlet'; // can be packaged separately +import 'vs/workbench/parts/git/electron-browser/git.contribution'; +import 'vs/workbench/parts/git/browser/gitQuickOpen'; +import 'vs/workbench/parts/git/browser/gitActions.contribution'; +import 'vs/workbench/parts/git/browser/gitViewlet'; // can be packaged separately import 'vs/workbench/parts/debug/electron-browser/debug.contribution'; import 'vs/workbench/parts/debug/electron-browser/repl'; diff --git a/src/vs/workbench/parts/git/browser/gitActions.contribution.ts b/src/vs/workbench/parts/git/browser/gitActions.contribution.ts index 62ba2855f7f..6dddf17e7a5 100644 --- a/src/vs/workbench/parts/git/browser/gitActions.contribution.ts +++ b/src/vs/workbench/parts/git/browser/gitActions.contribution.ts @@ -37,6 +37,7 @@ import { import paths = require('vs/base/common/paths'); import URI from 'vs/base/common/uri'; import { FileEditorInput } from 'vs/workbench/parts/files/common/editors/fileEditorInput'; +import SCMPreview from 'vs/workbench/parts/scm/browser/scmPreview'; function getStatus(gitService: IGitService, contextService: IWorkspaceContextService, input: WorkbenchEditorCommon.IFileEditorInput): IFileStatus { const model = gitService.getModel(); @@ -636,25 +637,27 @@ class GlobalOpenInEditorAction extends OpenFileAction { } } -var actionBarRegistry = platform.Registry.as(abr.Extensions.Actionbar); -actionBarRegistry.registerActionBarContributor(abr.Scope.EDITOR, FileEditorActionContributor); -actionBarRegistry.registerActionBarContributor(abr.Scope.EDITOR, GitEditorActionContributor); -actionBarRegistry.registerActionBarContributor(abr.Scope.EDITOR, GitWorkingTreeDiffEditorActionContributor); +if (!SCMPreview.enabled) { + var actionBarRegistry = platform.Registry.as(abr.Extensions.Actionbar); + actionBarRegistry.registerActionBarContributor(abr.Scope.EDITOR, FileEditorActionContributor); + actionBarRegistry.registerActionBarContributor(abr.Scope.EDITOR, GitEditorActionContributor); + actionBarRegistry.registerActionBarContributor(abr.Scope.EDITOR, GitWorkingTreeDiffEditorActionContributor); -let workbenchActionRegistry = (platform.Registry.as(wbar.Extensions.WorkbenchActions)); + let workbenchActionRegistry = (platform.Registry.as(wbar.Extensions.WorkbenchActions)); -// Register Actions -const category = nls.localize('git', "Git"); -workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(GlobalOpenChangeAction, GlobalOpenChangeAction.ID, GlobalOpenChangeAction.LABEL), 'Git: Open Change', category); -workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(GlobalOpenInEditorAction, GlobalOpenInEditorAction.ID, GlobalOpenInEditorAction.LABEL), 'Git: Open File', category); -workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(PullAction, PullAction.ID, PullAction.LABEL), 'Git: Pull', category); -workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(PushAction, PushAction.ID, PushAction.LABEL), 'Git: Push', category); -workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(PushToRemoteAction, PushToRemoteAction.ID, PushToRemoteAction.LABEL), 'Git: Push to...', category); -workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(SyncAction, SyncAction.ID, SyncAction.LABEL), 'Git: Sync', category); -workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(PublishAction, PublishAction.ID, PublishAction.LABEL), 'Git: Publish', category); -workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(StartGitBranchAction, StartGitBranchAction.ID, StartGitBranchAction.LABEL), 'Git: Branch', category); -workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(StartGitCheckoutAction, StartGitCheckoutAction.ID, StartGitCheckoutAction.LABEL), 'Git: Checkout', category); -workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(InputCommitAction, InputCommitAction.ID, InputCommitAction.LABEL), 'Git: Commit', category); -workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(UndoLastCommitAction, UndoLastCommitAction.ID, UndoLastCommitAction.LABEL), 'Git: Undo Last Commit', category); -workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(WorkbenchStageAction, WorkbenchStageAction.ID, WorkbenchStageAction.LABEL), 'Git: Stage', category); -workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(WorkbenchUnstageAction, WorkbenchUnstageAction.ID, WorkbenchUnstageAction.LABEL), 'Git: Unstage', category); + // Register Actions + const category = nls.localize('git', "Git"); + workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(GlobalOpenChangeAction, GlobalOpenChangeAction.ID, GlobalOpenChangeAction.LABEL), 'Git: Open Change', category); + workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(GlobalOpenInEditorAction, GlobalOpenInEditorAction.ID, GlobalOpenInEditorAction.LABEL), 'Git: Open File', category); + workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(PullAction, PullAction.ID, PullAction.LABEL), 'Git: Pull', category); + workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(PushAction, PushAction.ID, PushAction.LABEL), 'Git: Push', category); + workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(PushToRemoteAction, PushToRemoteAction.ID, PushToRemoteAction.LABEL), 'Git: Push to...', category); + workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(SyncAction, SyncAction.ID, SyncAction.LABEL), 'Git: Sync', category); + workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(PublishAction, PublishAction.ID, PublishAction.LABEL), 'Git: Publish', category); + workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(StartGitBranchAction, StartGitBranchAction.ID, StartGitBranchAction.LABEL), 'Git: Branch', category); + workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(StartGitCheckoutAction, StartGitCheckoutAction.ID, StartGitCheckoutAction.LABEL), 'Git: Checkout', category); + workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(InputCommitAction, InputCommitAction.ID, InputCommitAction.LABEL), 'Git: Commit', category); + workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(UndoLastCommitAction, UndoLastCommitAction.ID, UndoLastCommitAction.LABEL), 'Git: Undo Last Commit', category); + workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(WorkbenchStageAction, WorkbenchStageAction.ID, WorkbenchStageAction.LABEL), 'Git: Stage', category); + workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(WorkbenchUnstageAction, WorkbenchUnstageAction.ID, WorkbenchUnstageAction.LABEL), 'Git: Unstage', category); +} diff --git a/src/vs/workbench/parts/git/browser/gitEditorContributions.ts b/src/vs/workbench/parts/git/browser/gitEditorContributions.ts index 21dcfbb404c..53478c47f05 100644 --- a/src/vs/workbench/parts/git/browser/gitEditorContributions.ts +++ b/src/vs/workbench/parts/git/browser/gitEditorContributions.ts @@ -11,6 +11,8 @@ import { IGitService, ModelEvents, StatusType } from 'vs/workbench/parts/git/com import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { Disposable } from 'vs/base/common/lifecycle'; import { Delayer } from 'vs/base/common/async'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import SCMPreview from 'vs/workbench/parts/scm/browser/scmPreview'; const pattern = /^<<<<<<<|^=======|^>>>>>>>/; @@ -76,7 +78,6 @@ class MergeDecoratorBoundToModel extends Disposable { } } -@editorContribution export class MergeDecorator extends Disposable implements IEditorContribution { static ID = 'vs.git.editor.merge.decorator'; @@ -146,3 +147,35 @@ export class MergeDecorator extends Disposable implements IEditorContribution { super.dispose(); } } + +// TODO@Joao: remove +@editorContribution +export class MergeDecoratorWrapper extends Disposable implements IEditorContribution { + + static ID = 'vs.git.editor.merge.decoratorwrapper'; + private decorator: MergeDecorator; + + constructor( + private editor: ICodeEditor, + @IInstantiationService instantiationService: IInstantiationService + ) { + super(); + + if (SCMPreview.enabled) { + return; + } + + this.decorator = instantiationService.createInstance(MergeDecorator, editor); + } + + getId(): string { + return MergeDecoratorWrapper.ID; + } + + dispose(): void { + if (this.decorator) { + this.decorator.dispose(); + this.decorator = null; + } + } +} \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/gitScm.ts b/src/vs/workbench/parts/git/browser/gitScm.ts new file mode 100644 index 00000000000..75eda8aae74 --- /dev/null +++ b/src/vs/workbench/parts/git/browser/gitScm.ts @@ -0,0 +1,125 @@ +/*--------------------------------------------------------------------------------------------- + * 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 { TPromise } from 'vs/base/common/winjs.base'; +import Event, { Emitter } from 'vs/base/common/event'; +import { dispose } from 'vs/base/common/lifecycle'; +import URI from 'vs/base/common/uri'; +import { IModel } from 'vs/editor/common/editorCommon'; +import { ISCMService, ISCMProvider, ISCMResource, ISCMResourceGroup } from 'vs/workbench/services/scm/common/scm'; +import { ITextModelResolverService, ITextModelContentProvider } from 'vs/editor/common/services/resolverService'; +import { IModelService } from 'vs/editor/common/services/modelService'; +import { Throttler } from 'vs/base/common/async'; +import * as paths from 'vs/base/common/paths'; +import { IGitService, StatusType, ServiceEvents, ServiceOperations, ServiceState } from 'vs/workbench/parts/git/common/git'; +import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; + +// TODO@Joao: remove +export class GitSCMProvider implements IWorkbenchContribution, ISCMProvider, ITextModelContentProvider { + + get id() { return 'git-internal'; } + get label() { return 'Git'; } + get resources() { return []; } + + private _onDidChange = new Emitter(); + get onDidChange(): Event { + return this._onDidChange.event; + } + + constructor( + @ITextModelResolverService textModelResolverService: ITextModelResolverService, + @IModelService private modelService: IModelService, + @IGitService private gitService: IGitService, + @ISCMService scmService: ISCMService + ) { + scmService.registerSCMProvider(this); + textModelResolverService.registerTextModelContentProvider('git', this); + } + + getId(): string { + return 'git.contentprovider'; + } + + commit(message: string): TPromise { + return TPromise.wrapError('not implemented'); + } + + open(uri: ISCMResource): TPromise { + return TPromise.wrapError('not implemented'); + } + + drag(from: ISCMResource, to: ISCMResourceGroup): TPromise { + return TPromise.wrapError('not implemented'); + } + + getOriginalResource(uri: URI): TPromise { + if (uri.scheme !== 'file') { + return; + } + + return TPromise.as(uri.with({ scheme: 'git' })); + } + + provideTextContent(uri: URI): TPromise { + const model = this.modelService.createModel('', null, uri); + const throttler = new Throttler(); + + const setModelContents = contents => { + if (model.isDisposed()) { + return; + } + + model.setValue(contents || ''); + }; + + const updateModel = () => { + const gitModel = this.gitService.getModel(); + const root = gitModel.getRepositoryRoot(); + + if (!root) { + return TPromise.as(null); + } + + const path = uri.fsPath; + const relativePath = paths.relative(root, path).replace(/\\/g, '/'); + + if (/^\.\./.test(relativePath)) { + return TPromise.as(null); + } + + const treeish = gitModel.getStatus().find(relativePath, StatusType.INDEX) ? '~' : 'HEAD'; + + return this.gitService.buffer(path, treeish).then(setModelContents); + }; + + const triggerModelUpdate = () => { + if (this.gitService.getState() !== ServiceState.OK) { + return; + } + + throttler.queue(updateModel); + }; + + const disposables = [ + this.gitService.addListener2(ServiceEvents.STATE_CHANGED, triggerModelUpdate), + this.gitService.addListener2(ServiceEvents.OPERATION_END, e => { + if (e.operation.id !== ServiceOperations.BACKGROUND_FETCH) { + triggerModelUpdate(); + } + }) + ]; + + model.onWillDispose(() => dispose(disposables)); + triggerModelUpdate(); + + return TPromise.as(model); + } + + dispose(): void { + + } +} \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/gitWorkbenchContributions.ts b/src/vs/workbench/parts/git/browser/gitWorkbenchContributions.ts index 73432ad2648..4d8370c5d42 100644 --- a/src/vs/workbench/parts/git/browser/gitWorkbenchContributions.ts +++ b/src/vs/workbench/parts/git/browser/gitWorkbenchContributions.ts @@ -28,6 +28,7 @@ import { IMessageService } from 'vs/platform/message/common/message'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; +import { GitSCMProvider } from './gitScm'; import IGitService = git.IGitService; @@ -164,6 +165,11 @@ export function registerContributions(): void { StatusUpdater ); + // Register GitSCMProvider + (platform.Registry.as(ext.Extensions.Workbench)).registerWorkbenchContribution( + GitSCMProvider + ); + // Register Quick Open for git (platform.Registry.as(quickopen.Extensions.Quickopen)).registerQuickOpenHandler( new quickopen.QuickOpenHandlerDescriptor( diff --git a/src/vs/workbench/parts/git/electron-browser/git.contribution.ts b/src/vs/workbench/parts/git/electron-browser/git.contribution.ts index c4490b40a98..f85747bf668 100644 --- a/src/vs/workbench/parts/git/electron-browser/git.contribution.ts +++ b/src/vs/workbench/parts/git/electron-browser/git.contribution.ts @@ -12,13 +12,16 @@ import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { Registry } from 'vs/platform/platform'; import { CloneAction } from './gitActions'; import { IWorkbenchActionRegistry, Extensions as WorkbenchActionExtensions } from 'vs/workbench/common/actionRegistry'; +import SCMPreview from 'vs/workbench/parts/scm/browser/scmPreview'; -registerContributions(); +if (!SCMPreview.enabled) { + registerContributions(); -// Register Service -registerSingleton(IGitService, ElectronGitService); + // Register Service + registerSingleton(IGitService, ElectronGitService); -const category = localize('git', "Git"); + const category = localize('git', "Git"); -Registry.as(WorkbenchActionExtensions.WorkbenchActions) - .registerWorkbenchAction(new SyncActionDescriptor(CloneAction, CloneAction.ID, CloneAction.LABEL), 'Git: Clone', category); + Registry.as(WorkbenchActionExtensions.WorkbenchActions) + .registerWorkbenchAction(new SyncActionDescriptor(CloneAction, CloneAction.ID, CloneAction.LABEL), 'Git: Clone', category); +} diff --git a/src/vs/workbench/parts/scm/browser/scm.contribution.ts b/src/vs/workbench/parts/scm/browser/scm.contribution.ts index 0bd5585ef74..959d1d1dfbe 100644 --- a/src/vs/workbench/parts/scm/browser/scm.contribution.ts +++ b/src/vs/workbench/parts/scm/browser/scm.contribution.ts @@ -21,24 +21,7 @@ import { ISCMService } from 'vs/workbench/services/scm/common/scm'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { StatusUpdater } from './scmActivity'; - -Registry.as(WorkbenchExtensions.Workbench) - .registerWorkbenchContribution(DirtyDiffDecorator); - -const viewletDescriptor = new ViewletDescriptor( - 'vs/workbench/parts/scm/browser/scmViewlet', - 'SCMViewlet', - VIEWLET_ID, - localize('scm', "SCM"), - 'scm', - 36 -); - -Registry.as(ViewletExtensions.Viewlets) - .registerViewlet(viewletDescriptor); - -Registry.as(WorkbenchExtensions.Workbench) - .registerWorkbenchContribution(StatusUpdater); +import SCMPreview, { DisableSCMPreviewAction, EnableSCMPreviewAction } from 'vs/workbench/parts/scm/browser/scmPreview'; class OpenSCMViewletAction extends ToggleViewletAction { @@ -50,19 +33,6 @@ class OpenSCMViewletAction extends ToggleViewletAction { } } -// Register Action to Open Viewlet -Registry.as(WorkbenchActionExtensions.WorkbenchActions).registerWorkbenchAction( - new SyncActionDescriptor(OpenSCMViewletAction, VIEWLET_ID, localize('toggleSCMViewlet', "Show SCM"), { - primary: null, - win: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_G }, - linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_G }, - mac: { primary: KeyMod.WinCtrl | KeyMod.Shift | KeyCode.KEY_G } - }), - 'View: Show SCM', - localize('view', "View") -); - - // TODO@Joao export class SwitchProvider extends Action { @@ -89,5 +59,43 @@ export class SwitchProvider extends Action { } } -Registry.as(WorkbenchActionExtensions.WorkbenchActions) - .registerWorkbenchAction(new SyncActionDescriptor(SwitchProvider, SwitchProvider.ID, SwitchProvider.LABEL), 'SCM: Switch Provider', 'SCM'); \ No newline at end of file +Registry.as(WorkbenchExtensions.Workbench) + .registerWorkbenchContribution(DirtyDiffDecorator); + +if (SCMPreview.enabled) { + const viewletDescriptor = new ViewletDescriptor( + 'vs/workbench/parts/scm/browser/scmViewlet', + 'SCMViewlet', + VIEWLET_ID, + localize('scm', "SCM"), + 'scm', + 36 + ); + + Registry.as(ViewletExtensions.Viewlets) + .registerViewlet(viewletDescriptor); + + Registry.as(WorkbenchExtensions.Workbench) + .registerWorkbenchContribution(StatusUpdater); + + // Register Action to Open Viewlet + Registry.as(WorkbenchActionExtensions.WorkbenchActions).registerWorkbenchAction( + new SyncActionDescriptor(OpenSCMViewletAction, VIEWLET_ID, localize('toggleSCMViewlet', "Show SCM"), { + primary: null, + win: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_G }, + linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_G }, + mac: { primary: KeyMod.WinCtrl | KeyMod.Shift | KeyCode.KEY_G } + }), + 'View: Show SCM', + localize('view', "View") + ); + + Registry.as(WorkbenchActionExtensions.WorkbenchActions) + .registerWorkbenchAction(new SyncActionDescriptor(SwitchProvider, SwitchProvider.ID, SwitchProvider.LABEL), 'SCM: Switch Provider', 'SCM'); + + Registry.as(WorkbenchActionExtensions.WorkbenchActions) + .registerWorkbenchAction(new SyncActionDescriptor(DisableSCMPreviewAction, DisableSCMPreviewAction.ID, DisableSCMPreviewAction.LABEL), 'SCM: Disable Preview SCM', 'SCM'); +} else { + Registry.as(WorkbenchActionExtensions.WorkbenchActions) + .registerWorkbenchAction(new SyncActionDescriptor(EnableSCMPreviewAction, EnableSCMPreviewAction.ID, EnableSCMPreviewAction.LABEL), 'SCM: Enable Preview SCM', 'SCM'); +} diff --git a/src/vs/workbench/parts/scm/browser/scmPreview.ts b/src/vs/workbench/parts/scm/browser/scmPreview.ts new file mode 100644 index 00000000000..b7a11093b37 --- /dev/null +++ b/src/vs/workbench/parts/scm/browser/scmPreview.ts @@ -0,0 +1,78 @@ +/*--------------------------------------------------------------------------------------------- + * 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 { Action } from 'vs/base/common/actions'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { IWindowService } from 'vs/platform/windows/common/windows'; +import { IMessageService } from 'vs/platform/message/common/message'; + +export default class SCMPreview { + + private static readonly _enabled = window.localStorage.getItem('enablePreviewSCM') === 'true'; + + static get enabled(): boolean { + return this._enabled; + } + + static set enabled(enabled: boolean) { + window.localStorage.setItem('enablePreviewSCM', enabled ? 'true' : 'false'); + } +} + +export class EnableSCMPreviewAction extends Action { + + static ID = 'enablescmpreview'; + static LABEL = 'Enable Preview SCM'; + + constructor( + id = EnableSCMPreviewAction.ID, + label = EnableSCMPreviewAction.LABEL, + @IWindowService private windowService: IWindowService, + @IMessageService private messageService: IMessageService, + ) { + super(EnableSCMPreviewAction.ID, EnableSCMPreviewAction.LABEL, '', true); + } + + run(): TPromise { + const message = 'This will reload this window, do you want to continue?'; + const result = this.messageService.confirm({ message }); + + if (!result) { + return; + } + + SCMPreview.enabled = true; + return this.windowService.reloadWindow(); + } +} + +export class DisableSCMPreviewAction extends Action { + + static ID = 'disablescmpreview'; + static LABEL = 'Disable Preview SCM'; + + constructor( + id = DisableSCMPreviewAction.ID, + label = DisableSCMPreviewAction.LABEL, + @IWindowService private windowService: IWindowService, + @IMessageService private messageService: IMessageService, + ) { + super(DisableSCMPreviewAction.ID, DisableSCMPreviewAction.LABEL, '', true); + } + + run(): TPromise { + const message = 'This will reload this window, do you want to continue?'; + const result = this.messageService.confirm({ message }); + + if (!result) { + return; + } + + SCMPreview.enabled = false; + return this.windowService.reloadWindow(); + } +} \ No newline at end of file