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