瀏覽代碼

Adds default remote picker to open on remote cmds

main
Eric Amodio 4 年之前
父節點
當前提交
7718c5456a
共有 5 個檔案被更改,包括 120 行新增15 行删除
  1. +22
    -2
      src/commands/openOnRemote.ts
  2. +12
    -5
      src/git/models/branch.ts
  3. +8
    -2
      src/git/models/remote.ts
  4. +77
    -5
      src/quickpicks/remoteProviderPicker.ts
  5. +1
    -1
      src/views/nodes/remoteNode.ts

+ 22
- 2
src/commands/openOnRemote.ts 查看文件

@ -5,7 +5,11 @@ import { Container } from '../container';
import { GitRemote, GitRevision, RemoteProvider, RemoteResource, RemoteResourceType } from '../git/git';
import { Logger } from '../logger';
import { Messages } from '../messages';
import { CopyOrOpenRemoteCommandQuickPickItem, RemoteProviderPicker } from '../quickpicks';
import {
CopyOrOpenRemoteCommandQuickPickItem,
RemoteProviderPicker,
SetADefaultRemoteCommandQuickPickItem,
} from '../quickpicks';
import { Strings } from '../system';
export type OpenOnRemoteCommandArgs =
@ -125,8 +129,24 @@ export class OpenOnRemoteCommand extends Command {
`Choose which remote to ${args.clipboard ? 'copy the url from' : 'open on'}`,
args.resource,
remotes,
args.clipboard,
{
clipboard: args.clipboard,
},
);
if (pick instanceof SetADefaultRemoteCommandQuickPickItem) {
const remote = await pick.execute();
if (remote != null) {
void (await new CopyOrOpenRemoteCommandQuickPickItem(
remote,
args.resource,
args.clipboard,
).execute());
}
return;
}
void (await pick?.execute());
} catch (ex) {
Logger.error(ex, 'OpenOnRemoteCommand');

+ 12
- 5
src/git/models/branch.ts 查看文件

@ -192,15 +192,15 @@ export class GitBranch implements GitBranchReference {
return starred !== undefined && starred[this.id] === true;
}
star() {
return this.updateStarred(true);
star(updateViews: boolean = true) {
return this.updateStarred(true, updateViews);
}
unstar() {
return this.updateStarred(false);
unstar(updateViews: boolean = true) {
return this.updateStarred(false, updateViews);
}
private async updateStarred(star: boolean) {
private async updateStarred(star: boolean, updateViews: boolean = true) {
let starred = Container.context.workspaceState.get<StarredBranches>(WorkspaceState.StarredBranches);
if (starred === undefined) {
starred = Object.create(null) as StarredBranches;
@ -213,6 +213,13 @@ export class GitBranch implements GitBranchReference {
starred = rest;
}
await Container.context.workspaceState.update(WorkspaceState.StarredBranches, starred);
// TODO@eamodio this is UGLY
if (updateViews) {
void (await Container.branchesView.refresh());
void (await Container.remotesView.refresh());
void (await Container.repositoriesView.refresh());
}
}
static formatDetached(sha: string): string {

+ 8
- 2
src/git/models/remote.ts 查看文件

@ -61,7 +61,13 @@ export class GitRemote<
return this.id === defaultRemote;
}
setAsDefault(state: boolean = true) {
return Container.context.workspaceState.update(WorkspaceState.DefaultRemote, state ? this.id : undefined);
async setAsDefault(state: boolean = true, updateViews: boolean = true) {
void (await Container.context.workspaceState.update(WorkspaceState.DefaultRemote, state ? this.id : undefined));
// TODO@eamodio this is UGLY
if (updateViews) {
void (await Container.remotesView.refresh());
void (await Container.repositoriesView.refresh());
}
}
}

+ 77
- 5
src/quickpicks/remoteProviderPicker.ts 查看文件

@ -68,23 +68,58 @@ export class OpenRemoteResourceCommandQuickPickItem extends CommandQuickPickItem
}
}
export class SetADefaultRemoteCommandQuickPickItem extends CommandQuickPickItem {
constructor(private readonly remotes: GitRemote<RemoteProvider>[]) {
super({ label: 'Set a Default Remote...' });
}
async execute(): Promise<GitRemote<RemoteProvider> | undefined> {
return RemoteProviderPicker.setADefaultRemote(this.remotes);
}
}
export class SetRemoteAsDefaultCommandQuickPickItem extends CommandQuickPickItem {
constructor(private readonly remote: GitRemote<RemoteProvider>) {
super({
label: remote.provider.name,
detail: `$(repo) ${remote.provider.path}`,
});
}
async execute(): Promise<GitRemote<RemoteProvider>> {
void (await this.remote.setAsDefault(true));
return this.remote;
}
}
export namespace RemoteProviderPicker {
export async function show(
title: string,
placeHolder: string,
resource: RemoteResource,
remotes: GitRemote<RemoteProvider>[],
clipboard?: boolean,
): Promise<CopyOrOpenRemoteCommandQuickPickItem | undefined> {
const items = remotes.map(r => new CopyOrOpenRemoteCommandQuickPickItem(r, resource, clipboard));
options?: { clipboard?: boolean; setDefault?: boolean },
): Promise<CopyOrOpenRemoteCommandQuickPickItem | SetADefaultRemoteCommandQuickPickItem | undefined> {
const { clipboard, setDefault } = { clipboard: false, setDefault: true, ...options };
const items: (CopyOrOpenRemoteCommandQuickPickItem | SetADefaultRemoteCommandQuickPickItem)[] = remotes.map(
r => new CopyOrOpenRemoteCommandQuickPickItem(r, resource, clipboard),
);
if (setDefault) {
items.push(new SetADefaultRemoteCommandQuickPickItem(remotes));
}
const quickpick = window.createQuickPick<CopyOrOpenRemoteCommandQuickPickItem>();
const quickpick = window.createQuickPick<
CopyOrOpenRemoteCommandQuickPickItem | SetADefaultRemoteCommandQuickPickItem
>();
quickpick.ignoreFocusOut = getQuickPickIgnoreFocusOut();
const disposables: Disposable[] = [];
try {
const pick = await new Promise<CopyOrOpenRemoteCommandQuickPickItem | undefined>(resolve => {
const pick = await new Promise<
CopyOrOpenRemoteCommandQuickPickItem | SetADefaultRemoteCommandQuickPickItem | undefined
>(resolve => {
disposables.push(
quickpick.onDidHide(() => resolve()),
quickpick.onDidAccept(() => {
@ -109,4 +144,41 @@ export namespace RemoteProviderPicker {
disposables.forEach(d => d.dispose());
}
}
export async function setADefaultRemote(
remotes: GitRemote<RemoteProvider>[],
): Promise<GitRemote<RemoteProvider> | undefined> {
const items = remotes.map(r => new SetRemoteAsDefaultCommandQuickPickItem(r));
const quickpick = window.createQuickPick<SetRemoteAsDefaultCommandQuickPickItem>();
quickpick.ignoreFocusOut = getQuickPickIgnoreFocusOut();
const disposables: Disposable[] = [];
try {
const pick = await new Promise<SetRemoteAsDefaultCommandQuickPickItem | undefined>(resolve => {
disposables.push(
quickpick.onDidHide(() => resolve()),
quickpick.onDidAccept(() => {
if (quickpick.activeItems.length !== 0) {
resolve(quickpick.activeItems[0]);
}
}),
);
quickpick.title = 'Set a Default Remote';
quickpick.placeholder = 'Choose which remote to set as the default';
quickpick.matchOnDetail = true;
quickpick.items = items;
quickpick.show();
});
if (pick == null) return undefined;
return await pick.execute();
} finally {
quickpick.dispose();
disposables.forEach(d => d.dispose());
}
}
}

+ 1
- 1
src/views/nodes/remoteNode.ts 查看文件

@ -157,6 +157,6 @@ export class RemoteNode extends ViewNode {
@log()
async setAsDefault(state: boolean = true) {
void (await this.remote.setAsDefault(state));
void this.parent!.triggerChange();
void this.triggerChange();
}
}

||||||
x
 
000:0
Loading…
取消
儲存