update bump.js (#6774)

Signed-off-by: Alexander Onnikov <Alexander.Onnikov@xored.com>
This commit is contained in:
Alexander Onnikov 2024-10-01 18:03:26 +07:00 committed by GitHub
parent 4c8580c3ae
commit 48c840f631
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -4,97 +4,46 @@ const repo = '@hcengineering'
const packages = {} const packages = {}
const pathes = {} const pathes = {}
const shouldPublishPackages = new Set()
const packageDependencies = {}
const bumpedPackages = new Set()
const jsons = {} const jsons = {}
const updatedPackages = new Set()
function fillPackages (config) { function fillPackages (config) {
for (const package of config.projects) { for (const package of config.projects) {
if (!package.name.startsWith(repo)) continue
packages[package.name] = { packages[package.name] = {
version: package.version, version: package.version,
path: package.path, path: package.path
shouldPublish: package.shouldPublish
}
if (package.shouldPublish) {
shouldPublishPackages.add(package.name)
} }
pathes[package.path] = package.name pathes[package.path] = package.name
const file = package.path + '/package.json'
const raw = fs.readFileSync(file)
jsons[package.name] = JSON.parse(raw)
} }
} }
function getChangedPackages (changedFiles) { function bumpPackage (name, newVersion) {
let changedPackages = [] const json = jsons[name]
for (const changedFile of changedFiles) {
const filePath = changedFile.split('/')
const changedFileRoot = `${filePath[0]}/${filePath[1]}`
const changedPackage = pathes[changedFileRoot]
if (changedPackage !== undefined && !changedPackages.includes(changedPackage)) {
changedPackages.push(changedPackage)
}
}
return changedPackages
}
function buildDependencyTree () { json.version = newVersion
for (const name in packages) { if (typeof json.dependencies === 'object') {
const package = packages[name] for (const [dependency] of Object.entries(json.dependencies)) {
const file = package.path + '/package.json' if (packages[dependency] !== undefined) {
const raw = fs.readFileSync(file) json.dependencies[dependency] = `^${newVersion}`
const json = JSON.parse(raw)
jsons[name] = json
const dependencies = json.dependencies
for (const dependency in dependencies) {
if (dependency.startsWith(repo)) {
const set = packageDependencies[dependency] ?? new Set()
set.add(name)
packageDependencies[dependency] = set
} }
} }
} }
} }
function getNewVersion (json) { function shouldPublish (name) {
const version = json.version.split('.') const json = jsons[name]
const patch = version[2] return json !== undefined && json.repository !== undefined
const newPatch = Number(patch) + 1
return `${version[0]}.${version[1]}.${newPatch}`
}
function isNeedBump (name) {
if (shouldPublishPackages.has(name)) return true
for (const dependency in packageDependencies[name] ?? []) {
const res = isNeedBump(dependency)
if (res) return true
}
return false
}
function bumpPackage (name, dependency, depVersion) {
let json = jsons[name]
if (!bumpedPackages.has(name) && isNeedBump(name)) {
const newVersion = getNewVersion(json)
json.version = newVersion
bumpedPackages.add(name)
updatedPackages.add(name)
}
if (dependency !== undefined && depVersion !== undefined) {
if (json.dependencies[dependency] !== `^${depVersion}`) {
json.dependencies[dependency] = `^${depVersion}`
updatedPackages.add(name)
}
}
if (bumpedPackages.has(name)) {
for (const dep of packageDependencies[name] ?? []) {
bumpPackage(dep, name, json.version)
}
}
} }
function publish (name) { function publish (name) {
const package = packages[name] const package = packages[name]
try { try {
console.log('publishing', name)
execSync(`cd ${package.path} && npm publish && cd ../..`, { encoding: 'utf-8' }) execSync(`cd ${package.path} && npm publish && cd ../..`, { encoding: 'utf-8' })
} catch (err) { } catch (err) {
console.log(err) console.log(err)
@ -104,39 +53,37 @@ function publish (name) {
function main () { function main () {
const args = process.argv const args = process.argv
const version = args[2]
if (version === undefined || version === '') {
console.log('usage: node bump.js <version>')
return
}
console.log('bump version ...', version)
const config = JSON.parse(execSync('rush list -p --json', { encoding: 'utf-8' })) const config = JSON.parse(execSync('rush list -p --json', { encoding: 'utf-8' }))
fillPackages(config) fillPackages(config)
buildDependencyTree()
let changedPackages = [] const packageNames = Object.keys(packages)
if (args[2] === '-p') { for (const packageName of packageNames) {
changedPackages = args[3].split(',').map((p) => `${repo}/${p}`) bumpPackage(packageName, version)
} else if (args[2] === '-all') {
changedPackages = Object.keys(packages)
} else {
const tag = execSync(`git describe --tags --abbrev=0`, { encoding: 'utf-8' })
const diff = execSync(`git diff ${tag} --name-only --diff-filter=ACMR | sed 's| |\\ |g\'`, { encoding: 'utf-8' })
const changedFiles = diff.split('\n')
changedPackages = getChangedPackages(changedFiles)
} }
for (const packageName of changedPackages) { for (const packageName of packageNames) {
bumpPackage(packageName)
}
for (const packageName of updatedPackages) {
const package = packages[packageName] const package = packages[packageName]
const file = package.path + '/package.json' const file = package.path + '/package.json'
const res = JSON.stringify(jsons[packageName], undefined, 2) const res = JSON.stringify(jsons[packageName], undefined, 2)
fs.writeFileSync(file, res + '\n') fs.writeFileSync(file, res + '\n')
} }
for (const packageName of bumpedPackages) { for (const packageName of packageNames) {
if (shouldPublishPackages.has(packageName)) { if (shouldPublish(packageName)) {
publish(packageName) publish(packageName)
} }
} }
console.log('... done')
} }
main () main ()