diff --git a/lib/workers/branch/automerge.ts b/lib/workers/branch/automerge.ts index 707d4e8fa11e173912e3933a24fa718c05878541..a6298c078046d75c3aca7f2cd4e453c385f4080f 100644 --- a/lib/workers/branch/automerge.ts +++ b/lib/workers/branch/automerge.ts @@ -38,13 +38,40 @@ export async function tryBranchAutomerge( } logger.info({ branch: config.branchName }, 'Branch automerged'); return 'automerged'; // Branch no longer exists - } catch (err) { - // istanbul ignore if + } catch (err) /* istanbul ignore next */ { if (err.message === 'not ready') { logger.debug('Branch is not ready for automerge'); return 'not ready'; } - logger.info({ err }, `Failed to automerge branch`); + if ( + err.message.includes('refusing to merge unrelated histories') || + err.message.includes('Not possible to fast-forward') + ) { + logger.warn({ err }, 'Branch is not up to date - cannot automerge'); + return 'not ready'; + } + if (err.message.includes('Protected branch')) { + if (err.message.includes('status check')) { + logger.debug( + { err }, + 'Branch is not ready for automerge: required status checks are remaining' + ); + return 'not ready'; + } + if (err.stack?.includes('reviewers')) { + logger.info( + { err }, + 'Branch automerge is not possible due to branch protection (required reviewers)' + ); + return 'failed'; + } + logger.info( + { err }, + 'Branch automerge is not possible due to branch protection' + ); + return 'failed'; + } + logger.warn({ err }, 'Unknown error when attempting branch automerge'); return 'failed'; } } else if (branchStatus === BranchStatus.red) {