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.
 

174 lines
4.8 KiB

'use strict';
import { window } from 'vscode';
import { Commands, OpenInRemoteCommandArgs } from '../commands';
import { GlyphChars } from '../constants';
import {
getNameFromRemoteResource,
GitRemote,
GitService,
GitUri,
RemoteResource,
RemoteResourceType
} from '../git/gitService';
import { CommandQuickPickItem, getQuickPickIgnoreFocusOut } from './commonQuickPicks';
export class OpenRemoteCommandQuickPickItem extends CommandQuickPickItem {
private remote: GitRemote;
private resource: RemoteResource;
constructor(remote: GitRemote, resource: RemoteResource, public readonly clipboard?: boolean) {
super(
{
label: clipboard
? `$(link-external) Copy ${getNameFromRemoteResource(resource)} Url to Clipboard from ${
remote.provider!.name
}`
: `$(link-external) Open ${getNameFromRemoteResource(resource)} on ${remote.provider!.name}`,
description: `$(repo) ${remote.provider!.path}`
},
undefined,
undefined
);
this.remote = remote;
this.resource = resource;
}
execute(): Thenable<{} | undefined> {
if (this.clipboard) return this.remote.provider!.copy(this.resource);
return this.remote.provider!.open(this.resource);
}
}
export class OpenRemotesCommandQuickPickItem extends CommandQuickPickItem {
constructor(remotes: GitRemote[], resource: RemoteResource, goBackCommand?: CommandQuickPickItem) {
const name = getNameFromRemoteResource(resource);
let description;
switch (resource.type) {
case RemoteResourceType.Branch:
description = `$(git-branch) ${resource.branch}`;
break;
case RemoteResourceType.Branches:
description = '$(git-branch) Branches';
break;
case RemoteResourceType.Commit:
description = `$(git-commit) ${GitService.shortenSha(resource.sha)}`;
break;
case RemoteResourceType.File:
description = GitUri.getFormattedPath(resource.fileName);
break;
case RemoteResourceType.Repo:
description = '$(repo) Repository';
break;
case RemoteResourceType.Revision:
if (resource.commit !== undefined && resource.commit.isFile) {
if (resource.commit.status === 'D') {
resource.sha = resource.commit.previousSha;
description = `${GitUri.getFormattedPath(resource.fileName)} from ${
GlyphChars.Space
}$(git-commit) ${resource.commit.previousShortSha} (deleted in ${
GlyphChars.Space
}$(git-commit) ${resource.commit.shortSha})`;
} else {
resource.sha = resource.commit.sha;
description = `${GitUri.getFormattedPath(resource.fileName)} from ${
GlyphChars.Space
}$(git-commit) ${resource.commit.shortSha}`;
}
} else {
const shortFileSha = resource.sha === undefined ? '' : GitService.shortenSha(resource.sha);
description = `${GitUri.getFormattedPath(resource.fileName)}${
shortFileSha ? ` from ${GlyphChars.Space}$(git-commit) ${shortFileSha}` : ''
}`;
}
break;
default:
description = '';
break;
}
let remote: GitRemote | undefined;
if (remotes.length > 1) {
remote = remotes.find(r => r.default);
} else if (remotes.length === 1) {
remote = remotes[0];
}
if (remote != null) {
const commandArgs: OpenInRemoteCommandArgs = {
remotes: remotes,
resource: resource,
goBackCommand: goBackCommand
};
super(
{
label: `$(link-external) Open ${name} on ${remote.provider!.name}`,
description: `${description} in ${GlyphChars.Space}$(repo) ${remote.provider!.path}`
},
Commands.OpenInRemote,
[undefined, commandArgs]
);
return;
}
remote = remotes[0];
// Use the real provider name if there is only 1 provider
const provider = remotes.every(r => r.provider !== undefined && r.provider.name === remote!.provider!.name)
? remote.provider!.name
: 'Remote';
const commandArgs: OpenInRemoteCommandArgs = {
remotes: remotes,
resource: resource,
goBackCommand: goBackCommand
};
super(
{
label: `$(link-external) Open ${name} on ${provider}${GlyphChars.Ellipsis}`,
description: `${description}`
},
Commands.OpenInRemote,
[undefined, commandArgs]
);
}
}
export class RemotesQuickPick {
static async show(
remotes: GitRemote[],
placeHolder: string,
resource: RemoteResource,
clipboard?: boolean,
goBackCommand?: CommandQuickPickItem
): Promise<OpenRemoteCommandQuickPickItem | CommandQuickPickItem | undefined> {
const items = remotes.map(r => new OpenRemoteCommandQuickPickItem(r, resource, clipboard)) as (
| OpenRemoteCommandQuickPickItem
| CommandQuickPickItem
)[];
if (goBackCommand) {
items.splice(0, 0, goBackCommand);
}
// const scope = await Container.keyboard.beginScope({ left: goBackCommand });
const pick = await window.showQuickPick(items, {
placeHolder: placeHolder,
ignoreFocusOut: getQuickPickIgnoreFocusOut()
});
if (pick === undefined) return undefined;
// await scope.dispose();
return pick;
}
}