'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;
|
|
}
|
|
}
|