diff --git a/extensions/git/package.json b/extensions/git/package.json index 2a47e2dc209..8361cf0a4c5 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -182,6 +182,11 @@ "title": "%command.pullRebase%", "category": "Git" }, + { + "command": "git.pullFrom", + "title": "%command.pullFrom%", + "category": "Git" + }, { "command": "git.push", "title": "%command.push%", @@ -306,6 +311,10 @@ "command": "git.pullRebase", "when": "config.git.enabled && scmProvider == git && gitState == idle" }, + { + "command": "git.pullFrom", + "when": "config.git.enabled && scmProvider == git && gitState == idle" + }, { "command": "git.push", "when": "config.git.enabled && scmProvider == git && gitState == idle" @@ -358,6 +367,11 @@ "group": "1_sync", "when": "config.git.enabled && scmProvider == git && gitState == idle" }, + { + "command": "git.pullFrom", + "group": "1_sync", + "when": "config.git.enabled && scmProvider == git && gitState == idle" + }, { "command": "git.push", "group": "1_sync", diff --git a/extensions/git/package.nls.json b/extensions/git/package.nls.json index efdde34dd7a..0eb876b369f 100644 --- a/extensions/git/package.nls.json +++ b/extensions/git/package.nls.json @@ -23,6 +23,7 @@ "command.branch": "Create Branch...", "command.pull": "Pull", "command.pullRebase": "Pull (Rebase)", + "command.pullFrom": "Pull from...", "command.push": "Push", "command.pushTo": "Push to...", "command.sync": "Sync", diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 24f9c35129a..cb9b05dc179 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -723,6 +723,31 @@ export class CommandCenter { await this.model.pull(true); } + @command('git.pullFrom') + async pullFrom(): Promise { + const remotes = this.model.remotes; + + if (remotes.length === 0) { + window.showWarningMessage(localize('no remotes to pull', "Your repository has no remotes configured to pull from.")); + return; + } + + const picks = remotes.map(r => ({ label: r.name, description: r.url })); + const placeHolder = localize('pick remote pull', "Pick a remote to pull from"); + const pickRemote = await window.showQuickPick(picks, { placeHolder }); + + const pickBranch = await window.showInputBox({ + prompt: localize('pick pull branch', "Type a branch to pull"), + ignoreFocusOut: true + }); + + if (!pickRemote || !pickBranch) { + return; + } + + this.model.pull(false, pickRemote.label, pickBranch); + } + @command('git.push') async push(): Promise { const remotes = this.model.remotes; @@ -894,4 +919,4 @@ export class CommandCenter { dispose(): void { this.disposables.forEach(d => d.dispose()); } -} \ No newline at end of file +} diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index 751fbccc15e..3d75edd48c0 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -291,6 +291,8 @@ function getGitErrorCode(stderr: string): string | undefined { return GitErrorCodes.RepositoryNotFound; } else if (/unable to access/.test(stderr)) { return GitErrorCodes.CantAccessRemote; + } else if (/Couldn\'t find remote ref/.test(stderr)) { + return GitErrorCodes.CantAccessRemote; } return void 0; @@ -730,13 +732,18 @@ export class Repository { } } - async pull(rebase?: boolean): Promise { + async pull(rebase?: boolean, remote?: string, branch?: string): Promise { const args = ['pull']; if (rebase) { args.push('-r'); } + if (remote && branch) { + args.push(remote); + args.push(branch); + } + try { await this.run(args); } catch (err) { diff --git a/extensions/git/src/model.ts b/extensions/git/src/model.ts index 3e8377e93eb..8ffd900cbe9 100644 --- a/extensions/git/src/model.ts +++ b/extensions/git/src/model.ts @@ -474,8 +474,8 @@ export class Model implements Disposable { } } - async pull(rebase?: boolean): Promise { - await this.run(Operation.Pull, () => this.repository.pull(rebase)); + async pull(rebase?: boolean, remote?: string, branch?: string): Promise { + await this.run(Operation.Pull, () => this.repository.pull(rebase, remote, branch)); } async push(remote?: string, name?: string, options?: PushOptions): Promise {