diff --git a/src/vs/workbench/parts/git/browser/gitActions.contribution.ts b/src/vs/workbench/parts/git/browser/gitActions.contribution.ts index eb7bbbc6ab611a0d777e8751e0cade0cd38cd2a0..d2749be5361f348a1d2161f25e88d42e21846bc3 100644 --- a/src/vs/workbench/parts/git/browser/gitActions.contribution.ts +++ b/src/vs/workbench/parts/git/browser/gitActions.contribution.ts @@ -28,7 +28,7 @@ import { IFileService } from 'vs/platform/files/common/files'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import wbar = require('vs/workbench/common/actionRegistry'); import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; -import { OpenChangeAction, OpenFileAction, SyncAction, PullAction, PushAction, PublishAction, StartGitBranchAction, StartGitCheckoutAction, InputCommitAction, UndoLastCommitAction, BaseStageAction, BaseUnstageAction } from './gitActions'; +import { OpenChangeAction, OpenFileAction, SyncAction, PullAction, PushAction, PushToRemoteAction, PublishAction, StartGitBranchAction, StartGitCheckoutAction, InputCommitAction, UndoLastCommitAction, BaseStageAction, BaseUnstageAction } from './gitActions'; import paths = require('vs/base/common/paths'); import URI from 'vs/base/common/uri'; @@ -634,6 +634,7 @@ workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(GlobalO workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(GlobalOpenInEditorAction, GlobalOpenInEditorAction.ID, GlobalOpenInEditorAction.LABEL), 'Git: Open File', category); workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(PullAction, PullAction.ID, PullAction.LABEL), 'Git: Pull', category); workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(PushAction, PushAction.ID, PushAction.LABEL), 'Git: Push', category); +workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(PushToRemoteAction, PushToRemoteAction.ID, PushToRemoteAction.LABEL), 'Git: Push to...', category); workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(SyncAction, SyncAction.ID, SyncAction.LABEL), 'Git: Sync', category); workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(PublishAction, PublishAction.ID, PublishAction.LABEL), 'Git: Publish', category); workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(StartGitBranchAction, StartGitBranchAction.ID, StartGitBranchAction.LABEL), 'Git: Branch', category); diff --git a/src/vs/workbench/parts/git/browser/gitActions.ts b/src/vs/workbench/parts/git/browser/gitActions.ts index f41b4b5495c6f786e3f92238675ed58d5308133b..7c548431ee7ab2ce495d162a9e7e1833ea7e4604 100644 --- a/src/vs/workbench/parts/git/browser/gitActions.ts +++ b/src/vs/workbench/parts/git/browser/gitActions.ts @@ -1007,6 +1007,64 @@ export class PushAction extends GitAction { } } +export class PushToRemoteAction extends GitAction { + + static ID = 'workbench.action.git.pushToRemote'; + static LABEL = nls.localize('pushToRemote', "Push to..."); + + constructor( + id: string = PushToRemoteAction.ID, + label: string = PushToRemoteAction.LABEL, + @IGitService gitService: IGitService, + @IQuickOpenService private quickOpenService: IQuickOpenService + ) { + super(id, label, 'git-action publish', gitService); + } + + protected isEnabled(): boolean { + if (!super.isEnabled()) { + return false; + } + + if (!this.gitService.isIdle()) { + return false; + } + + const model = this.gitService.getModel(); + + if (model.getRemotes().length === 0) { + return false; + } + + const HEAD = model.getHEAD(); + + if (!HEAD || !HEAD.name) { + return false; + } + + return true; + } + + public run(context?: any): Promise { + const model = this.gitService.getModel(); + const remotes = model.getRemotes(); + const branchName = model.getHEAD().name; + const picks = remotes.map(({ name, url }) => ({ label: name, description: url })); + const placeHolder = nls.localize('pushToRemotePickMessage', "Pick a remote to push the branch '{0}' to:", branchName); + + return this.quickOpenService.pick(picks, { placeHolder }) + .then(pick => pick && pick.label) + .then(remote => remote && this.gitService.push(remote, branchName)) + .then(null, err => { + if (err.gitErrorCode === GitErrorCodes.AuthenticationFailed) { + return Promise.wrapError(errors.create(nls.localize('authFailed', "Authentication failed on the git remote."))); + } + + return Promise.wrapError(err); + }); + } +} + export class PublishAction extends GitAction { static ID = 'workbench.action.git.publish'; diff --git a/src/vs/workbench/parts/git/browser/views/changes/changesView.ts b/src/vs/workbench/parts/git/browser/views/changes/changesView.ts index c1348b7ef0b4dbc6dec26297376bc96c1120f8d3..bc2bb34338e7e510ce12ee606d3347e66d66d545 100644 --- a/src/vs/workbench/parts/git/browser/views/changes/changesView.ts +++ b/src/vs/workbench/parts/git/browser/views/changes/changesView.ts @@ -285,6 +285,7 @@ export class ChangesView extends EventEmitter.EventEmitter implements GitView.IV this.instantiationService.createInstance(GitActions.PullAction, GitActions.PullAction.ID, GitActions.PullAction.LABEL), this.instantiationService.createInstance(GitActions.PullWithRebaseAction), this.instantiationService.createInstance(GitActions.PushAction, GitActions.PushAction.ID, GitActions.PushAction.LABEL), + this.instantiationService.createInstance(GitActions.PushToRemoteAction, GitActions.PushToRemoteAction.ID, GitActions.PushToRemoteAction.LABEL), new ActionBar.Separator(), this.instantiationService.createInstance(GitActions.PublishAction, GitActions.PublishAction.ID, GitActions.PublishAction.LABEL), new ActionBar.Separator(),