diff --git a/lib/workers/branch/index.spec.ts b/lib/workers/branch/index.spec.ts index 0c61dd50df5f654bbacb65da0a1be6b9026effd3..0e328b0ee501059e9ee878b6d9c57155d1305f18 100644 --- a/lib/workers/branch/index.spec.ts +++ b/lib/workers/branch/index.spec.ts @@ -219,6 +219,22 @@ describe('workers/branch', () => { const res = await branchWorker.processBranch(config); expect(res).toEqual(ProcessBranchResult.PrEdited); }); + it('continues branch if branch edited and but PR found', async () => { + git.branchExists.mockReturnValueOnce(true); + git.isBranchModified.mockResolvedValueOnce(true); + git.getBranchCommit.mockReturnValueOnce('abc123'); + platform.findPr.mockResolvedValueOnce({ sha: 'abc123' } as any); + const res = await branchWorker.processBranch(config); + expect(res).toEqual(ProcessBranchResult.Error); + }); + it('skips branch if branch edited and and PR found with sha mismatch', async () => { + git.branchExists.mockReturnValueOnce(true); + git.isBranchModified.mockResolvedValueOnce(true); + git.getBranchCommit.mockReturnValueOnce('abc123'); + platform.findPr.mockResolvedValueOnce({ sha: 'def456' } as any); + const res = await branchWorker.processBranch(config); + expect(res).toEqual(ProcessBranchResult.PrEdited); + }); it('returns if branch creation limit exceeded', async () => { getUpdated.getUpdatedPackageFiles.mockResolvedValueOnce({ ...updatedPackageFiles, diff --git a/lib/workers/branch/index.ts b/lib/workers/branch/index.ts index 512c606519f4307664f896cf7fd75e0267cea75a..25f6bf38243ec908cfe9ef1da65a6e61f8714fc1 100644 --- a/lib/workers/branch/index.ts +++ b/lib/workers/branch/index.ts @@ -25,6 +25,7 @@ import { readLocalFile, writeLocalFile } from '../../util/fs'; import { checkoutBranch, deleteBranch, + getBranchCommit, getRepoStatus, branchExists as gitBranchExists, isBranchModified, @@ -208,8 +209,28 @@ export async function processBranch( } } } else if (branchIsModified) { - logger.debug('Branch has been edited'); - return ProcessBranchResult.PrEdited; + const oldPr = await platform.findPr({ + branchName: config.branchName, + state: PrState.NotOpen, + }); + if (!oldPr) { + logger.debug('Branch has been edited but found no PR - skipping'); + return ProcessBranchResult.PrEdited; + } + const branchSha = getBranchCommit(config.branchName); + const oldPrSha = oldPr?.sha; + if (!oldPrSha || oldPrSha === branchSha) { + logger.debug( + { oldPrNumber: oldPr.number, oldPrSha, branchSha }, + 'Found old PR matching this branch - will override it' + ); + } else { + logger.debug( + { oldPrNumber: oldPr.number, oldPrSha, branchSha }, + 'Found old PR but the SHA is different' + ); + return ProcessBranchResult.PrEdited; + } } }