- import { env, Uri } from 'vscode';
- import type { Container } from '../container';
- import { PullRequestNode } from '../views/nodes';
- import { Command, command, CommandContext, Commands } from './common';
-
- export interface OpenPullRequestOnRemoteCommandArgs {
- clipboard?: boolean;
- ref?: string;
- repoPath?: string;
- pr?: { url: string };
- }
-
- @command()
- export class OpenPullRequestOnRemoteCommand extends Command {
- constructor(private readonly container: Container) {
- super([Commands.OpenPullRequestOnRemote, Commands.CopyRemotePullRequestUrl]);
- }
-
- protected override preExecute(context: CommandContext, args?: OpenPullRequestOnRemoteCommandArgs) {
- if (context.type === 'viewItem' && context.node instanceof PullRequestNode) {
- args = {
- ...args,
- pr: { url: context.node.pullRequest.url },
- clipboard: context.command === Commands.CopyRemotePullRequestUrl,
- };
- }
-
- return this.execute(args);
- }
-
- async execute(args?: OpenPullRequestOnRemoteCommandArgs) {
- if (args?.pr == null) {
- if (args?.repoPath == null || args?.ref == null) return;
-
- const remote = await this.container.git.getRichRemoteProvider(args.repoPath);
- if (remote?.provider == null) return;
-
- const pr = await this.container.git.getPullRequestForCommit(args.ref, remote.provider);
- if (pr == null) return;
-
- args = { ...args };
- args.pr = pr;
- }
-
- if (args.clipboard) {
- void (await env.clipboard.writeText(args.pr.url));
- } else {
- void env.openExternal(Uri.parse(args.pr.url));
- }
- }
- }
|