Adds experimental commands for Open in GitHub

This commit is contained in:
Eric Amodio
2017-03-24 03:00:18 -04:00
parent 4f84c03275
commit 4d1cfd6413
8 changed files with 178 additions and 33 deletions

View File

@@ -2,7 +2,15 @@
import { commands, Disposable, TextEditor, TextEditorEdit, Uri, window, workspace } from 'vscode';
import { BuiltInCommands } from '../constants';
export type Commands = 'gitlens.closeUnchangedFiles' | 'gitlens.copyMessageToClipboard' | 'gitlens.copyShaToClipboard' | 'gitlens.diffDirectory' | 'gitlens.diffWithBranch' | 'gitlens.diffWithNext' | 'gitlens.diffWithPrevious' | 'gitlens.diffLineWithPrevious' | 'gitlens.diffWithWorking' | 'gitlens.diffLineWithWorking' | 'gitlens.openChangedFiles' | 'gitlens.showBlame' | 'gitlens.showBlameHistory' | 'gitlens.showFileHistory' | 'gitlens.showLastQuickPick' | 'gitlens.showQuickBranchHistory' | 'gitlens.showQuickCommitDetails' | 'gitlens.showQuickCommitFileDetails' | 'gitlens.showQuickFileHistory' | 'gitlens.showQuickRepoHistory' | 'gitlens.showQuickRepoStatus' | 'gitlens.toggleBlame' | 'gitlens.toggleCodeLens';
export type Commands = 'gitlens.closeUnchangedFiles' | 'gitlens.copyMessageToClipboard' | 'gitlens.copyShaToClipboard' |
'gitlens.diffDirectory' | 'gitlens.diffWithBranch' | 'gitlens.diffWithNext' | 'gitlens.diffWithPrevious' | 'gitlens.diffLineWithPrevious' | 'gitlens.diffWithWorking' | 'gitlens.diffLineWithWorking' |
'gitlens.openChangedFiles' | 'gitlens.openCommitInHostingProvider' | 'gitlens.openFileInHostingProvider' | 'gitlens.openInHostingProvider' |
'gitlens.showBlame' | 'gitlens.showBlameHistory' | 'gitlens.showFileHistory' |
'gitlens.showLastQuickPick' | 'gitlens.showQuickBranchHistory' |
'gitlens.showQuickCommitDetails' | 'gitlens.showQuickCommitFileDetails' |
'gitlens.showQuickFileHistory' | 'gitlens.showQuickRepoHistory' |
'gitlens.showQuickRepoStatus' |
'gitlens.toggleBlame' | 'gitlens.toggleCodeLens';
export const Commands = {
CloseUnchangedFiles: 'gitlens.closeUnchangedFiles' as Commands,
CopyMessageToClipboard: 'gitlens.copyMessageToClipboard' as Commands,
@@ -15,6 +23,9 @@ export const Commands = {
DiffWithWorking: 'gitlens.diffWithWorking' as Commands,
DiffLineWithWorking: 'gitlens.diffLineWithWorking' as Commands,
OpenChangedFiles: 'gitlens.openChangedFiles' as Commands,
OpenCommitInHostingProvider: 'gitlens.openCommitInHostingProvider' as Commands,
OpenFileInHostingProvider: 'gitlens.openFileInHostingProvider' as Commands,
OpenInHostingProvider: 'gitlens.openInHostingProvider' as Commands,
ShowBlame: 'gitlens.showBlame' as Commands,
ShowBlameHistory: 'gitlens.showBlameHistory' as Commands,
ShowFileHistory: 'gitlens.showFileHistory' as Commands,

View File

@@ -0,0 +1,46 @@
'use strict';
import { Arrays } from '../system';
import { commands, TextEditor, TextEditorEdit, Uri, window } from 'vscode';
import { ActiveEditorCommand, Commands } from './commands';
import { GitCommit, GitService, GitUri } from '../gitService';
import { Logger } from '../logger';
export class OpenCommitInHostingProviderCommand extends ActiveEditorCommand {
constructor(private git: GitService, private repoPath: string) {
super(Commands.OpenCommitInHostingProvider);
}
async execute(editor: TextEditor, edit: TextEditorEdit, uri?: Uri) {
if (!(uri instanceof Uri)) {
if (!editor || !editor.document) return undefined;
uri = editor.document.uri;
}
if (editor && editor.document && editor.document.isDirty) return undefined;
const gitUri = await GitUri.fromUri(uri, this.git);
const line = (editor && editor.selection.active.line) || gitUri.offset;
try {
const blameline = line - gitUri.offset;
if (blameline < 0) return undefined;
const blame = await this.git.getBlameForLine(gitUri, blameline);
if (!blame) return window.showWarningMessage(`Unable to open commit in hosting provider. File is probably not under source control`);
let commit = blame.commit;
// If the line is uncommitted, find the previous commit
if (commit.isUncommitted) {
commit = new GitCommit(commit.repoPath, commit.previousSha, commit.previousFileName, commit.author, commit.date, commit.message);
}
const remotes = Arrays.uniqueBy(await this.git.getRemotes(this.repoPath), _ => _.url, _ => !!_.provider);
return commands.executeCommand(Commands.OpenInHostingProvider, uri, remotes, 'commit', [commit.sha]);
}
catch (ex) {
Logger.error('[GitLens.OpenCommitInHostingProviderCommand]', ex);
return window.showErrorMessage(`Unable to open commit in hosting provider. See output channel for more details`);
}
}
}

View File

@@ -0,0 +1,31 @@
'use strict';
import { Arrays } from '../system';
import { commands, TextEditor, TextEditorEdit, Uri, window } from 'vscode';
import { ActiveEditorCommand, Commands } from './commands';
import { GitService, GitUri } from '../gitService';
import { Logger } from '../logger';
export class OpenFileInHostingProviderCommand extends ActiveEditorCommand {
constructor(private git: GitService, private repoPath: string) {
super(Commands.OpenFileInHostingProvider);
}
async execute(editor: TextEditor, edit: TextEditorEdit, uri?: Uri) {
if (!(uri instanceof Uri)) {
if (!editor || !editor.document) return undefined;
uri = editor.document.uri;
}
const gitUri = await GitUri.fromUri(uri, this.git);
try {
const remotes = Arrays.uniqueBy(await this.git.getRemotes(this.repoPath), _ => _.url, _ => !!_.provider);
return commands.executeCommand(Commands.OpenInHostingProvider, uri, remotes, 'file', [gitUri.getRelativePath(), gitUri.sha]);
}
catch (ex) {
Logger.error('[GitLens.OpenFileInHostingProviderCommand]', ex);
return window.showErrorMessage(`Unable to open file in hosting provider. See output channel for more details`);
}
}
}

View File

@@ -0,0 +1,53 @@
'use strict';
import { TextEditor, Uri, window } from 'vscode';
import { ActiveEditorCommand, Commands } from './commands';
import { GitRemote, HostingProviderOpenType } from '../gitService';
import { Logger } from '../logger';
import { CommandQuickPickItem, OpenRemoteCommandQuickPickItem, RemotesQuickPick } from '../quickPicks';
export class OpenInHostingProviderCommand extends ActiveEditorCommand {
constructor() {
super(Commands.OpenInHostingProvider);
}
async execute(editor: TextEditor, uri?: Uri, remotes?: GitRemote[], type?: HostingProviderOpenType, args?: string[], name?: string, goBackCommand?: CommandQuickPickItem) {
if (!(uri instanceof Uri)) {
uri = editor && editor.document && editor.document.uri;
}
try {
if (!remotes) return undefined;
if (remotes.length === 1) {
const command = new OpenRemoteCommandQuickPickItem(remotes[0], type, ...args, name);
return command.execute();
}
let placeHolder: string;
switch (type) {
case 'branch':
placeHolder = `open ${args[0]} branch in\u2026`;
break;
case 'commit':
const shortSha = args[0].substring(0, 8);
placeHolder = `open commit ${shortSha} in\u2026`;
break;
case 'file':
const shortFileSha = (args[1] && args[1].substring(0, 8)) || '';
const shaSuffix = shortFileSha ? ` \u00a0\u2022\u00a0 ${shortFileSha}` : '';
placeHolder = `open ${args[0]}${shaSuffix} in\u2026`;
break;
}
const pick = await RemotesQuickPick.show(remotes, placeHolder, type, args, name, goBackCommand);
return pick && pick.execute();
}
catch (ex) {
Logger.error('[GitLens.OpenInHostingProviderCommand]', ex);
return window.showErrorMessage(`Unable to open in hosting provider. See output channel for more details`);
}
}
}