diff --git a/src/extension.ts b/src/extension.ts index a6012c2d..3c295dd9 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -131,28 +131,36 @@ class Extension { }); } - private async getMergeMethdod(): Promise { - if (vscode.workspace.getConfiguration('github').has('preferedMergeMethod')) { - return vscode.workspace.getConfiguration('github').get('preferedMergeMethod'); + private async getMergeMethdod(): Promise { + const preferedMethod = vscode.workspace.getConfiguration('github').get('preferedMergeMethod'); + if (preferedMethod) { + return preferedMethod; } - const items: MergeOptionItems[] = [ - { + const items: MergeOptionItems[] = []; + const enabledMethods = await this.githubManager.getEnabledMergeMethods(); + if (enabledMethods.has('merge')) { + items.push({ label: 'Create merge commit', description: '', method: 'merge' - }, - { + }); + } + if (enabledMethods.has('squash')) { + items.push({ label: 'Squash and merge', description: '', method: 'squash' - }, - { + }); + } + if (enabledMethods.has('rebase')) { + items.push({ label: 'Rebase and merge', description: '', method: 'rebase' - } - ]; - return (await vscode.window.showQuickPick(items)).method; + }); + } + const selected = await vscode.window.showQuickPick(items); + return selected ? selected.method : undefined; } private async mergePullRequest(): Promise { diff --git a/src/github-manager.ts b/src/github-manager.ts index aa5bd1fd..9eb587f4 100644 --- a/src/github-manager.ts +++ b/src/github-manager.ts @@ -29,6 +29,22 @@ export class GitHubManager { return (await this.github.getRepository(owner, repository)).body.default_branch; } + public async getEnabledMergeMethods(): Promise> { + const [owner, repository] = await git.getGitHubOwnerAndRepository(this.cwd); + const repo = await this.github.getRepository(owner, repository); + const set = new Set(); + if (repo.body.allow_merge_commit) { + set.add('merge'); + } + if (repo.body.allow_squash_merge) { + set.add('squash'); + } + if (repo.body.allow_rebase_merge) { + set.add('rebase'); + } + return set; + } + public async getPullRequestForCurrentBranch(): Promise { const [owner, repository] = await git.getGitHubOwnerAndRepository(this.cwd); const branch = await git.getCurrentBranch(this.cwd); diff --git a/src/github.ts b/src/github.ts index 396b2199..d4069b49 100644 --- a/src/github.ts +++ b/src/github.ts @@ -27,6 +27,9 @@ export interface GitHubResponse { export interface Repository { default_branch: string; + allow_rebase_merge: boolean; + allow_squash_merge: boolean; + allow_merge_commit: boolean; } export type MergeMethod = 'merge' | 'squash' | 'rebase'; @@ -166,6 +169,7 @@ namespace impl { export class GitHubBlueprint implements GitHub { + @Headers('Accept: application/vnd.github.polaris-preview') @Get('/repos/:owner/:repo') public getRepository(_owner: string, _repo: string): any {/* */}