- 'use strict';
- import { commands, TextEditor, Uri, window } from 'vscode';
- import { GlyphChars } from '../constants';
- import { Container } from '../container';
- import { GitUri, RemoteResourceType } from '../git/gitService';
- import { Logger } from '../logger';
- import { CommandQuickPickItem, ReferencesQuickPick, ReferencesQuickPickIncludes } from '../quickpicks';
- import {
- ActiveEditorCommand,
- command,
- CommandContext,
- Commands,
- getCommandUri,
- getRepoPathOrActiveOrPrompt,
- isCommandViewContextWithBranch
- } from './common';
- import { OpenInRemoteCommandArgs } from './openInRemote';
-
- export interface OpenBranchInRemoteCommandArgs {
- branch?: string;
- remote?: string;
- }
-
- @command()
- export class OpenBranchInRemoteCommand extends ActiveEditorCommand {
- constructor() {
- super(Commands.OpenBranchInRemote);
- }
-
- protected preExecute(context: CommandContext, args?: OpenBranchInRemoteCommandArgs) {
- if (isCommandViewContextWithBranch(context)) {
- args = { ...args };
- args.branch = context.node.branch.name;
- args.remote = context.node.branch.getRemoteName();
- }
-
- return this.execute(context.editor, context.uri, args);
- }
-
- async execute(editor?: TextEditor, uri?: Uri, args?: OpenBranchInRemoteCommandArgs) {
- uri = getCommandUri(uri, editor);
-
- const gitUri = uri && (await GitUri.fromUri(uri));
-
- const repoPath = await getRepoPathOrActiveOrPrompt(
- gitUri,
- editor,
- `Open branch on remote for which repository${GlyphChars.Ellipsis}`
- );
- if (!repoPath) return undefined;
-
- args = { ...args };
-
- try {
- if (args.branch === undefined) {
- const pick = await new ReferencesQuickPick(repoPath).show(
- `Open which branch on remote${GlyphChars.Ellipsis}`,
- {
- autoPick: true,
- checkmarks: false,
- filterBranches: b => b.tracking !== undefined,
- include: ReferencesQuickPickIncludes.Branches
- }
- );
- if (pick === undefined || pick instanceof CommandQuickPickItem) return undefined;
-
- args.branch = pick.ref;
- }
-
- const remotes = await Container.git.getRemotes(repoPath);
-
- const commandArgs: OpenInRemoteCommandArgs = {
- resource: {
- type: RemoteResourceType.Branch,
- branch: args.branch || 'HEAD'
- },
- remote: args.remote,
- remotes: remotes
- };
- return commands.executeCommand(Commands.OpenInRemote, uri, commandArgs);
- } catch (ex) {
- Logger.error(ex, 'OpenBranchInRemoteCommandArgs');
- return window.showErrorMessage(
- 'Unable to open branch on remote provider. See output channel for more details'
- );
- }
- }
- }
|