From 40b5cd7ceb3ca6b0b934a1a62f83398c11a83b71 Mon Sep 17 00:00:00 2001 From: Krzysztof Cieslak Date: Fri, 23 Sep 2016 23:52:32 +0200 Subject: [PATCH] Implement Push To Remote --- .../git/browser/gitActions.contribution.ts | 3 +- .../workbench/parts/git/browser/gitActions.ts | 68 +++++++++++++++++++ .../git/browser/views/changes/changesView.ts | 1 + 3 files changed, 71 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/git/browser/gitActions.contribution.ts b/src/vs/workbench/parts/git/browser/gitActions.contribution.ts index 7ba115be9ed2d..739defa6b92f5 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'; @@ -633,6 +633,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 Remote', 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 c8cbb1e809770..6ceb4c554c189 100644 --- a/src/vs/workbench/parts/git/browser/gitActions.ts +++ b/src/vs/workbench/parts/git/browser/gitActions.ts @@ -1008,6 +1008,74 @@ export class PushAction extends GitAction { } } +export class PushToRemoteAction extends GitAction { + + static ID = 'workbench.action.git.pushToRemote'; + static LABEL = nls.localize('pushToRemote', "Push To Remote"); + + 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; + let promise: TPromise; + + + 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); + + promise = this.quickOpenService.pick(picks, { placeHolder }) + .then(pick => pick && pick.label); + + + return promise + .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 c208b75c5da03..600da2fd4bff4 100644 --- a/src/vs/workbench/parts/git/browser/views/changes/changesView.ts +++ b/src/vs/workbench/parts/git/browser/views/changes/changesView.ts @@ -286,6 +286,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(),