choose-semverness.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /* eslint-disable no-continue */
  2. import { createWriteStream, mkdirSync } from 'node:fs'
  3. import { spawnSync } from 'node:child_process'
  4. import { TARGET_BRANCH } from './config.js'
  5. function maxSemverness (a, b) {
  6. if (a === 'major' || b === 'major') return 'major'
  7. if (a === 'premajor' || b === 'premajor') return 'premajor'
  8. if (a === 'minor' || b === 'minor') return 'minor'
  9. if (a === 'preminor' || b === 'preminor') return 'preminor'
  10. if (a === 'prepatch' || b === 'prepatch') return 'prepatch'
  11. if (a === 'prepatch' || b === 'prerelease') return 'prerelease'
  12. return 'patch'
  13. }
  14. export default async function pickSemverness (
  15. spawnOptions,
  16. LAST_RELEASE_COMMIT,
  17. STABLE_BRANCH_MERGE_BASE_RANGE,
  18. releaseFileUrl,
  19. packagesList,
  20. ) {
  21. mkdirSync(new URL('.', releaseFileUrl), { recursive: true })
  22. const releaseFile = createWriteStream(releaseFileUrl)
  23. releaseFile.write('releases:\n')
  24. let uppySemverness
  25. for await (const workspaceInfo of packagesList) {
  26. const { location, name } = JSON.parse(workspaceInfo)
  27. if (!name.startsWith('@uppy/')) continue
  28. const { stdout } = spawnSync(
  29. 'git',
  30. [
  31. '--no-pager',
  32. 'log',
  33. '--format=- %s',
  34. `${LAST_RELEASE_COMMIT}..`,
  35. '--',
  36. location,
  37. ],
  38. spawnOptions,
  39. )
  40. if (stdout.length === 0) {
  41. // eslint-disable-next-line no-shadow
  42. const { stdout } = spawnSync(
  43. 'git',
  44. [
  45. '--no-pager',
  46. 'log',
  47. '--format=- %s',
  48. STABLE_BRANCH_MERGE_BASE_RANGE,
  49. '--',
  50. location,
  51. ],
  52. spawnOptions,
  53. )
  54. if (stdout.length === 0) {
  55. console.log(`No commits since last release for ${name}, skipping.`)
  56. } else {
  57. console.log(`Some commits have landed on the stable branch since last release for ${name}.`)
  58. releaseFile.write(` ${JSON.stringify(name)}: major\n`)
  59. uppySemverness = 'major'
  60. }
  61. continue
  62. }
  63. console.log('\n')
  64. console.log('-'.repeat(20))
  65. console.log(name)
  66. console.log(
  67. `\nHere are the commits that landed on ${name} since previous release:\n${stdout}\n`,
  68. )
  69. console.log(
  70. `Check the web UI at https://github.com/transloadit/uppy/tree/${TARGET_BRANCH}/${encodeURI(
  71. location,
  72. )}.`,
  73. )
  74. const response = { value: 'major' }
  75. if (!response.value) {
  76. console.log('Skipping.')
  77. continue
  78. }
  79. releaseFile.write(` ${JSON.stringify(name)}: ${response.value}\n`)
  80. uppySemverness = maxSemverness(uppySemverness, response.value)
  81. }
  82. if (uppySemverness == null) throw new Error('No package to release, aborting.')
  83. releaseFile.write(` "uppy": ${uppySemverness}\n`)
  84. releaseFile.close()
  85. }