From a0ea0a226c5dad7beb361429d71a36e89a3ad116 Mon Sep 17 00:00:00 2001 From: Daniel Dyla Date: Wed, 28 Jul 2021 16:14:52 -0400 Subject: [PATCH 1/2] chore: add script to update core dependencies --- scripts/update-core-deps.js | 130 ++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 scripts/update-core-deps.js diff --git a/scripts/update-core-deps.js b/scripts/update-core-deps.js new file mode 100644 index 0000000000..6291b2a0e2 --- /dev/null +++ b/scripts/update-core-deps.js @@ -0,0 +1,130 @@ +/*! + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const path = require('path'); +const fs = require('fs'); +const child_process = require('child_process') + +/** + * Update all dependencies from the core repo to the @next tag versions + */ + +// Use process.env.CORE_REPOSITORY to point to core repository directory +// Defaults to ../opentelemetry-js +let coreDir = path.join(process.cwd(), '..', 'opentelemetry-js'); +if (process.env.CORE_REPOSITORY) { + coreDir = path.resolve(process.env.CORE_REPOSITORY); +} + +if (!fs.existsSync(path.join(coreDir, "lerna.json"))) { + console.error(`Missing lerna.json in ${coreDir}`); + console.error("Be sure you are setting $CORE_REPOSITORY to a valid lerna monorepo"); + process.exit(1); +} + +async function main() { + const corePackageList = await getCorePackages(); + const contribPackageLocations = await getContribPackageLocations(); + + for (const packageLocation of contribPackageLocations) { + let changed = false; + const package = require(packageLocation); + console.log('Processing', package.name); + + for (const type of ["dependencies", "devDependencies", "peerDependencies"]) { + changed = changed || updateDeps(package, type, corePackageList); + } + + if (changed) { + console.log('Package changed. Writing new version.'); + fs.writeFileSync(packageLocation, JSON.stringify(package, null, 2) + '\n'); + } else { + console.log('No change detected'); + } + + console.log(); + } +} + +function updateDeps(package, type, corePackageList) { + if (!package[type]) { + return false; + } + + console.log("\t", type) + let changed = false; + for (const corePackage of corePackageList) { + const oldCoreVersion = package[type][corePackage.name]; + if (oldCoreVersion) { + const newVersion = `${getVersionLeader(oldCoreVersion)}${corePackage.nextVersion}`; + console.log('\t\t', corePackage.name); + console.log('\t\t\t', oldCoreVersion, '=>', newVersion) + package[type][corePackage.name] = newVersion; + changed = true; + } + } + return changed; +} + +async function getContribPackageLocations() { + const gitContribPackageLocations = await exec('git ls-files'); + return gitContribPackageLocations + .split(/\r?\n/) + .filter(f => f.match(/package\.json$/)) + .map(f => path.resolve(f)); +} + +async function getCorePackages() { + const coreLernaList = await exec('lerna list --no-private --json', coreDir); + return Promise.all( + JSON.parse(coreLernaList) + .map(async p => { + const nextVersion = await exec(`npm view ${p.name}@next version`); + return { + ...p, + nextVersion: nextVersion.trim(), + }; + }) + ); +} + +function getVersionLeader(version) { + if (version.match(/^\d/)) { + return ''; + } + + return version[0]; +} + +async function exec(cmd, dir) { + return new Promise((resolve, reject) => { + child_process.exec(cmd, { + cwd: dir + }, function (err, stdout) { + if (err) { + reject(err); + } else { + resolve(stdout); + } + }); + }) +} + +main() + .catch((err) => { + console.error(err); + process.exit(1); + }); From ec6bb5fb4afd6d5ea481747453553297349aa89e Mon Sep 17 00:00:00 2001 From: Daniel Dyla Date: Thu, 29 Jul 2021 12:43:27 -0400 Subject: [PATCH 2/2] chore: add description to update core script --- scripts/update-core-deps.js | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/scripts/update-core-deps.js b/scripts/update-core-deps.js index 6291b2a0e2..45024afe59 100644 --- a/scripts/update-core-deps.js +++ b/scripts/update-core-deps.js @@ -14,14 +14,29 @@ * limitations under the License. */ -const path = require('path'); -const fs = require('fs'); -const child_process = require('child_process') - /** * Update all dependencies from the core repo to the @next tag versions + * + * To use the script, run it from the root of the contrib repository like this: + * `node scripts/update-core-deps.js` + * + * If your core repository is checked out in the same directory as your contrib + * repository with the default name, it will be found automatically. If not, + * you can point to the core repository with the environment variable + * CORE_REPOSITORY like this: + * `CORE_REPOSITORY=../../otel-core node scripts/update-core-deps.js + * + * Note that this only updates the versions in the package.json for each package + * and you will still need to run `lerna bootstrap` and make any necessary + * code changes. */ +"use strict"; + +const path = require('path'); +const fs = require('fs'); +const child_process = require('child_process') + // Use process.env.CORE_REPOSITORY to point to core repository directory // Defaults to ../opentelemetry-js let coreDir = path.join(process.cwd(), '..', 'opentelemetry-js');