version-utils.js 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. const path = require('path')
  2. const fs = require('fs')
  3. const semver = require('semver')
  4. const { getLastMajorForMaster } = require('../get-last-major-for-master')
  5. const { GitProcess } = require('dugite')
  6. const { promisify } = require('util')
  7. const readFile = promisify(fs.readFile)
  8. const gitDir = path.resolve(__dirname, '..', '..')
  9. const preType = {
  10. NONE: 'none',
  11. PARTIAL: 'partial',
  12. FULL: 'full'
  13. }
  14. const getCurrentDate = () => {
  15. const d = new Date()
  16. const dd = `${d.getDate()}`.padStart(2, '0')
  17. const mm = `${d.getMonth() + 1}`.padStart(2, '0')
  18. const yyyy = d.getFullYear()
  19. return `${yyyy}${mm}${dd}`
  20. }
  21. const isNightly = v => v.includes('nightly')
  22. const isBeta = v => v.includes('beta')
  23. const isStable = v => {
  24. const parsed = semver.parse(v)
  25. return !!(parsed && parsed.prerelease.length === 0)
  26. }
  27. const makeVersion = (components, delim, pre = preType.NONE) => {
  28. let version = [components.major, components.minor, components.patch].join(delim)
  29. if (pre === preType.PARTIAL) {
  30. version += `${delim}${components.pre[1] || 0}`
  31. } else if (pre === preType.FULL) {
  32. version += `-${components.pre[0]}${delim}${components.pre[1]}`
  33. }
  34. return version
  35. }
  36. async function nextBeta (v) {
  37. const next = semver.coerce(semver.clean(v))
  38. const tagBlob = await GitProcess.exec(['tag', '--list', '-l', `v${next}-beta.*`], gitDir)
  39. const tags = tagBlob.stdout.split('\n').filter(e => e !== '')
  40. tags.sort((t1, t2) => semver.gt(t1, t2))
  41. // increment the latest existing beta tag or start at beta.1 if it's a new beta line
  42. return tags.length === 0 ? `${next}-beta.1` : semver.inc(tags.pop(), 'prerelease')
  43. }
  44. async function getElectronVersion () {
  45. const versionPath = path.join(__dirname, '..', '..', 'ELECTRON_VERSION')
  46. const version = await readFile(versionPath, 'utf8')
  47. return version.trim()
  48. }
  49. async function nextNightly (v) {
  50. let next = semver.valid(semver.coerce(v))
  51. const pre = `nightly.${getCurrentDate()}`
  52. const branch = (await GitProcess.exec(['rev-parse', '--abbrev-ref', 'HEAD'], gitDir)).stdout.trim()
  53. if (branch === 'master') {
  54. next = semver.inc(await getLastMajorForMaster(), 'major')
  55. } else if (isStable(v)) {
  56. next = semver.inc(next, 'patch')
  57. }
  58. return `${next}-${pre}`
  59. }
  60. module.exports = {
  61. isStable,
  62. isBeta,
  63. isNightly,
  64. nextBeta,
  65. makeVersion,
  66. getElectronVersion,
  67. nextNightly,
  68. preType
  69. }