diff --git a/lib/platform/gitlab/index.ts b/lib/platform/gitlab/index.ts index 72a1cff999db475867c5a19aac3d2b144f2355d5..17e8a527fcb95d0b3da8f5d4bd3df308e5ce11cc 100644 --- a/lib/platform/gitlab/index.ts +++ b/lib/platform/gitlab/index.ts @@ -41,6 +41,7 @@ import { BRANCH_STATUS_SUCCESS, } from '../../constants/branch-constants'; +type MergeMethod = 'merge' | 'rebase_merge' | 'ff'; const defaultConfigFile = configFileNames[0]; let config: { storage: GitStorage; @@ -53,6 +54,7 @@ let config: { prList: any[]; issueList: any[]; optimizeForDisabled: boolean; + mergeMethod: MergeMethod; } = {} as any; const defaults = { @@ -137,6 +139,7 @@ export async function initRepo({ config.repository = urlEscape(repository); config.gitPrivateKey = gitPrivateKey; config.localDir = localDir; + let res: GotResponse<{ archived: boolean; mirror: boolean; @@ -146,6 +149,7 @@ export async function initRepo({ forked_from_project: boolean; repository_access_level: 'disabled' | 'private' | 'enabled'; merge_requests_access_level: 'disabled' | 'private' | 'enabled'; + merge_method: MergeMethod; }>; try { res = await api.get(`projects/${config.repository}`); @@ -198,6 +202,7 @@ export async function initRepo({ } config.defaultBranch = res.body.default_branch; config.baseBranch = config.defaultBranch; + config.mergeMethod = res.body.merge_method; logger.debug(`${repository} default branch = ${config.baseBranch}`); // Discover our user email config.email = (await api.get(`user`)).body.email; @@ -259,8 +264,8 @@ export async function initRepo({ return repoConfig; } -export function getRepoForceRebase(): boolean { - return false; +export function getRepoForceRebase(): Promise<boolean> { + return Promise.resolve(config?.mergeMethod !== 'merge'); } export async function setBaseBranch( diff --git a/test/platform/gitlab/index.spec.ts b/test/platform/gitlab/index.spec.ts index 2cca1521645fd6712a7489fabb07e55ca8fb0db2..50dd26aee63f23500fc80adcec093df7b95928f9 100644 --- a/test/platform/gitlab/index.spec.ts +++ b/test/platform/gitlab/index.spec.ts @@ -12,11 +12,11 @@ import { BRANCH_STATUS_PENDING, BRANCH_STATUS_SUCCESS, } from '../../../lib/constants/branch-constants'; -import { GotResponse } from '../../../lib/platform'; +import { GotResponse, Platform } from '../../../lib/platform'; import { partial } from '../../util'; describe('platform/gitlab', () => { - let gitlab: typeof import('../../../lib/platform/gitlab'); + let gitlab: Platform; let api: jest.Mocked<typeof import('../../../lib/platform/gitlab/gl-got-wrapper').api>; let hostRules: jest.Mocked<typeof _hostRules>; let GitStorage: jest.Mocked< @@ -305,8 +305,32 @@ describe('platform/gitlab', () => { }); }); describe('getRepoForceRebase', () => { - it('should return false', () => { - expect(gitlab.getRepoForceRebase()).toBe(false); + it('should return false', async () => { + api.get.mockResolvedValueOnce( + partial<GotResponse>({ + body: { + default_branch: 'master', + http_url_to_repo: null, + merge_method: 'merge', + }, + }) + ); + await initRepo({ repository: 'some/repo/project', token: 'some-token' }); + expect(await gitlab.getRepoForceRebase()).toBe(false); + }); + + it('should return true', async () => { + api.get.mockResolvedValueOnce( + partial<GotResponse>({ + body: { + default_branch: 'master', + http_url_to_repo: null, + merge_method: 'ff', + }, + }) + ); + await initRepo({ repository: 'some/repo/project', token: 'some-token' }); + expect(await gitlab.getRepoForceRebase()).toBe(true); }); }); describe('setBaseBranch(branchName)', () => { @@ -1074,7 +1098,7 @@ describe('platform/gitlab', () => { describe('mergePr(pr)', () => { jest.resetAllMocks(); it('merges the PR', async () => { - await gitlab.mergePr(1); + await gitlab.mergePr(1, undefined); expect(api.put.mock.calls.length).toEqual(1); }); });