diff --git a/src/vs/workbench/parts/git/browser/gitActions.contribution.ts b/src/vs/workbench/parts/git/browser/gitActions.contribution.ts index 707da929df52527205c3a3a70b2590fb104acbbf..71fefe50a2f2fd1f186ac9b4c01d994b1fcc67ba 100644 --- a/src/vs/workbench/parts/git/browser/gitActions.contribution.ts +++ b/src/vs/workbench/parts/git/browser/gitActions.contribution.ts @@ -360,13 +360,13 @@ export class WorkbenchUnstageAction extends BaseUnstageAction { } } -export class StageRangesAction extends baseeditor.EditorInputAction { +export abstract class BaseStageRangesAction extends baseeditor.EditorInputAction { private gitService: IGitService; private editorService: IWorkbenchEditorService; private editor:editorbrowser.IDiffEditor; - constructor(editor:tdeditor.TextDiffEditor, @IGitService gitService: IGitService, @IWorkbenchEditorService editorService : IWorkbenchEditorService) { - super('workbench.action.git.stageRanges', nls.localize('stageSelectedLines', "Stage Selected Lines")); + constructor(id: string, label: string, editor:tdeditor.TextDiffEditor, @IGitService gitService: IGitService, @IWorkbenchEditorService editorService : IWorkbenchEditorService) { + super(id, label); this.editorService = editorService; this.gitService = gitService; @@ -395,8 +395,12 @@ export class StageRangesAction extends baseeditor.EditorInputAction { return stageranges.getSelectedChanges(changes, selections).length > 0; } + protected getRangesAppliedResult(editor: editorbrowser.IDiffEditor) { + return stageranges.stageRanges(editor); + } + public run():TPromise { - var result = stageranges.stageRanges(this.editor); + var result = this.getRangesAppliedResult(this.editor); var status = (this.input).getFileStatus(); var path = status.getPath(); @@ -426,6 +430,28 @@ export class StageRangesAction extends baseeditor.EditorInputAction { } } +export class StageRangesAction extends BaseStageRangesAction { + static ID = 'workbench.action.git.stageRanges'; + static LABEL = nls.localize('stageSelectedLines', "Stage Selected Lines"); + + constructor(editor:tdeditor.TextDiffEditor, @IGitService gitService: IGitService, @IWorkbenchEditorService editorService : IWorkbenchEditorService) { + super(StageRangesAction.ID, StageRangesAction.LABEL, editor, gitService, editorService); + } +} + +export class UnstageRangesAction extends BaseStageRangesAction { + static ID = 'workbench.action.git.unstageRanges'; + static LABEL = nls.localize('unstageSelectedLines', "Unstage Selected Lines"); + + constructor(editor:tdeditor.TextDiffEditor, @IGitService gitService: IGitService, @IWorkbenchEditorService editorService : IWorkbenchEditorService) { + super(UnstageRangesAction.ID, UnstageRangesAction.LABEL, editor, gitService, editorService); + } + + protected getRangesAppliedResult(editor: editorbrowser.IDiffEditor) { + return stageranges.unstageRanges(editor); + } +} + class FileEditorActionContributor extends baseeditor.EditorInputActionContributor { private instantiationService:IInstantiationService; @@ -472,10 +498,14 @@ class GitWorkingTreeDiffEditorActionContributor extends baseeditor.EditorInputAc } public hasSecondaryActionsForEditorInput(context:baseeditor.IEditorInputActionContext):boolean { - return (context.input instanceof gitei.GitWorkingTreeDiffEditorInput && context.editor instanceof tdeditor.TextDiffEditor); + return (context.input instanceof gitei.GitDiffEditorInput && context.editor instanceof tdeditor.TextDiffEditor); } public getSecondaryActionsForEditorInput(context:baseeditor.IEditorInputActionContext):baseeditor.IEditorInputAction[] { + if (context.input instanceof gitei.GitIndexDiffEditorInput) { + return [ this.instantiationService.createInstance(UnstageRangesAction, context.editor) ]; + } + return [ this.instantiationService.createInstance(StageRangesAction, context.editor) ]; } } diff --git a/src/vs/workbench/parts/git/common/stageRanges.ts b/src/vs/workbench/parts/git/common/stageRanges.ts index 4281cf7f079d57922e370050496b3ef80b31d2f9..32382e5628390678525e0f829ae750de6a787cd3 100644 --- a/src/vs/workbench/parts/git/common/stageRanges.ts +++ b/src/vs/workbench/parts/git/common/stageRanges.ts @@ -48,6 +48,17 @@ export function stageRanges(diff:editorbrowser.IDiffEditor): string { return applyChangesToModel(diff.getModel().original, diff.getModel().modified, changes); } +export function unstageRanges(diff:editorbrowser.IDiffEditor): string { + var selections = diff.getSelections(); + var changes = getSelectedChanges(diff.getLineChanges(), selections); + + changes.forEach((change) => { + [change.originalStartLineNumber, change.originalEndLineNumber, change.modifiedStartLineNumber, change.modifiedEndLineNumber] = [change.modifiedStartLineNumber, change.modifiedEndLineNumber, change.originalStartLineNumber, change.originalEndLineNumber]; + }); + + return applyChangesToModel(diff.getModel().modified, diff.getModel().original, changes); +} + /** * Returns an intersection between a change and a selection. * Returns null if intersection does not exist.