You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

131 lines
5.1 KiB

'use strict';
import { TextEditor, Uri } from 'vscode';
import { GlyphChars } from '../constants';
import { GitRemote, GitService, RemoteResource, RemoteResourceType } from '../git/gitService';
import { Logger } from '../logger';
import { Messages } from '../messages';
import { CommandQuickPickItem, OpenRemoteCommandQuickPickItem, RemotesQuickPick } from '../quickpicks';
import { Strings } from '../system';
import { ActiveEditorCommand, command, Commands } from './common';
export interface OpenInRemoteCommandArgs {
remote?: string;
remotes?: GitRemote[];
resource?: RemoteResource;
clipboard?: boolean;
goBackCommand?: CommandQuickPickItem;
}
@command()
export class OpenInRemoteCommand extends ActiveEditorCommand {
constructor() {
super(Commands.OpenInRemote);
}
async execute(editor: TextEditor, uri?: Uri, args: OpenInRemoteCommandArgs = {}) {
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 {
let remote: GitRemote | undefined;
if (args.remotes.length > 1) {
remote = args.remotes.find(r => r.default);
}
else if (args.remotes.length === 1) {
remote = args.remotes[0];
}
if (remote != null) {
this.ensureRemoteBranchName(args);
const command = new OpenRemoteCommandQuickPickItem(remote, args.resource, args.clipboard);
return await command.execute();
}
const verb = args.clipboard ? 'Copy url for' : 'Open';
const suffix = args.clipboard ? `to clipboard from${GlyphChars.Ellipsis}` : `on${GlyphChars.Ellipsis}`;
let placeHolder = '';
switch (args.resource.type) {
case RemoteResourceType.Branch:
this.ensureRemoteBranchName(args);
placeHolder = `${verb} ${args.resource.branch} branch ${suffix}`;
break;
case RemoteResourceType.Commit:
placeHolder = `${verb} commit ${GitService.shortenSha(args.resource.sha)} ${suffix}`;
break;
case RemoteResourceType.File:
placeHolder = `${verb} ${args.resource.fileName} ${suffix}`;
break;
case RemoteResourceType.Revision:
if (args.resource.commit !== undefined && args.resource.commit.isFile) {
if (args.resource.commit.status === 'D') {
args.resource.sha = args.resource.commit.previousSha;
placeHolder = `${verb} ${args.resource.fileName} ${Strings.pad(GlyphChars.Dot, 1, 1)} ${
args.resource.commit.previousShortSha
} ${suffix}`;
}
else {
args.resource.sha = args.resource.commit.sha;
placeHolder = `${verb} ${args.resource.fileName} ${Strings.pad(GlyphChars.Dot, 1, 1)} ${
args.resource.commit.shortSha
} ${suffix}`;
}
}
else {
const shortFileSha =
args.resource.sha === undefined ? '' : GitService.shortenSha(args.resource.sha);
const shaSuffix = shortFileSha ? ` ${Strings.pad(GlyphChars.Dot, 1, 1)} ${shortFileSha}` : '';
placeHolder = `${verb} ${args.resource.fileName}${shaSuffix} ${suffix}`;
}
break;
}
const pick = await RemotesQuickPick.show(
args.remotes,
placeHolder,
args.resource,
args.clipboard,
args.goBackCommand
);
if (pick === undefined) return undefined;
return await pick.execute();
}
catch (ex) {
Logger.error(ex, 'OpenInRemoteCommand');
return Messages.showGenericErrorMessage('Unable to open in remote provider');
}
}
private ensureRemoteBranchName(args: OpenInRemoteCommandArgs) {
if (
args.remotes === undefined ||
args.resource === undefined ||
args.resource.type !== RemoteResourceType.Branch
) {
return;
}
// Check to see if the remote is in the branch
const [remotePart, branchPart] = Strings.splitSingle(args.resource.branch, '/');
if (branchPart === undefined) return;
const remote = args.remotes.find(r => r.name === remotePart);
if (remote === undefined) return;
args.resource.branch = branchPart;
args.remotes = [remote];
}
}