mirror of
https://github.com/ckaczor/vscode-gitlens.git
synced 2026-02-12 02:58:32 -05:00
112 lines
4.6 KiB
TypeScript
112 lines
4.6 KiB
TypeScript
'use strict';
|
|
import { Strings } from '../system';
|
|
import { TextEditor, Uri, window } from 'vscode';
|
|
import { ActiveEditorCommand, Commands, getCommandUri } from './common';
|
|
import { GlyphChars } from '../constants';
|
|
import { GitLogCommit, GitRemote, GitService, RemoteResource } from '../gitService';
|
|
import { Logger } from '../logger';
|
|
import { CommandQuickPickItem, OpenRemoteCommandQuickPickItem, RemotesQuickPick } from '../quickPicks';
|
|
|
|
export interface OpenInRemoteCommandArgs {
|
|
remote?: string;
|
|
remotes?: GitRemote[];
|
|
resource?: RemoteResource;
|
|
|
|
goBackCommand?: CommandQuickPickItem;
|
|
}
|
|
|
|
export class OpenInRemoteCommand extends ActiveEditorCommand {
|
|
|
|
constructor() {
|
|
super(Commands.OpenInRemote);
|
|
}
|
|
|
|
async execute(editor: TextEditor, uri?: Uri, args: OpenInRemoteCommandArgs = {}) {
|
|
uri = getCommandUri(uri, editor);
|
|
|
|
args = { ...args };
|
|
if (args.remotes === undefined || args.resource === undefined) return undefined;
|
|
|
|
if (args.remote !== undefined) {
|
|
const remotes = args.remotes.filter(r => r.name === args.remote);
|
|
// Only filter if we get some results
|
|
if (remotes.length > 0) {
|
|
args.remotes = remotes;
|
|
}
|
|
}
|
|
|
|
try {
|
|
if (args.remotes.length === 1) {
|
|
this.ensureRemoteBranchName(args);
|
|
const command = new OpenRemoteCommandQuickPickItem(args.remotes[0], args.resource);
|
|
return command.execute();
|
|
}
|
|
|
|
let placeHolder = '';
|
|
switch (args.resource.type) {
|
|
case 'branch':
|
|
this.ensureRemoteBranchName(args);
|
|
placeHolder = `open ${args.resource.branch} branch in${GlyphChars.Ellipsis}`;
|
|
break;
|
|
|
|
case 'commit':
|
|
const shortSha = GitService.shortenSha(args.resource.sha);
|
|
placeHolder = `open commit ${shortSha} in${GlyphChars.Ellipsis}`;
|
|
break;
|
|
|
|
case 'file':
|
|
placeHolder = `open ${args.resource.fileName} in${GlyphChars.Ellipsis}`;
|
|
break;
|
|
|
|
case 'revision':
|
|
if (args.resource.commit !== undefined && args.resource.commit instanceof GitLogCommit) {
|
|
if (args.resource.commit.status === 'D') {
|
|
args.resource.sha = args.resource.commit.previousSha;
|
|
placeHolder = `open ${args.resource.fileName} ${Strings.pad(GlyphChars.Dot, 1, 1)} ${args.resource.commit.previousShortSha} in${GlyphChars.Ellipsis}`;
|
|
}
|
|
else {
|
|
args.resource.sha = args.resource.commit.sha;
|
|
placeHolder = `open ${args.resource.fileName} ${Strings.pad(GlyphChars.Dot, 1, 1)} ${args.resource.commit.shortSha} in${GlyphChars.Ellipsis}`;
|
|
}
|
|
}
|
|
else {
|
|
const shortFileSha = args.resource.sha === undefined ? '' : GitService.shortenSha(args.resource.sha);
|
|
const shaSuffix = shortFileSha ? ` ${Strings.pad(GlyphChars.Dot, 1, 1)} ${shortFileSha}` : '';
|
|
|
|
placeHolder = `open ${args.resource.fileName}${shaSuffix} in${GlyphChars.Ellipsis}`;
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (args.remotes.length === 1) {
|
|
const command = new OpenRemoteCommandQuickPickItem(args.remotes[0], args.resource);
|
|
return command.execute();
|
|
}
|
|
|
|
const pick = await RemotesQuickPick.show(args.remotes, placeHolder, args.resource, args.goBackCommand);
|
|
if (pick === undefined) return undefined;
|
|
|
|
return pick.execute();
|
|
|
|
}
|
|
catch (ex) {
|
|
Logger.error(ex, 'OpenInRemoteCommand');
|
|
return window.showErrorMessage(`Unable to open in remote provider. See output channel for more details`);
|
|
}
|
|
}
|
|
|
|
private ensureRemoteBranchName(args: OpenInRemoteCommandArgs) {
|
|
if (args.remotes === undefined || args.resource === undefined || args.resource.type !== 'branch') return;
|
|
|
|
// Check to see if the remote is in the branch
|
|
const index = args.resource.branch.indexOf('/');
|
|
if (index >= 0) {
|
|
const remoteName = args.resource.branch.substring(0, index);
|
|
const remote = args.remotes.find(r => r.name === remoteName);
|
|
if (remote !== undefined) {
|
|
args.resource.branch = args.resource.branch.substring(index + 1);
|
|
args.remotes = [remote];
|
|
}
|
|
}
|
|
}
|
|
} |