diff --git a/packages/common/src/types/TextEditor.ts b/packages/common/src/types/TextEditor.ts index 894fbce780..6670a63c1b 100644 --- a/packages/common/src/types/TextEditor.ts +++ b/packages/common/src/types/TextEditor.ts @@ -250,15 +250,25 @@ export interface EditableTextEditor extends TextEditor { */ gitRevert(range?: Range): Promise; + /** + * Git stage file + */ + gitStageFile(): Promise; + + /** + * Git unstage file + */ + gitUnstageFile(): Promise; + /** * Git stage range * @param range A {@link Range range} */ - gitStage(range?: Range): Promise; + gitStageRange(range?: Range): Promise; /** * Git unstage range * @param range A {@link Range range} */ - gitUnstage(range?: Range): Promise; + gitUnstageRange(range?: Range): Promise; } diff --git a/packages/cursorless-engine/src/actions/SimpleIdeCommandActions.ts b/packages/cursorless-engine/src/actions/SimpleIdeCommandActions.ts index 9b9093fcc9..a6d9668413 100644 --- a/packages/cursorless-engine/src/actions/SimpleIdeCommandActions.ts +++ b/packages/cursorless-engine/src/actions/SimpleIdeCommandActions.ts @@ -47,6 +47,7 @@ abstract class SimpleIdeCommandAction { callback( editor, acceptsLocation ? targets.map((t) => t.contentRange) : undefined, + rangeIsEntireDocument(targets), this.command, ), setSelection: !acceptsLocation, @@ -151,6 +152,7 @@ export class GitUnstage extends SimpleIdeCommandAction { function callback( editor: EditableTextEditor, ranges: Range[] | undefined, + rangeIsEntireDocument: boolean, command: CommandId, ): Promise { switch (command) { @@ -192,12 +194,25 @@ function callback( case "gitRevert": return editor.gitRevert(ranges?.[0]); case "gitStage": - return editor.gitStage(ranges?.[0]); + if (rangeIsEntireDocument) { + return editor.gitStageFile(); + } + return editor.gitStageRange(ranges?.[0]); case "gitUnstage": - return editor.gitUnstage(ranges?.[0]); + if (rangeIsEntireDocument) { + return editor.gitUnstageFile(); + } + return editor.gitUnstageRange(ranges?.[0]); // Unsupported as simple action case "highlight": throw Error("Highlight command not supported as simple action"); } } + +function rangeIsEntireDocument(targets: Target[]): boolean { + return ( + targets.length === 1 && + targets[0].contentRange.isRangeEqual(targets[0].editor.document.range) + ); +} diff --git a/packages/cursorless-everywhere-talon-core/src/ide/TalonJsEditor.ts b/packages/cursorless-everywhere-talon-core/src/ide/TalonJsEditor.ts index da4264bac2..c6592c0c65 100644 --- a/packages/cursorless-everywhere-talon-core/src/ide/TalonJsEditor.ts +++ b/packages/cursorless-everywhere-talon-core/src/ide/TalonJsEditor.ts @@ -163,11 +163,19 @@ export class TalonJsEditor implements EditableTextEditor { throw Error("gitRevert not implemented"); } - public async gitStage(_range?: Range): Promise { - throw Error("gitStage not implemented"); + public async gitStageFile(): Promise { + throw Error("gitStageFile not implemented"); } - public async gitUnstage(_range?: Range): Promise { - throw Error("gitUnstage not implemented"); + public async gitUnstageFile(): Promise { + throw Error("gitUnstageFile not implemented"); + } + + public async gitStageRange(_range?: Range): Promise { + throw Error("gitStageRange not implemented"); + } + + public async gitUnstageRange(_range?: Range): Promise { + throw Error("gitUnstageRange not implemented"); } } diff --git a/packages/cursorless-vscode/src/ide/vscode/VscodeTextEditorImpl.ts b/packages/cursorless-vscode/src/ide/vscode/VscodeTextEditorImpl.ts index e86065b41c..81128c183e 100644 --- a/packages/cursorless-vscode/src/ide/vscode/VscodeTextEditorImpl.ts +++ b/packages/cursorless-vscode/src/ide/vscode/VscodeTextEditorImpl.ts @@ -251,11 +251,19 @@ export class VscodeTextEditorImpl implements EditableTextEditor { await vscode.commands.executeCommand("git.revertSelectedRanges"); } - public async gitStage(_range?: Range): Promise { + public async gitStageFile(): Promise { + await vscode.commands.executeCommand("git.stage"); + } + + public async gitUnstageFile(): Promise { + await vscode.commands.executeCommand("git.unstage"); + } + + public async gitStageRange(_range?: Range): Promise { await vscode.commands.executeCommand("git.stageSelectedRanges"); } - public async gitUnstage(_range?: Range): Promise { + public async gitUnstageRange(_range?: Range): Promise { await vscode.commands.executeCommand("git.unstageSelectedRanges"); } } diff --git a/packages/neovim-common/src/ide/neovim/NeovimTextEditorImpl.ts b/packages/neovim-common/src/ide/neovim/NeovimTextEditorImpl.ts index 8671e17cde..3be47d4c77 100644 --- a/packages/neovim-common/src/ide/neovim/NeovimTextEditorImpl.ts +++ b/packages/neovim-common/src/ide/neovim/NeovimTextEditorImpl.ts @@ -199,11 +199,19 @@ export class NeovimTextEditorImpl implements EditableTextEditor { throw Error("gitRevert Not implemented"); } - public async gitStage(_range?: Range): Promise { - throw Error("gitStage Not implemented"); + public async gitStageFile(): Promise { + throw Error("gitStageFile not implemented"); } - public async gitUnstage(_range?: Range): Promise { - throw Error("gitUnstage Not implemented"); + public async gitUnstageFile(): Promise { + throw Error("gitUnstageFile not implemented"); + } + + public async gitStageRange(_range?: Range): Promise { + throw Error("gitStageRange not implemented"); + } + + public async gitUnstageRange(_range?: Range): Promise { + throw Error("gitUnstageRange not implemented"); } }