version-utils.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. const path = require('path');
  2. const fs = require('fs');
  3. const semver = require('semver');
  4. const { GitProcess } = require('dugite');
  5. const { promisify } = require('util');
  6. const { ELECTRON_DIR } = require('../lib/utils');
  7. const readFile = promisify(fs.readFile);
  8. const preType = {
  9. NONE: 'none',
  10. PARTIAL: 'partial',
  11. FULL: 'full'
  12. };
  13. const getCurrentDate = () => {
  14. const d = new Date();
  15. const dd = `${d.getDate()}`.padStart(2, '0');
  16. const mm = `${d.getMonth() + 1}`.padStart(2, '0');
  17. const yyyy = d.getFullYear();
  18. return `${yyyy}${mm}${dd}`;
  19. };
  20. const isNightly = v => v.includes('nightly');
  21. const isAlpha = v => v.includes('alpha');
  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 nextAlpha (v) {
  37. const next = semver.coerce(semver.clean(v));
  38. const tagBlob = await GitProcess.exec(['tag', '--list', '-l', `v${next}-alpha.*`], ELECTRON_DIR);
  39. const tags = tagBlob.stdout.split('\n').filter(e => e !== '');
  40. tags.sort((t1, t2) => {
  41. const a = parseInt(t1.split('.').pop(), 10);
  42. const b = parseInt(t2.split('.').pop(), 10);
  43. return a - b;
  44. });
  45. // increment the latest existing alpha tag or start at alpha.1 if it's a new alpha line
  46. return tags.length === 0 ? `${next}-alpha.1` : semver.inc(tags.pop(), 'prerelease');
  47. }
  48. async function nextBeta (v) {
  49. const next = semver.coerce(semver.clean(v));
  50. const tagBlob = await GitProcess.exec(['tag', '--list', '-l', `v${next}-beta.*`], ELECTRON_DIR);
  51. const tags = tagBlob.stdout.split('\n').filter(e => e !== '');
  52. tags.sort((t1, t2) => {
  53. const a = parseInt(t1.split('.').pop(), 10);
  54. const b = parseInt(t2.split('.').pop(), 10);
  55. return a - b;
  56. });
  57. // increment the latest existing beta tag or start at beta.1 if it's a new beta line
  58. return tags.length === 0 ? `${next}-beta.1` : semver.inc(tags.pop(), 'prerelease');
  59. }
  60. async function getElectronVersion () {
  61. const versionPath = path.resolve(ELECTRON_DIR, 'ELECTRON_VERSION');
  62. const version = await readFile(versionPath, 'utf8');
  63. return version.trim();
  64. }
  65. async function nextNightly (v) {
  66. let next = semver.valid(semver.coerce(v));
  67. const pre = `nightly.${getCurrentDate()}`;
  68. const branch = (await GitProcess.exec(['rev-parse', '--abbrev-ref', 'HEAD'], ELECTRON_DIR)).stdout.trim();
  69. // TODO(main-migration): Simplify once main branch is renamed
  70. if (branch === 'master' || branch === 'main') {
  71. next = semver.inc(await getLastMajorForMain(), 'major');
  72. } else if (isStable(v)) {
  73. next = semver.inc(next, 'patch');
  74. }
  75. return `${next}-${pre}`;
  76. }
  77. async function getLastMajorForMain () {
  78. let branchNames;
  79. const result = await GitProcess.exec(['branch', '-a', '--remote', '--list', 'origin/[0-9]*-x-y'], ELECTRON_DIR);
  80. if (result.exitCode === 0) {
  81. branchNames = result.stdout.trim().split('\n');
  82. const filtered = branchNames.map(b => b.replace('origin/', ''));
  83. return getNextReleaseBranch(filtered);
  84. } else {
  85. throw new Error('Release branches could not be fetched.');
  86. }
  87. }
  88. function getNextReleaseBranch (branches) {
  89. const converted = branches.map(b => b.replace(/-/g, '.').replace('x', '0').replace('y', '0'));
  90. return converted.reduce((v1, v2) => semver.gt(v1, v2) ? v1 : v2);
  91. }
  92. module.exports = {
  93. isStable,
  94. isAlpha,
  95. isBeta,
  96. isNightly,
  97. nextAlpha,
  98. nextBeta,
  99. makeVersion,
  100. getElectronVersion,
  101. nextNightly,
  102. preType
  103. };