From 3cc637f6f255c1d04376115b9256d7862f839f48 Mon Sep 17 00:00:00 2001 From: Rhys Arkins Date: Thu, 25 May 2023 15:15:56 +0200 Subject: [PATCH] fix(github): try push branch if rebase fails (#22376) --- lib/modules/platform/github/index.spec.ts | 58 +++++++++++++++++++++++ lib/modules/platform/github/index.ts | 19 ++++++-- 2 files changed, 74 insertions(+), 3 deletions(-) diff --git a/lib/modules/platform/github/index.spec.ts b/lib/modules/platform/github/index.spec.ts index 0789f597bcb205..da1f9e060bd2c5 100644 --- a/lib/modules/platform/github/index.spec.ts +++ b/lib/modules/platform/github/index.spec.ts @@ -3332,5 +3332,63 @@ describe('modules/platform/github/index', () => { expect(res).toBe('0abcdef'); }); + + it('continues if rebase fails due to 422', async () => { + git.pushCommitToRenovateRef.mockResolvedValueOnce(); + git.listCommitTree.mockResolvedValueOnce([]); + + const scope = httpMock.scope(githubApiHost); + + initRepoMock(scope, 'some/repo'); + await github.initRepo({ repository: 'some/repo' }); + + scope + .post('/repos/some/repo/git/trees') + .reply(200, { sha: '111' }) + .post('/repos/some/repo/git/commits') + .reply(200, { sha: '222' }) + .head('/repos/some/repo/git/refs/heads/foo/bar') + .reply(200) + .patch('/repos/some/repo/git/refs/heads/foo/bar') + .reply(422) + .post('/repos/some/repo/git/refs') + .reply(200); + + const res = await github.commitFiles({ + branchName: 'foo/bar', + files: [{ type: 'addition', path: 'foo.bar', contents: 'foobar' }], + message: 'Foobar', + }); + + expect(res).toBe('0abcdef'); + }); + + it('aborts if rebase fails due to non-422', async () => { + git.pushCommitToRenovateRef.mockResolvedValueOnce(); + git.listCommitTree.mockResolvedValueOnce([]); + + const scope = httpMock.scope(githubApiHost); + + initRepoMock(scope, 'some/repo'); + await github.initRepo({ repository: 'some/repo' }); + + scope + .post('/repos/some/repo/git/trees') + .reply(200, { sha: '111' }) + .post('/repos/some/repo/git/commits') + .reply(200, { sha: '222' }) + .head('/repos/some/repo/git/refs/heads/foo/bar') + .reply(200) + .patch('/repos/some/repo/git/refs/heads/foo/bar') + .reply(404); + + const res = await github.commitFiles({ + branchName: 'foo/bar', + files: [{ type: 'addition', path: 'foo.bar', contents: 'foobar' }], + message: 'Foobar', + }); + + expect(res).toBeNull(); + }); }); }); diff --git a/lib/modules/platform/github/index.ts b/lib/modules/platform/github/index.ts index a90fb2a4acc819..f97787372c674b 100644 --- a/lib/modules/platform/github/index.ts +++ b/lib/modules/platform/github/index.ts @@ -742,8 +742,9 @@ async function ensureBranchSha(branchName: string, sha: string): Promise { const refUrl = `/repos/${config.repository}/git/refs/heads/${branchName}`; let branchExists = false; + let branchResult: undefined | HttpResponse; try { - await githubApi.head(refUrl, { memCache: false }); + branchResult = await githubApi.head(refUrl, { memCache: false }); branchExists = true; } catch (err) { if (err.statusCode !== 404) { @@ -752,8 +753,20 @@ async function ensureBranchSha(branchName: string, sha: string): Promise { } if (branchExists) { - await githubApi.patchJson(refUrl, { body: { sha, force: true } }); - return; + try { + await githubApi.patchJson(refUrl, { body: { sha, force: true } }); + return; + } catch (err) { + if (err.err?.response?.statusCode === 422) { + logger.debug( + { branchResult, err }, + 'Branch update failed due to reference not existing - will try to create' + ); + } else { + logger.warn({ refUrl, err, branchResult }, 'Error updating branch'); + throw err; + } + } } await githubApi.postJson(`/repos/${config.repository}/git/refs`, {