diff --git a/lib/platform/azure/index.ts b/lib/platform/azure/index.ts index ef3709235c3ed29f15179a03938c5b78c97b3327..876795fdcca17d15e81712bc8f395872c1d05a71 100644 --- a/lib/platform/azure/index.ts +++ b/lib/platform/azure/index.ts @@ -371,7 +371,7 @@ export /* istanbul ignore next */ function commitFilesToBranch({ files, message, parentBranch = config.baseBranch, -}: CommitFilesConfig): Promise<void> { +}: CommitFilesConfig): Promise<string | null> { return config.storage.commitFilesToBranch({ branchName, files, diff --git a/lib/platform/bitbucket-server/index.ts b/lib/platform/bitbucket-server/index.ts index 515cd44941ae8e57f64c2fb8f1584ca579ea1287..0aed905d58dc32a4aca563b4c769df03b76e84a8 100644 --- a/lib/platform/bitbucket-server/index.ts +++ b/lib/platform/bitbucket-server/index.ts @@ -438,7 +438,7 @@ export async function commitFilesToBranch({ files, message, parentBranch = config.baseBranch, -}: CommitFilesConfig): Promise<void> { +}: CommitFilesConfig): Promise<string | null> { logger.debug( `commitFilesToBranch(${JSON.stringify( { @@ -451,7 +451,7 @@ export async function commitFilesToBranch({ 2 )})` ); - await config.storage.commitFilesToBranch({ + const commit = config.storage.commitFilesToBranch({ branchName, files, message, @@ -462,6 +462,7 @@ export async function commitFilesToBranch({ await delay(1000); // refresh cache await getBranchPr(branchName, true); + return commit; } export function getFile(filePath: string, branchName: string): Promise<string> { diff --git a/lib/platform/bitbucket/index.ts b/lib/platform/bitbucket/index.ts index 03b7eb180193a219ca37591d37e623aea0dd0bff..709ac1d394c7c4c2236f8cfb8bc2af2733d89956 100644 --- a/lib/platform/bitbucket/index.ts +++ b/lib/platform/bitbucket/index.ts @@ -285,7 +285,7 @@ export function commitFilesToBranch({ files, message, parentBranch = config.baseBranch, -}: CommitFilesConfig): Promise<void> { +}: CommitFilesConfig): Promise<string | null> { return config.storage.commitFilesToBranch({ branchName, files, diff --git a/lib/platform/common.ts b/lib/platform/common.ts index c15596d35e9b207143a5d296ba9cdd46bc7bebc3..44c3e554f1fbaeb8ca758b0df438866955cdf891 100644 --- a/lib/platform/common.ts +++ b/lib/platform/common.ts @@ -179,7 +179,7 @@ export interface Platform { ensureComment(ensureComment: EnsureCommentConfig): Promise<boolean>; branchExists(branchName: string): Promise<boolean>; setBaseBranch(baseBranch?: string): Promise<void>; - commitFilesToBranch(commitFile: CommitFilesConfig): Promise<void>; + commitFilesToBranch(commitFile: CommitFilesConfig): Promise<string | null>; getPr(number: number): Promise<Pr>; findPr(findPRConfig: FindPRConfig): Promise<Pr>; mergeBranch(branchName: string): Promise<void>; diff --git a/lib/platform/git/storage.ts b/lib/platform/git/storage.ts index a1e3ad1d49de069387e7adfd338e37573a79ac3a..52070dc512a06b834a4e8929ea5f32f12e74146f 100644 --- a/lib/platform/git/storage.ts +++ b/lib/platform/git/storage.ts @@ -487,7 +487,7 @@ export class Storage { files, message, parentBranch = this._config.baseBranch, - }: CommitFilesConfig): Promise<void> { + }: CommitFilesConfig): Promise<string | null> { logger.debug(`Committing files to branch ${branchName}`); try { await this._git.reset('hard'); @@ -529,13 +529,14 @@ export class Storage { } } } - await this._git.commit(message); + const commitRes = await this._git.commit(message); + const commit = commitRes?.commit || 'unknown'; if (!(await this.hasDiff(`origin/${branchName}`))) { logger.info( { branchName, fileNames }, 'No file changes detected. Skipping commit' ); - return; + return null; } await this._git.push('origin', `${branchName}:${branchName}`, { '--force': true, @@ -546,6 +547,7 @@ export class Storage { await this._git.fetch(['origin', ref, '--depth=2', '--force']); this._config.branchExists[branchName] = true; limits.incrementLimit('prCommitsPerRunLimit'); + return commit; } catch (err) /* istanbul ignore next */ { checkForPlatformFailure(err); logger.debug({ err }, 'Error commiting files'); diff --git a/lib/platform/gitea/index.ts b/lib/platform/gitea/index.ts index 51860b34ff875e210dcab55b2a139d299fa4baf6..25f9e7e9b0175f6ece9bd1230c5e202b2df3db65 100644 --- a/lib/platform/gitea/index.ts +++ b/lib/platform/gitea/index.ts @@ -843,7 +843,7 @@ const platform: Platform = { files, message, parentBranch = config.baseBranch, - }: CommitFilesConfig): Promise<void> { + }: CommitFilesConfig): Promise<string | null> { return config.storage.commitFilesToBranch({ branchName, files, diff --git a/lib/platform/github/index.ts b/lib/platform/github/index.ts index d641e8a96a39f302ede705a3c060181961e2ceca..0a45fa463babe3ef0c7152525374ba7247f74370 100644 --- a/lib/platform/github/index.ts +++ b/lib/platform/github/index.ts @@ -596,7 +596,7 @@ export function commitFilesToBranch({ files, message, parentBranch = config.baseBranch, -}: CommitFilesConfig): Promise<void> { +}: CommitFilesConfig): Promise<string | null> { return config.storage.commitFilesToBranch({ branchName, files, diff --git a/lib/platform/gitlab/index.ts b/lib/platform/gitlab/index.ts index c379638c5eafba3ad1f84c4d36fced23e81a15c8..a6f8763e46c1d0d19ca54fec816889acac77f949 100644 --- a/lib/platform/gitlab/index.ts +++ b/lib/platform/gitlab/index.ts @@ -568,7 +568,7 @@ export function commitFilesToBranch({ files, message, parentBranch = config.baseBranch, -}: CommitFilesConfig): Promise<void> { +}: CommitFilesConfig): Promise<string | null> { return config.storage.commitFilesToBranch({ branchName, files, diff --git a/lib/workers/branch/commit.ts b/lib/workers/branch/commit.ts index 5fe2bffb324be8fe36f746716b6fb377ac8bd30a..df1a42e223c869161e6e982fe2474beb2dde36db 100644 --- a/lib/workers/branch/commit.ts +++ b/lib/workers/branch/commit.ts @@ -15,7 +15,7 @@ export type CommitConfig = RenovateConfig & { export async function commitFilesToBranch( config: CommitConfig -): Promise<boolean> { +): Promise<string | null> { let updatedFiles = config.updatedPackageFiles.concat(config.updatedArtifacts); // istanbul ignore if if (is.nonEmptyArray(config.excludeCommitPaths)) { @@ -31,25 +31,21 @@ export async function commitFilesToBranch( return true; }); } - if (is.nonEmptyArray(updatedFiles)) { - logger.debug(`${updatedFiles.length} file(s) to commit`); - - // istanbul ignore if - if (config.dryRun) { - logger.info('DRY-RUN: Would commit files to branch ' + config.branchName); - } else { - // API will know whether to create new branch or not - await platform.commitFilesToBranch({ - branchName: config.branchName, - files: updatedFiles, - message: config.commitMessage, - parentBranch: config.baseBranch || undefined, - }); - logger.info({ branch: config.branchName }, `files committed`); - } - } else { + if (!is.nonEmptyArray(updatedFiles)) { logger.debug(`No files to commit`); - return false; + return null; + } + logger.debug(`${updatedFiles.length} file(s) to commit`); + // istanbul ignore if + if (config.dryRun) { + logger.info('DRY-RUN: Would commit files to branch ' + config.branchName); + return null; } - return true; + // API will know whether to create new branch or not + return platform.commitFilesToBranch({ + branchName: config.branchName, + files: updatedFiles, + message: config.commitMessage, + parentBranch: config.baseBranch || undefined, + }); } diff --git a/lib/workers/branch/index.ts b/lib/workers/branch/index.ts index 86c6b2af0760657e65b16a50b07ed4b0673b22b6..69226129473b833cc74432f4fa252aa3935b8786 100644 --- a/lib/workers/branch/index.ts +++ b/lib/workers/branch/index.ts @@ -421,10 +421,10 @@ export async function processBranch( } } - config.committedFiles = await commitFilesToBranch(config); + const commit = await commitFilesToBranch(config); + // TODO: Remove lockFileMaintenance rule? if ( config.updateType === 'lockFileMaintenance' && - !config.committedFiles && !config.parentBranch && branchExists ) { @@ -438,10 +438,13 @@ export async function processBranch( } return 'done'; } - if (!(config.committedFiles || branchExists)) { + if (!commit && !branchExists) { return 'no-work'; } - + if (commit) { + const action = branchExists ? 'updated' : 'created'; + logger.info({ commit }, `Branch ${action}`); + } // Set branch statuses await setStability(config); await setUnpublishable(config); diff --git a/lib/workers/repository/onboarding/branch/create.ts b/lib/workers/repository/onboarding/branch/create.ts index 73490bf13855e40102e1643b0476e7fb70378a36..c5d2616506fabc45a04ff2b3b0694adbc610cd8b 100644 --- a/lib/workers/repository/onboarding/branch/create.ts +++ b/lib/workers/repository/onboarding/branch/create.ts @@ -8,7 +8,7 @@ const defaultConfigFile = configFileNames[0]; export async function createOnboardingBranch( config: Partial<RenovateConfig> -): Promise<void> { +): Promise<string | null> { logger.debug('createOnboardingBranch()'); const contents = await getOnboardingConfig(config); logger.info('Creating onboarding branch'); @@ -27,16 +27,16 @@ export async function createOnboardingBranch( // istanbul ignore if if (config.dryRun) { logger.info('DRY-RUN: Would commit files to onboarding branch'); - } else { - await platform.commitFilesToBranch({ - branchName: config.onboardingBranch, - files: [ - { - name: defaultConfigFile, - contents, - }, - ], - message: commitMessage, - }); + return null; } + return platform.commitFilesToBranch({ + branchName: config.onboardingBranch, + files: [ + { + name: defaultConfigFile, + contents, + }, + ], + message: commitMessage, + }); } diff --git a/lib/workers/repository/onboarding/branch/index.ts b/lib/workers/repository/onboarding/branch/index.ts index bc49cde7f2c3d93ca1afc95c243b6b1cd5bc6974..b7307b06b06b9a0e9b4963d56c5abde4fe7a6fcd 100644 --- a/lib/workers/repository/onboarding/branch/index.ts +++ b/lib/workers/repository/onboarding/branch/index.ts @@ -26,14 +26,26 @@ export async function checkOnboardingBranch( logger.info('Repo is not onboarded'); if (await onboardingPrExists(config)) { logger.debug('Onboarding PR already exists'); - await rebaseOnboardingBranch(config); + const commit = await rebaseOnboardingBranch(config); + if (commit) { + logger.info( + { branch: config.onboardingBranch, commit, onboarding: true }, + 'Branch updated' + ); + } } else { logger.debug('Onboarding PR does not exist'); if (Object.entries(await extractAllDependencies(config)).length === 0) { throw new Error(MANAGER_NO_PACKAGE_FILES); } logger.info('Need to create onboarding PR'); - await createOnboardingBranch(config); + const commit = await createOnboardingBranch(config); + if (commit) { + logger.info( + { branch: config.onboardingBranch, commit, onboarding: true }, + 'Branch created' + ); + } } if (!config.dryRun) { await platform.setBaseBranch(config.onboardingBranch); diff --git a/lib/workers/repository/onboarding/branch/rebase.ts b/lib/workers/repository/onboarding/branch/rebase.ts index d981156a226e95c2d9d54d58a803aabe1ec4a524..9ba102a906d987d18cfea31bf4dba696316b5605 100644 --- a/lib/workers/repository/onboarding/branch/rebase.ts +++ b/lib/workers/repository/onboarding/branch/rebase.ts @@ -24,12 +24,12 @@ function getCommitMessage(config: RenovateConfig): string { export async function rebaseOnboardingBranch( config: RenovateConfig -): Promise<void> { +): Promise<string | null> { logger.debug('Checking if onboarding branch needs rebasing'); const pr = await platform.getBranchPr(config.onboardingBranch); if (pr.isModified) { logger.info('Onboarding branch has been edited and cannot be rebased'); - return; + return null; } const existingContents = await platform.getFile( defaultConfigFile, @@ -38,7 +38,7 @@ export async function rebaseOnboardingBranch( const contents = await getOnboardingConfig(config); if (contents === existingContents && !pr.isStale) { logger.info('Onboarding branch is up to date'); - return; + return null; } logger.info('Rebasing onboarding branch'); // istanbul ignore next @@ -47,16 +47,16 @@ export async function rebaseOnboardingBranch( // istanbul ignore if if (config.dryRun) { logger.info('DRY-RUN: Would rebase files in onboarding branch'); - } else { - await platform.commitFilesToBranch({ - branchName: config.onboardingBranch, - files: [ - { - name: defaultConfigFile, - contents, - }, - ], - message: commitMessage, - }); + return null; } + return platform.commitFilesToBranch({ + branchName: config.onboardingBranch, + files: [ + { + name: defaultConfigFile, + contents, + }, + ], + message: commitMessage, + }); } diff --git a/test/workers/branch/commit.spec.ts b/test/workers/branch/commit.spec.ts index b1d5bb8d7de880ed2dad7c2f0e1a832371f6807d..f39c47a7a00e6b43eb86671ada594b5fb5658e94 100644 --- a/test/workers/branch/commit.spec.ts +++ b/test/workers/branch/commit.spec.ts @@ -20,7 +20,7 @@ describe('workers/branch/automerge', () => { updatedArtifacts: [], }; jest.resetAllMocks(); - platform.commitFilesToBranch.mockResolvedValueOnce(); + platform.commitFilesToBranch.mockResolvedValueOnce('abc123'); }); it('handles empty files', async () => { await commitFilesToBranch(config); diff --git a/test/workers/branch/index.spec.ts b/test/workers/branch/index.spec.ts index 5e670ed6d81c667030d20d8817c9657d1fb69ef0..adfb1386cc7cb39fd985b2b1c2bdd9c18e609d40 100644 --- a/test/workers/branch/index.spec.ts +++ b/test/workers/branch/index.spec.ts @@ -62,7 +62,7 @@ describe('workers/branch', () => { upgrades: [{ depName: 'some-dep-name' } as never], } as never; schedule.isScheduledNow.mockReturnValue(true); - commit.commitFilesToBranch.mockResolvedValue(true); + commit.commitFilesToBranch.mockResolvedValue('abc123'); }); afterEach(() => { platform.ensureComment.mockClear(); @@ -221,7 +221,7 @@ describe('workers/branch', () => { updatedArtifacts: [], }); platform.branchExists.mockResolvedValueOnce(false); - commit.commitFilesToBranch.mockResolvedValueOnce(false); + commit.commitFilesToBranch.mockResolvedValueOnce(null); expect(await branchWorker.processBranch(config)).toEqual('no-work'); }); it('returns if branch automerged', async () => { @@ -462,7 +462,7 @@ describe('workers/branch', () => { } as never); schedule.isScheduledNow.mockReturnValueOnce(false); - commit.commitFilesToBranch.mockResolvedValueOnce(false); + commit.commitFilesToBranch.mockResolvedValueOnce(null); expect( await branchWorker.processBranch({ @@ -521,7 +521,7 @@ describe('workers/branch', () => { } as never); schedule.isScheduledNow.mockReturnValueOnce(false); - commit.commitFilesToBranch.mockResolvedValueOnce(false); + commit.commitFilesToBranch.mockResolvedValueOnce(null); expect( await branchWorker.processBranch({ ...config, @@ -558,7 +558,7 @@ describe('workers/branch', () => { fs.readFile.mockResolvedValueOnce(Buffer.from('modified file content')); schedule.isScheduledNow.mockReturnValueOnce(false); - commit.commitFilesToBranch.mockResolvedValueOnce(false); + commit.commitFilesToBranch.mockResolvedValueOnce(null); const result = await branchWorker.processBranch({ ...config, diff --git a/test/workers/repository/onboarding/branch/index.spec.ts b/test/workers/repository/onboarding/branch/index.spec.ts index 9e7e5eae4386c13166964010f6a51438e11de9e1..72ca8c9abea439b53fdc7f6e2d6ede8ac2ad22e4 100644 --- a/test/workers/repository/onboarding/branch/index.spec.ts +++ b/test/workers/repository/onboarding/branch/index.spec.ts @@ -2,6 +2,9 @@ import { mock } from 'jest-mock-extended'; import { RenovateConfig, platform, getConfig } from '../../../../util'; import { checkOnboardingBranch } from '../../../../../lib/workers/repository/onboarding/branch'; import { Pr } from '../../../../../lib/platform'; +import * as _rebase from '../../../../../lib/workers/repository/onboarding/branch/rebase'; + +const rebase: any = _rebase; jest.mock('../../../../../lib/workers/repository/onboarding/branch/rebase'); @@ -86,6 +89,7 @@ describe('workers/repository/onboarding/branch', () => { }, }); platform.getFile.mockResolvedValue(pJsonContent); + platform.commitFilesToBranch.mockResolvedValueOnce('abc123'); await checkOnboardingBranch(config); expect( platform.commitFilesToBranch.mock.calls[0][0].files[0].contents @@ -95,6 +99,7 @@ describe('workers/repository/onboarding/branch', () => { platform.getFileList.mockResolvedValue(['package.json']); platform.findPr.mockResolvedValue(null); platform.getBranchPr.mockResolvedValueOnce(mock<Pr>()); + rebase.rebaseOnboardingBranch.mockResolvedValueOnce('abc123'); const res = await checkOnboardingBranch(config); expect(res.repoIsOnboarded).toBe(false); expect(res.branchList).toEqual(['renovate/configure']);