diff --git a/bin/config-validator.js b/bin/config-validator.js index 2b921495ae35d4de8b34c157c878968bb7130684..34c29735e41ca7fcec368b4dc39ae6213cb73ed6 100644 --- a/bin/config-validator.js +++ b/bin/config-validator.js @@ -4,6 +4,7 @@ const fs = require('fs-extra'); const { validateConfig } = require('../lib/config/validation'); const { massageConfig } = require('../lib/config/massage'); const { initLogger } = require('../lib/logger'); +const { configFileNames } = require('../lib/workers/repository/config'); initLogger(); @@ -28,12 +29,7 @@ async function validate(desc, config, isPreset = false) { } (async () => { - const renovateConfigFiles = [ - 'renovate.json', - '.renovaterc', - '.renovaterc.json', - ]; - for (const file of renovateConfigFiles) { + for (const file of configFileNames) { try { const rawContent = fs.readFileSync(file, 'utf8'); console.log(`Validating ${file}`); diff --git a/docs/configuration.md b/docs/configuration.md index de71d48a2f8e572319f3357c244eaab044c46504..9b524ac675d62e50ec9585ad84371af7451a3d1b 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -7,7 +7,7 @@ Configuration is supported via any or all of the below: - Configuration file - Environment - CLI -- `renovate.json`, `.renovaterc.json`, or `.renovaterc` in target repository +- `renovate.json`, `.github/renovate.json`, `.renovaterc.json`, or `.renovaterc` in target repository - `renovate` field of `package.json` in target repository The above are listed in reverse order of preference. i.e. `package.json` diff --git a/lib/platform/github/index.js b/lib/platform/github/index.js index 2ed7dd0c94c21a009b0856c3000530c379f4f623..83b29508164e001ffc3b8d20a25a6d04a656aac1 100644 --- a/lib/platform/github/index.js +++ b/lib/platform/github/index.js @@ -8,6 +8,10 @@ const hostRules = require('../../util/host-rules'); const Storage = require('./storage'); const GitStorage = require('../git/storage'); +const { configFileNames } = require('../../../lib/workers/repository/config'); + +const defaultConfigFile = configFileNames[0]; + let config = {}; module.exports = { @@ -156,8 +160,9 @@ async function initRepo({ try { const renovateConfig = JSON.parse( Buffer.from( - (await get(`repos/${config.repository}/contents/renovate.json`)) - .body.content, + (await get( + `repos/${config.repository}/contents/${defaultConfigFile}` + )).body.content, 'base64' ).toString() ); diff --git a/lib/workers/repository/config.js b/lib/workers/repository/config.js new file mode 100644 index 0000000000000000000000000000000000000000..0f4aeb4d40c9881fadf2cb86783d3128a8d78767 --- /dev/null +++ b/lib/workers/repository/config.js @@ -0,0 +1,11 @@ +const configFileNames = [ + 'renovate.json', + '.github/renovate.json', + '.renovaterc', + '.renovaterc.json', + 'package.json', +]; + +module.exports = { + configFileNames, +}; diff --git a/lib/workers/repository/finalise/validate.js b/lib/workers/repository/finalise/validate.js index 2ae1720b86ddaea122380fc4a28ed3a9bd426cdc..3995b3826a8fc2247049587e010bd0f0780e4419 100644 --- a/lib/workers/repository/finalise/validate.js +++ b/lib/workers/repository/finalise/validate.js @@ -1,4 +1,5 @@ const { migrateAndValidate } = require('../../../config/migrate-validate'); +const { configFileNames } = require('../config'); async function getRenovatePrs(branchPrefix) { return (await platform.getPrList()) @@ -8,12 +9,6 @@ async function getRenovatePrs(branchPrefix) { } async function getRenovateFiles(prNo) { - const configFileNames = [ - 'package.json', - 'renovate.json', - '.renovaterc', - '.renovaterc.json', - ]; return (await platform.getPrFiles(prNo)).filter(file => configFileNames.includes(file) ); diff --git a/lib/workers/repository/init/config.js b/lib/workers/repository/init/config.js index 4c83bc46005f4697dd387ad7c79518ace29c0081..68e1a094a3f80d3a21ce698f01cf6a718d3ebf0c 100644 --- a/lib/workers/repository/init/config.js +++ b/lib/workers/repository/init/config.js @@ -7,8 +7,11 @@ const presets = require('../../../config/presets'); const npmApi = require('../../../datasource/npm'); const { flattenPackageRules } = require('./flatten'); const hostRules = require('../../../util/host-rules'); +const { configFileNames } = require('../config'); -// Check for config in `renovate.json` +const defaultConfigFile = configFileNames[0]; + +// Check for repository config async function mergeRenovateConfig(config) { let returnConfig = { ...config }; // istanbul ignore if @@ -16,7 +19,7 @@ async function mergeRenovateConfig(config) { logger.info('Repository is in mirror mode'); const renovateJson = JSON.parse( await platform.getFile( - 'renovate.json', + defaultConfigFile, config.repoIsOnboarded ? 'renovate-config' : 'renovate/configure' ) ); @@ -28,26 +31,25 @@ async function mergeRenovateConfig(config) { return returnConfig; } const fileList = await platform.getFileList(); - let configFile; - if (fileList.includes('renovate.json')) { - configFile = 'renovate.json'; - } else if (fileList.includes('.github/renovate.json')) { - configFile = '.github/renovate.json'; - } else if (fileList.includes('.renovaterc')) { - configFile = '.renovaterc'; - } else if (fileList.includes('.renovaterc.json')) { - configFile = '.renovaterc.json'; - } else if (fileList.includes('package.json')) { - try { - const pJson = JSON.parse(await platform.getFile('package.json')); - if (pJson.renovate) { - logger.info('Using package.json for global renovate config'); - configFile = 'package.json'; + async function detectConfigFile() { + for (const fileName of configFileNames) { + if (fileName === 'package.json') { + try { + const pJson = JSON.parse(await platform.getFile('package.json')); + if (pJson.renovate) { + logger.info('Using package.json for global renovate config'); + return 'package.json'; + } + } catch (err) { + // Do nothing + } + } else if (fileList.includes(fileName)) { + return fileName; } - } catch (err) { - // Do nothing } + return null; } + const configFile = await detectConfigFile(); if (!configFile) { logger.debug('No renovate config file found'); return returnConfig; @@ -123,7 +125,7 @@ async function mergeRenovateConfig(config) { } delete migratedConfig.errors; delete migratedConfig.warnings; - logger.debug({ config: migratedConfig }, 'renovate.json migrated config'); + logger.debug({ config: migratedConfig }, 'migrated config'); // Decrypt before resolving in case we need npm authentication for any presets const decryptedConfig = decryptConfig(migratedConfig, config.privateKey); // istanbul ignore if diff --git a/lib/workers/repository/onboarding/branch/check.js b/lib/workers/repository/onboarding/branch/check.js index 2f13de83abb29189749b9cbc54b58d141537a993..d8cd7b8fd597c3033ac8b91339246fb366c730c4 100644 --- a/lib/workers/repository/onboarding/branch/check.js +++ b/lib/workers/repository/onboarding/branch/check.js @@ -1,14 +1,19 @@ +const { configFileNames } = require('../../config'); + const findFile = async fileName => { logger.debug(`findFile(${fileName})`); const fileList = await platform.getFileList(); return fileList.includes(fileName); }; -const renovateJsonExists = async () => - (await findFile('renovate.json')) || - (await findFile('.github/renovate.json')) || - (await findFile('.renovaterc')) || - findFile('.renovaterc.json'); +const configFileExists = async () => { + for (const fileName of configFileNames) { + if (fileName !== 'package.json' && (await findFile(fileName))) { + return true; + } + } + return false; +}; const packageJsonRenovateExists = async () => { try { @@ -31,13 +36,13 @@ const isOnboarded = async config => { if (config.onboarding === false) { return true; } - if (await renovateJsonExists()) { - logger.debug('renovate.json exists'); + if (await configFileExists()) { + logger.debug('config file exists'); return true; } - logger.debug('renovate.json not found'); + logger.debug('config file not found'); if (await packageJsonRenovateExists()) { - logger.debug('package.json contains renovate config'); + logger.debug('package.json contains config'); return true; } const pr = await closedPrExists(config); diff --git a/lib/workers/repository/onboarding/branch/create.js b/lib/workers/repository/onboarding/branch/create.js index e60fe8387aaa7972c521d267c368e107b5482b65..a10c071d7f2d99854bd29441c2f2cc5044012e91 100644 --- a/lib/workers/repository/onboarding/branch/create.js +++ b/lib/workers/repository/onboarding/branch/create.js @@ -1,4 +1,7 @@ const { getOnboardingConfig } = require('./config'); +const { configFileNames } = require('../../config'); + +const defaultConfigFile = configFileNames[0]; async function createOnboardingBranch(config) { logger.debug('createOnboardingBranch()'); @@ -12,9 +15,9 @@ async function createOnboardingBranch(config) { commitMessage += `(${config.semanticCommitScope})`; } commitMessage += ': '; - commitMessage += 'add renovate.json'; + commitMessage += 'add ' + defaultConfigFile; } else { - commitMessage = 'Add renovate.json'; + commitMessage = 'Add ' + defaultConfigFile; } // istanbul ignore if if (config.dryRun) { @@ -24,7 +27,7 @@ async function createOnboardingBranch(config) { `renovate/configure`, [ { - name: 'renovate.json', + name: defaultConfigFile, contents, }, ], diff --git a/lib/workers/repository/onboarding/branch/rebase.js b/lib/workers/repository/onboarding/branch/rebase.js index f8d6785faf82489bdb9c4e8296fe9c5e6a9e8298..6984275f685a2df9f3e737d8012db8dc47577dfe 100644 --- a/lib/workers/repository/onboarding/branch/rebase.js +++ b/lib/workers/repository/onboarding/branch/rebase.js @@ -1,4 +1,7 @@ const { getOnboardingConfig } = require('./config'); +const { configFileNames } = require('../../config'); + +const defaultConfigFile = configFileNames[0]; async function rebaseOnboardingBranch(config) { logger.debug('Checking if onboarding branch needs rebasing'); @@ -9,7 +12,7 @@ async function rebaseOnboardingBranch(config) { return; } const existingContents = await platform.getFile( - 'renovate.json', + defaultConfigFile, onboardingBranch ); const contents = await getOnboardingConfig(config); @@ -26,9 +29,9 @@ async function rebaseOnboardingBranch(config) { commitMessage += `(${config.semanticCommitScope})`; } commitMessage += ': '; - commitMessage += 'add renovate.json'; + commitMessage += 'add ' + defaultConfigFile; } else { - commitMessage = 'Add renovate.json'; + commitMessage = 'Add ' + defaultConfigFile; } // istanbul ignore if if (config.dryRun) { @@ -38,7 +41,7 @@ async function rebaseOnboardingBranch(config) { onboardingBranch, [ { - name: 'renovate.json', + name: defaultConfigFile, contents: existingContents || contents, }, ], diff --git a/lib/workers/repository/onboarding/pr/config-description.js b/lib/workers/repository/onboarding/pr/config-description.js index ab6779e3774989014ea1d6a8eee6bb9bcfb226fd..14806687735f72a5f16e15c3899c6bfa298826dd 100644 --- a/lib/workers/repository/onboarding/pr/config-description.js +++ b/lib/workers/repository/onboarding/pr/config-description.js @@ -1,3 +1,7 @@ +const { configFileNames } = require('../../config'); + +const defaultConfigFile = configFileNames[0]; + function getScheduleDesc(config) { logger.debug('getScheduleDesc()'); logger.trace({ config }); @@ -46,7 +50,7 @@ function getConfigDesc(config, packageFiles) { }); desc += '\n'; desc += `:abcd: Would you like to change the way Renovate is upgrading your dependencies?`; - desc += ` Simply edit the \`renovate.json\` in this branch with your custom config and the list of Pull Requests in the "What to Expect" section below will be updated the next time Renovate runs.`; + desc += ` Simply edit the \`${defaultConfigFile}\` in this branch with your custom config and the list of Pull Requests in the "What to Expect" section below will be updated the next time Renovate runs.`; desc += '\n\n---\n'; return desc; }