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.
 

51 lines
1.5 KiB

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