From c56219e13df21f5fffb1b9116183bd5741b352e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20M=C3=BCller?= Date: Sat, 14 Jul 2018 10:01:47 +0200 Subject: [PATCH] #54204 add commands to apply stash --- extensions/git/package.json | 28 +++++++++++++++ extensions/git/package.nls.json | 2 ++ extensions/git/src/commands.ts | 60 +++++++++++++++++++++++++------- extensions/git/src/git.ts | 13 +++++-- extensions/git/src/repository.ts | 4 +++ 5 files changed, 93 insertions(+), 14 deletions(-) diff --git a/extensions/git/package.json b/extensions/git/package.json index e455ec699ad..c45d48cb71c 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -329,6 +329,16 @@ "command": "git.stashPopLatest", "title": "%command.stashPopLatest%", "category": "Git" + }, + { + "command": "git.stashApply", + "title": "%command.stashApply%", + "category": "Git" + }, + { + "command": "git.stashApplyLatest", + "title": "%command.stashApplyLatest%", + "category": "Git" } ], "menus": { @@ -536,6 +546,14 @@ { "command": "git.stashPopLatest", "when": "config.git.enabled && gitOpenRepositoryCount != 0" + }, + { + "command": "git.stashApply", + "when": "config.git.enabled && gitOpenRepositoryCount != 0" + }, + { + "command": "git.stashApplyLatest", + "when": "config.git.enabled && gitOpenRepositoryCount != 0" } ], "scm/title": [ @@ -664,6 +682,16 @@ "group": "5_stash", "when": "scmProvider == git" }, + { + "command": "git.stashApply", + "group": "5_stash", + "when": "scmProvider == git" + }, + { + "command": "git.stashApplyLatest", + "group": "5_stash", + "when": "scmProvider == git" + }, { "command": "git.showOutput", "group": "7_repository", diff --git a/extensions/git/package.nls.json b/extensions/git/package.nls.json index 7dc623f9c8e..82582a9c2a1 100644 --- a/extensions/git/package.nls.json +++ b/extensions/git/package.nls.json @@ -50,6 +50,8 @@ "command.stash": "Stash", "command.stashPop": "Pop Stash...", "command.stashPopLatest": "Pop Latest Stash", + "command.stashApply": "Apply Stash...", + "command.stashApplyLatest": "Apply Latest Stash", "config.enabled": "Whether git is enabled", "config.path": "Path to the git executable", "config.autoRepositoryDetection": "Configures when repositories should be automatically detected.", diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 19c3cbdbe59..a6c6b992136 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -6,7 +6,7 @@ 'use strict'; import { Uri, commands, Disposable, window, workspace, QuickPickItem, OutputChannel, Range, WorkspaceEdit, Position, LineChange, SourceControlResourceState, TextDocumentShowOptions, ViewColumn, ProgressLocation, TextEditor, MessageOptions } from 'vscode'; -import { Ref, RefType, Git, GitErrorCodes, Branch } from './git'; +import { Ref, RefType, Git, GitErrorCodes, Branch, Stash } from './git'; import { Repository, Resource, Status, CommitOptions, ResourceGroupType } from './repository'; import { Model } from './model'; import { toGitUri, fromGitUri } from './uri'; @@ -1627,16 +1627,8 @@ export class CommandCenter { @command('git.stashPop', { repository: true }) async stashPop(repository: Repository): Promise { - const stashes = await repository.getStashes(); - - if (stashes.length === 0) { - window.showInformationMessage(localize('no stashes', "There are no stashes to restore.")); - return; - } - - const picks = stashes.map(r => ({ label: `#${r.index}: ${r.description}`, description: '', details: '', id: r.index })); const placeHolder = localize('pick stash to pop', "Pick a stash to pop"); - const choice = await window.showQuickPick(picks, { placeHolder }); + const choice = await this.pickStash(repository, placeHolder); if (!choice) { return; @@ -1649,14 +1641,58 @@ export class CommandCenter { async stashPopLatest(repository: Repository): Promise { const stashes = await repository.getStashes(); - if (stashes.length === 0) { - window.showInformationMessage(localize('no stashes', "There are no stashes to restore.")); + if (!this.anyStashesAvailableToRestore(stashes)) { return; } await repository.popStash(); } + @command('git.stashApply', { repository: true }) + async stashApply(repository: Repository): Promise { + const placeHolder = localize('pick stash to apply', "Pick a stash to apply"); + const choice = await this.pickStash(repository, placeHolder); + + if (!choice) { + return; + } + + await repository.applyStash(choice.id); + } + + @command('git.stashApplyLatest', { repository: true }) + async stashApplyLatest(repository: Repository): Promise { + const stashes = await repository.getStashes(); + + if (!this.anyStashesAvailableToRestore(stashes)) { + return; + } + + await repository.applyStash(); + } + + private anyStashesAvailableToRestore(stashes: Stash[]): boolean { + const stashesAvailable = stashes.length > 0; + + if (!stashesAvailable) { + window.showInformationMessage(localize('no stashes', "There are no stashes to restore.")); + } + + return stashesAvailable; + } + + private async pickStash(repository: Repository, placeHolder: string) { + const stashes = await repository.getStashes(); + + if (!this.anyStashesAvailableToRestore(stashes)) { + return; + } + + const picks = stashes.map(r => ({ label: `#${r.index}: ${r.description}`, description: '', details: '', id: r.index })); + return await window.showQuickPick(picks, { placeHolder }); + } + + private createCommand(id: string, key: string, method: Function, options: CommandOptions): (...args: any[]) => any { const result = (...args: any[]) => { let result: Promise; diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index a6d79456ed2..7e691c085bf 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -1194,9 +1194,17 @@ export class Repository { } async popStash(index?: number): Promise { - try { - const args = ['stash', 'pop']; + const args = ['stash', 'pop']; + this.popOrApplyStash(args, index); + } + async applyStash(index?: number): Promise { + const args = ['stash', 'apply']; + this.popOrApplyStash(args, index); + } + + private async popOrApplyStash(args: string[], index?: number): Promise { + try { if (typeof index === 'number') { args.push(`stash@{${index}}`); } @@ -1213,6 +1221,7 @@ export class Repository { } } + getStatus(limit = 5000): Promise<{ status: IFileStatus[]; didHitLimit: boolean; }> { return new Promise<{ status: IFileStatus[]; didHitLimit: boolean; }>((c, e) => { const parser = new GitStatusParser(); diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index b3af0698312..b60edc526ab 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -922,6 +922,10 @@ export class Repository implements Disposable { return await this.run(Operation.Stash, () => this.repository.popStash(index)); } + async applyStash(index?: number): Promise { + return await this.run(Operation.Stash, () => this.repository.applyStash(index)); + } + async getCommitTemplate(): Promise { return await this.run(Operation.GetCommitTemplate, async () => this.repository.getCommitTemplate()); }