diff --git a/lib/config/types.ts b/lib/config/types.ts index ef944bece28cb8e3bb76ac42cc27a64dd3b9cf6d..a5dfa89ff5aaaf24920c2d3c68649ec1543547dc 100644 --- a/lib/config/types.ts +++ b/lib/config/types.ts @@ -213,6 +213,7 @@ export interface RenovateConfig registryUrls?: string[]; repoIsOnboarded?: boolean; + repoIsActivated?: boolean; updateType?: UpdateType; diff --git a/lib/workers/repository/finalise/__fixtures__/pr-list.json b/lib/workers/repository/finalise/__fixtures__/pr-list.json new file mode 100644 index 0000000000000000000000000000000000000000..3dc5601d3dca4c62cc28aa610f34128129e57005 --- /dev/null +++ b/lib/workers/repository/finalise/__fixtures__/pr-list.json @@ -0,0 +1,7 @@ +{ + "1": {"title": "Configure Renovate", "state": "open"}, + "2": {"title": "Update dependency debian to v12 - autoclosed", "state": "closed"}, + "3": {"title": "Update dependency debian to v11", "state": "open"}, + "4": {"title": "Update dependency ubuntu to v22", "state": "merged"}, + "5": {"title": "Update dependency ubuntu to v20", "state": "update"} +} diff --git a/lib/workers/repository/finalise/index.ts b/lib/workers/repository/finalise/index.ts index bb920e96273cc759c59073aef27ec03b746e6a26..419a3a5cda917da1e61858d6fc6a70dee2ecfcce 100644 --- a/lib/workers/repository/finalise/index.ts +++ b/lib/workers/repository/finalise/index.ts @@ -1,8 +1,10 @@ import type { RenovateConfig } from '../../../config/types'; +import { logger } from '../../../logger'; import { platform } from '../../../modules/platform'; import * as repositoryCache from '../../../util/cache/repository'; import { clearRenovateRefs } from '../../../util/git'; import { pruneStaleBranches } from './prune'; +import { runRenovateRepoStats } from './repository-statistics'; // istanbul ignore next export async function finaliseRepo( @@ -15,4 +17,17 @@ export async function finaliseRepo( `Action Required: Fix Renovate Configuration` ); await clearRenovateRefs(); + const prList = await platform.getPrList(); + if ( + prList?.some( + (pr) => + pr.state === 'merged' && + pr.title !== 'Configure Renovate' && + pr.title !== config.onboardingPrTitle + ) + ) { + logger.debug('Repo is activated'); + config.repoIsActivated = true; + } + runRenovateRepoStats(config, prList); } diff --git a/lib/workers/repository/finalise/repository-statistics.spec.ts b/lib/workers/repository/finalise/repository-statistics.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..46c12cf42ccce1fb8806c9368b52288008bcc442 --- /dev/null +++ b/lib/workers/repository/finalise/repository-statistics.spec.ts @@ -0,0 +1,46 @@ +import { Fixtures } from '../../../../test/fixtures'; +import { + RenovateConfig, + getConfig, + mockedFunction, +} from '../../../../test/util'; +import { logger } from '../../../logger'; +import { platform } from '../../../modules/platform'; +import { runRenovateRepoStats } from './repository-statistics'; + +jest.mock('../../../modules/platform/github/pr'); +jest.mock('../../../util/http/github'); + +const prJson = Fixtures.get('./pr-list.json'); +const prObject = JSON.parse(prJson); +const result = Object.keys(prObject).map((key) => { + return prObject[key]; +}); + +describe('workers/repository/finalise/repository-statistics', () => { + let config: RenovateConfig; + + describe('runRenovateRepoStats', () => { + beforeEach(() => { + jest.resetAllMocks(); + config = getConfig(); + mockedFunction(platform.getPrList).mockReturnValue(prObject); + config.repository = 'owner/repo'; + }); + + it('Calls runRenovateRepoStats', () => { + runRenovateRepoStats(config, result); + expect(logger.debug).toHaveBeenCalledWith( + { + stats: { + total: 4, + open: 1, + closed: 1, + merged: 1, + }, + }, + `Renovate repository PR statistics` + ); + }); + }); +}); diff --git a/lib/workers/repository/finalise/repository-statistics.ts b/lib/workers/repository/finalise/repository-statistics.ts new file mode 100644 index 0000000000000000000000000000000000000000..90277b5e52936909c22d73a6207da7b580d12c70 --- /dev/null +++ b/lib/workers/repository/finalise/repository-statistics.ts @@ -0,0 +1,35 @@ +import type { RenovateConfig } from '../../../config/types'; +import { logger } from '../../../logger'; +import type { Pr } from '../../../modules/platform'; +import { PrState } from '../../../types'; + +export function runRenovateRepoStats( + config: RenovateConfig, + prList: Pr[] +): void { + const prStats = { total: 0, open: 0, closed: 0, merged: 0 }; + + for (const pr of prList) { + if ( + pr.title === 'Configure Renovate' || + pr.title === config.onboardingPrTitle + ) { + continue; + } + prStats.total += 1; + switch (pr.state) { + case PrState.Merged: + prStats.merged += 1; + break; + case PrState.Closed: + prStats.closed += 1; + break; + case PrState.Open: + prStats.open += 1; + break; + default: + break; + } + } + logger.debug({ stats: prStats }, `Renovate repository PR statistics`); +} diff --git a/lib/workers/repository/result.ts b/lib/workers/repository/result.ts index 29faa3b54576cc266f3cd748941b82ffc3933ef2..2e2318878fb6b867e952e23a1086326ba152862d 100644 --- a/lib/workers/repository/result.ts +++ b/lib/workers/repository/result.ts @@ -1,4 +1,5 @@ import type { RenovateConfig } from '../../config/types'; + import { CONFIG_SECRETS_EXPOSED, CONFIG_VALIDATION, @@ -19,7 +20,13 @@ import { } from '../../constants/error-messages'; import { logger } from '../../logger'; -type ProcessStatus = 'disabled' | 'enabled' | 'onboarding' | 'unknown'; +export type ProcessStatus = + | 'disabled' + | 'onboarded' + | 'activated' + | 'onboarding' + | 'unknown'; + export interface ProcessResult { res: string; status: ProcessStatus; @@ -55,8 +62,12 @@ export function processResult( if (disabledStatuses.includes(res)) { status = 'disabled'; enabled = false; + } else if (config.repoIsActivated) { + status = 'activated'; + enabled = true; + onboarded = true; } else if (enabledStatuses.includes(res) || config.repoIsOnboarded) { - status = 'enabled'; + status = 'onboarded'; enabled = true; onboarded = true; } else if (config.repoIsOnboarded === false) { @@ -67,5 +78,8 @@ export function processResult( logger.debug({ res }, 'Unknown res'); status = 'unknown'; } - return { res, status, enabled, onboarded }; + logger.debug( + `Repository result: ${res}, status: ${status}, enabled: ${enabled}, onboarded: ${onboarded}` + ); + return { res, status, enabled: enabled, onboarded }; }