From 360c38e5369018a9141bd59b604d123ddb3ae769 Mon Sep 17 00:00:00 2001 From: Eric Amodio Date: Fri, 17 Feb 2017 22:20:25 -0500 Subject: [PATCH] Adds copyMessageToClipboard command Adds copyMessageToClipboard to the editor content menu Adds copyMessageToClipboard to showQuickCommitDetails quick pick --- package.json | 14 +++++ src/commands/copyMessageToClipboard.ts | 75 ++++++++++++++++++++++++++ src/commands/quickPicks.ts | 5 ++ src/constants.ts | 3 +- src/extension.ts | 2 + 5 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 src/commands/copyMessageToClipboard.ts diff --git a/package.json b/package.json index e722762..6e99f44 100644 --- a/package.json +++ b/package.json @@ -386,6 +386,11 @@ "command": "gitlens.copyShaToClipboard", "title": "Copy Commit Sha to Clipboard", "category": "GitLens" + }, + { + "command": "gitlens.copyMessageToClipboard", + "title": "Copy Commit Message to Clipboard", + "category": "GitLens" } ], "menus": { @@ -441,6 +446,10 @@ { "command": "gitlens.copyShaToClipboard", "when": "gitlens:enabled" + }, + { + "command": "gitlens.copyMessageToClipboard", + "when": "gitlens:enabled" } ], "explorer/context": [ @@ -535,6 +544,11 @@ "command": "gitlens.copyShaToClipboard", "when": "editorTextFocus && gitlens:enabled", "group": "9_gitlens@1" + }, + { + "command": "gitlens.copyMessageToClipboard", + "when": "editorTextFocus && gitlens:enabled", + "group": "9_gitlens@2" } ] }, diff --git a/src/commands/copyMessageToClipboard.ts b/src/commands/copyMessageToClipboard.ts new file mode 100644 index 0000000..6f94749 --- /dev/null +++ b/src/commands/copyMessageToClipboard.ts @@ -0,0 +1,75 @@ +'use strict'; +import { Iterables } from '../system'; +import { TextEditor, Uri, window } from 'vscode'; +import { ActiveEditorCommand } from './commands'; +import { Commands } from '../constants'; +import GitProvider, { GitUri } from '../gitProvider'; +import { Logger } from '../logger'; +import { copy } from 'copy-paste'; + +export default class CopyMessageToClipboardCommand extends ActiveEditorCommand { + + constructor(private git: GitProvider, public repoPath: string) { + super(Commands.CopyMessageToClipboard); + } + + async execute(editor: TextEditor, uri?: Uri, sha?: string, message?: string): Promise { + if (!(uri instanceof Uri)) { + uri = editor && editor.document && editor.document.uri; + } + + try { + // If we don't have an editor then get the message of the last commit to the repository + if (!uri) { + const log = await this.git.getLogForRepo(this.repoPath, undefined, 1); + if (!log) return undefined; + + message = Iterables.first(log.commits.values()).message; + copy(message); + return undefined; + } + + const line = editor.selection.active.line; + const gitUri = GitUri.fromUri(uri, this.git); + + if (!message) { + if (!sha) { + const blameline = line - gitUri.offset; + if (blameline < 0) return undefined; + + try { + const blame = await this.git.getBlameForLine(gitUri.fsPath, blameline, gitUri.sha, gitUri.repoPath); + if (!blame) return undefined; + + if (blame.commit.isUncommitted) return undefined; + + sha = blame.commit.sha; + if (!gitUri.repoPath) { + gitUri.repoPath = blame.commit.repoPath; + } + } + catch (ex) { + Logger.error('[GitLens.CopyMessageToClipboardCommand]', `getBlameForLine(${blameline})`, ex); + return window.showErrorMessage(`Unable to copy message. See output channel for more details`); + } + } + + // Get the full commit message -- since blame only returns the summary + const log = await this.git.getLogForFile(gitUri.fsPath, sha, gitUri.repoPath, undefined, 1); + if (!log) return undefined; + + const commit = log.commits.get(sha); + if (!commit) return undefined; + + message = commit.message; + } + + copy(message); + return undefined; + } + catch (ex) { + Logger.error('GitLens.CopyMessageToClipboardCommand', ex); + return window.showErrorMessage(`Unable to copy message. See output channel for more details`); + } + } +} \ No newline at end of file diff --git a/src/commands/quickPicks.ts b/src/commands/quickPicks.ts index ad2a99c..4b5c27a 100644 --- a/src/commands/quickPicks.ts +++ b/src/commands/quickPicks.ts @@ -34,6 +34,11 @@ export class CommitQuickPick { description: `\u00a0 \u2014 \u00a0\u00a0 $(git-commit) ${commit.sha}` }, Commands.CopyShaToClipboard, [uri, commit.sha])); + items.push(new CommandQuickPickItem({ + label: `$(clippy) Copy Commit Message to Clipboard`, + description: `\u00a0 \u2014 \u00a0\u00a0 $(git-commit) ${commit.message}` + }, Commands.CopyMessageToClipboard, [uri, commit.sha, commit.message])); + items.push(new CommandQuickPickItem({ label: `$(diff) Show Changed Files`, description: `\u00a0 \u2014 \u00a0\u00a0 $(git-commit) ${commit.sha}`, diff --git a/src/constants.ts b/src/constants.ts index 7259bc6..d27dc06 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -15,8 +15,9 @@ export const BuiltInCommands = { ToggleRenderWhitespace: 'editor.action.toggleRenderWhitespace' as BuiltInCommands }; -export type Commands = 'gitlens.copyShaToClipboard' | 'gitlens.diffWithPrevious' | 'gitlens.diffLineWithPrevious' | 'gitlens.diffWithWorking' | 'gitlens.diffLineWithWorking' | 'gitlens.showBlame' | 'gitlens.showBlameHistory' | 'gitlens.showFileHistory' | 'gitlens.showQuickCommitDetails' | 'gitlens.showQuickFileHistory' | 'gitlens.showQuickRepoHistory' | 'gitlens.toggleBlame' | 'gitlens.toggleCodeLens'; +export type Commands = 'gitlens.copyMessageToClipboard' | 'gitlens.copyShaToClipboard' | 'gitlens.diffWithPrevious' | 'gitlens.diffLineWithPrevious' | 'gitlens.diffWithWorking' | 'gitlens.diffLineWithWorking' | 'gitlens.showBlame' | 'gitlens.showBlameHistory' | 'gitlens.showFileHistory' | 'gitlens.showQuickCommitDetails' | 'gitlens.showQuickFileHistory' | 'gitlens.showQuickRepoHistory' | 'gitlens.toggleBlame' | 'gitlens.toggleCodeLens'; export const Commands = { + CopyMessageToClipboard: 'gitlens.copyMessageToClipboard' as Commands, CopyShaToClipboard: 'gitlens.copyShaToClipboard' as Commands, DiffWithPrevious: 'gitlens.diffWithPrevious' as Commands, DiffLineWithPrevious: 'gitlens.diffLineWithPrevious' as Commands, diff --git a/src/extension.ts b/src/extension.ts index 4f7fd9c..93b2320 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -3,6 +3,7 @@ import { commands, ExtensionContext, languages, window, workspace } from 'vscode import BlameActiveLineController from './blameActiveLineController'; import BlameAnnotationController from './blameAnnotationController'; import { configureCssCharacters } from './blameAnnotationFormatter'; +import CopyMessageToClipboardCommand from './commands/copyMessageToClipboard'; import CopyShaToClipboardCommand from './commands/copyShaToClipboard'; import DiffLineWithPreviousCommand from './commands/diffLineWithPrevious'; import DiffLineWithWorkingCommand from './commands/diffLineWithWorking'; @@ -77,6 +78,7 @@ export async function activate(context: ExtensionContext) { const activeLineController = new BlameActiveLineController(context, git, annotationController); context.subscriptions.push(activeLineController); + context.subscriptions.push(new CopyMessageToClipboardCommand(git, repoPath)); context.subscriptions.push(new CopyShaToClipboardCommand(git)); context.subscriptions.push(new DiffWithWorkingCommand(git)); context.subscriptions.push(new DiffLineWithWorkingCommand(git));