From a1fd23d56287ca5123fd6430254f5a837a5737fb Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Thu, 10 May 2018 16:14:43 -0700 Subject: [PATCH] show local branches for PR --- .../src/common/models/pullRequestModel.ts | 3 ++- .../src/common/models/repository.ts | 12 +++++++++++ .../src/common/pullRequestGitHelper.ts | 21 +++++++++++++++++++ .../git-extended/src/common/treeItems.ts | 3 +++ .../git-extended/src/prView/prProvider.ts | 20 ++++++++++++++++++ .../git-extended/src/review/reviewManager.ts | 1 - 6 files changed, 58 insertions(+), 2 deletions(-) diff --git a/extensions/git-extended/src/common/models/pullRequestModel.ts b/extensions/git-extended/src/common/models/pullRequestModel.ts index 3d05be80500..849b38d8376 100644 --- a/extensions/git-extended/src/common/models/pullRequestModel.ts +++ b/extensions/git-extended/src/common/models/pullRequestModel.ts @@ -14,7 +14,8 @@ export enum PRType { ReviewedByMe = 1, Mine = 2, Mention = 3, - All = 4 + All = 4, + LocalPullRequest = 5 } export enum PullRequestStateEnum { diff --git a/extensions/git-extended/src/common/models/repository.ts b/extensions/git-extended/src/common/models/repository.ts index 1886a902613..4d874d26afa 100644 --- a/extensions/git-extended/src/common/models/repository.ts +++ b/extensions/git-extended/src/common/models/repository.ts @@ -243,6 +243,18 @@ export class Repository { } } + async getLocalBranches(): Promise { + let result = await GitProcess.exec(['branch'], this.path); + + if (result.exitCode !== 0) { + return []; + } + + return result.stdout.trim().split(/\r|\n|\r\n/).map(branchName => { + return branchName.substr(2); + }); + } + async getRefs(): Promise { const result = await GitProcess.exec(['for-each-ref', '--format', '%(refname) %(objectname)', '--sort', '-committerdate'], this.path); diff --git a/extensions/git-extended/src/common/pullRequestGitHelper.ts b/extensions/git-extended/src/common/pullRequestGitHelper.ts index a680ded5e44..a2a75f57dff 100644 --- a/extensions/git-extended/src/common/pullRequestGitHelper.ts +++ b/extensions/git-extended/src/common/pullRequestGitHelper.ts @@ -200,8 +200,29 @@ export class PullRequestGitHelper { return repository.cloneUrl && repository.cloneUrl.equals(pullRequest.head.repositoryCloneUrl); } + static async getPullRequestForBranch(repository: Repository, branchName: string) { + let prConfigKey = `branch.${branchName}.${SettingGHfVSCPullRequest}`; + let info = await repository.getConfig(prConfigKey); + + return info; + } + static async markBranchAsPullRequest(repository: Repository, pullRequest: PullRequestModel, branchName: string) { let prConfigKey = `branch.${branchName}.${SettingGHfVSCPullRequest}`; await repository.setConfig(prConfigKey, PullRequestGitHelper.buildGHfVSConfigKeyValue(pullRequest)); } + + static async getLocalBranchesMarkedAsPullRequest(repository: Repository) { + let branches = await repository.getLocalBranches(); + + let ret = []; + for (let i = 0; i < branches.length; i++) { + let localInfo = await PullRequestGitHelper.getPullRequestForBranch(repository, branches[i]); + if (localInfo) { + ret.push(PullRequestGitHelper.parseGHfVSConfigKeyValue(localInfo)); + } + } + + return ret; + } } \ No newline at end of file diff --git a/extensions/git-extended/src/common/treeItems.ts b/extensions/git-extended/src/common/treeItems.ts index 1e9ae2718a0..ab58dccd23c 100644 --- a/extensions/git-extended/src/common/treeItems.ts +++ b/extensions/git-extended/src/common/treeItems.ts @@ -60,6 +60,9 @@ export class PRGroupTreeItem implements vscode.TreeItem { case PRType.Mine: this.label = 'Mine'; break; + case PRType.LocalPullRequest: + this.label = 'Local Pull Request Branches'; + break; default: break; } diff --git a/extensions/git-extended/src/prView/prProvider.ts b/extensions/git-extended/src/prView/prProvider.ts index 7e1d9ed55c5..773b27b5058 100644 --- a/extensions/git-extended/src/prView/prProvider.ts +++ b/extensions/git-extended/src/prView/prProvider.ts @@ -78,6 +78,7 @@ export class PRProvider implements vscode.TreeDataProvider { if (!element) { return Promise.resolve([ + new PRGroupTreeItem(PRType.LocalPullRequest), new PRGroupTreeItem(PRType.RequestReview), new PRGroupTreeItem(PRType.ReviewedByMe), new PRGroupTreeItem(PRType.Mine), @@ -245,6 +246,25 @@ export class PRProvider implements vscode.TreeDataProvider { + if (element.type === PRType.LocalPullRequest) { + let infos = await PullRequestGitHelper.getLocalBranchesMarkedAsPullRequest(this.repository); + let promises = infos.map(async info => { + let owner = info.owner; + let prNumber = info.prNumber; + let githubRepo = this.repository.githubRepositories.find(repo => repo.remote.owner.toLocaleLowerCase() === owner.toLocaleLowerCase()); + + if (!githubRepo) { + return Promise.resolve([]); + } + + return await githubRepo.getPullRequest(prNumber); + }); + + return Promise.all(promises).then(values => { + return _.flatten(values); + }); + } + let promises = this.repository.githubRepositories.map(async githubRepository => { let remote = githubRepository.remote.remoteName; let isRemoteForPR = await PullRequestGitHelper.isRemoteCreatedForPullRequest(this.repository, remote); diff --git a/extensions/git-extended/src/review/reviewManager.ts b/extensions/git-extended/src/review/reviewManager.ts index 7821878faec..fe43c739022 100644 --- a/extensions/git-extended/src/review/reviewManager.ts +++ b/extensions/git-extended/src/review/reviewManager.ts @@ -385,7 +385,6 @@ export class ReviewManager implements vscode.DecorationProvider { } } - return {}; } -- GitLab