UNPKG

renovate

Version:

Automated dependency updates. Flexible so you don't need to be.

181 lines (178 loc) • 8.65 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ensureOnboardingPr = ensureOnboardingPr; const tslib_1 = require("tslib"); const is_1 = tslib_1.__importDefault(require("@sindresorhus/is")); const global_1 = require("../../../../config/global"); const logger_1 = require("../../../../logger"); const platform_1 = require("../../../../modules/platform"); const comment_1 = require("../../../../modules/platform/comment"); const pr_body_1 = require("../../../../modules/platform/pr-body"); const scm_1 = require("../../../../modules/platform/scm"); const emoji_1 = require("../../../../util/emoji"); const git_1 = require("../../../../util/git"); const hash_1 = require("../../../../util/hash"); const template = tslib_1.__importStar(require("../../../../util/template")); const errors_warnings_1 = require("../../errors-warnings"); const pr_1 = require("../../update/pr"); const labels_1 = require("../../update/pr/labels"); const participants_1 = require("../../update/pr/participants"); const onboarding_branch_cache_1 = require("../branch/onboarding-branch-cache"); const common_1 = require("../common"); const base_branch_1 = require("./base-branch"); const config_description_1 = require("./config-description"); const pr_list_1 = require("./pr-list"); async function ensureOnboardingPr(config, packageFiles, branches) { if (config.repoIsOnboarded === true || common_1.OnboardingState.onboardingCacheValid || (config.onboardingRebaseCheckbox && !common_1.OnboardingState.prUpdateRequested)) { return; } logger_1.logger.debug('ensureOnboardingPr()'); logger_1.logger.trace({ config }); // TODO #22198 const existingPr = await platform_1.platform.getBranchPr(config.onboardingBranch, config.defaultBranch); if (existingPr) { // skip pr-update if branch is conflicted if (await (0, onboarding_branch_cache_1.isOnboardingBranchConflicted)(config.defaultBranch, config.onboardingBranch)) { if (global_1.GlobalConfig.get('dryRun')) { logger_1.logger.info('DRY-RUN: Would comment that Onboarding PR is conflicted and needs manual resolving'); return; } await (0, comment_1.ensureComment)({ number: existingPr.number, topic: 'Branch Conflicted', content: (0, emoji_1.emojify)(`:warning: This PR has a merge conflict which Renovate is unable to automatically resolve, so updates to this PR description are now paused. Please resolve the merge conflict manually.\n\n`), }); return; } } const onboardingConfigHashComment = await getOnboardingConfigHashComment(config); const rebaseCheckBox = getRebaseCheckbox(config.onboardingRebaseCheckbox); logger_1.logger.debug('Filling in onboarding PR template'); let prTemplate = `Welcome to [Renovate](${config.productLinks.homepage})! This is an onboarding PR to help you understand and configure settings before regular Pull Requests begin.\n\n`; prTemplate += config.requireConfig === 'required' ? (0, emoji_1.emojify)(`:vertical_traffic_light: To activate Renovate, merge this Pull Request. To disable Renovate, simply close this Pull Request unmerged.\n\n`) : (0, emoji_1.emojify)(`:vertical_traffic_light: Renovate will begin keeping your dependencies up-to-date only once you merge or close this Pull Request.\n\n`); // TODO #22198 prTemplate += (0, emoji_1.emojify)(` --- {{PACKAGE FILES}} {{CONFIG}} {{BASEBRANCH}} {{PRLIST}} {{WARNINGS}} {{ERRORS}} --- :question: Got questions? Check out Renovate's [Docs](${config.productLinks.documentation}), particularly the Getting Started section. If you need any further assistance then you can also [request help here](${config.productLinks.help}). `); prTemplate += rebaseCheckBox; let prBody = prTemplate; if (packageFiles && Object.entries(packageFiles).length) { let files = []; for (const [manager, managerFiles] of Object.entries(packageFiles)) { files = files.concat(managerFiles.map((file) => ` * \`${file.packageFile}\` (${manager})`)); } prBody = prBody.replace('{{PACKAGE FILES}}', '### Detected Package Files\n\n' + files.join('\n')) + '\n'; } else { prBody = prBody.replace('{{PACKAGE FILES}}\n', ''); } let configDesc = ''; if (global_1.GlobalConfig.get('dryRun')) { // TODO: types (#22198) logger_1.logger.info(`DRY-RUN: Would check branch ${config.onboardingBranch}`); } else { configDesc = (0, config_description_1.getConfigDesc)(config, packageFiles); } prBody = prBody.replace('{{CONFIG}}\n', configDesc); prBody = prBody.replace('{{WARNINGS}}\n', (0, errors_warnings_1.getWarnings)(config) + (0, errors_warnings_1.getDepWarningsOnboardingPR)(packageFiles, config)); prBody = prBody.replace('{{ERRORS}}\n', (0, errors_warnings_1.getErrors)(config)); prBody = prBody.replace('{{BASEBRANCH}}\n', (0, base_branch_1.getBaseBranchDesc)(config)); prBody = prBody.replace('{{PRLIST}}\n', (0, pr_list_1.getExpectedPrList)(config, branches)); if (is_1.default.string(config.prHeader)) { prBody = `${template.compile(config.prHeader, config)}\n\n${prBody}`; } if (is_1.default.string(config.prFooter)) { prBody = `${prBody}\n---\n\n${template.compile(config.prFooter, config)}\n`; } prBody += onboardingConfigHashComment; logger_1.logger.trace('prBody:\n' + prBody); prBody = platform_1.platform.massageMarkdown(prBody); if (existingPr) { logger_1.logger.debug('Found open onboarding PR'); // Check if existing PR needs updating const prBodyHash = (0, pr_body_1.hashBody)(prBody); if (existingPr.bodyStruct?.hash === prBodyHash) { logger_1.logger.debug(`Pull Request #${existingPr.number} does not need updating`); return; } // PR must need updating if (global_1.GlobalConfig.get('dryRun')) { logger_1.logger.info('DRY-RUN: Would update onboarding PR'); } else { await platform_1.platform.updatePr({ number: existingPr.number, prTitle: existingPr.title, prBody, }); logger_1.logger.info({ pr: existingPr.number }, 'Onboarding PR updated'); } return; } logger_1.logger.debug('Creating onboarding PR'); const labels = (0, labels_1.prepareLabels)(config); try { if (global_1.GlobalConfig.get('dryRun')) { logger_1.logger.info('DRY-RUN: Would create onboarding PR'); } else { // TODO #22198 const prTitle = config.semanticCommits === 'enabled' ? (0, common_1.getSemanticCommitPrTitle)(config) : config.onboardingPrTitle; const pr = await platform_1.platform.createPr({ sourceBranch: config.onboardingBranch, targetBranch: config.defaultBranch, prTitle, prBody, labels, platformPrOptions: (0, pr_1.getPlatformPrOptions)({ ...config, automerge: false, }), }); logger_1.logger.info({ pr: `Pull Request #${pr.number}` }, 'Onboarding PR created'); await (0, participants_1.addParticipants)(config, pr); } } catch (err) { if (err.response?.statusCode === 422 && err.response?.body?.errors?.[0]?.message?.startsWith('A pull request already exists')) { logger_1.logger.warn('Onboarding PR already exists but cannot find it. It was probably created by a different user.'); await scm_1.scm.deleteBranch(config.onboardingBranch); return; } throw err; } } function getRebaseCheckbox(onboardingRebaseCheckbox) { let rebaseCheckBox = ''; if (onboardingRebaseCheckbox) { // Create markdown checkbox rebaseCheckBox = `\n\n---\n\n - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, click this checkbox.\n`; } return rebaseCheckBox; } async function getOnboardingConfigHashComment(config) { const configFile = (0, common_1.defaultConfigFile)(config); const existingContents = (await (0, git_1.getFile)(configFile, config.onboardingBranch)) ?? ''; const hash = (0, hash_1.toSha256)(existingContents); return `\n<!--renovate-config-hash:${hash}-->\n`; } //# sourceMappingURL=index.js.map