version-utils.ts 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import { GitProcess } from 'dugite';
  2. import * as semver from 'semver';
  3. import { ELECTRON_DIR } from '../lib/utils';
  4. export enum PreType {
  5. NONE = 'none',
  6. PARTIAL = ' partial',
  7. FULL = 'full',
  8. }
  9. const getCurrentDate = () => {
  10. const d = new Date();
  11. const dd = `${d.getDate()}`.padStart(2, '0');
  12. const mm = `${d.getMonth() + 1}`.padStart(2, '0');
  13. const yyyy = d.getFullYear();
  14. return `${yyyy}${mm}${dd}`;
  15. };
  16. export const isNightly = (v: string) => v.includes('nightly');
  17. export const isAlpha = (v: string) => v.includes('alpha');
  18. export const isBeta = (v: string) => v.includes('beta');
  19. export const isStable = (v: string) => {
  20. const parsed = semver.parse(v);
  21. return !!(parsed && parsed.prerelease.length === 0);
  22. };
  23. export async function nextAlpha (v: string) {
  24. const next = semver.coerce(semver.clean(v));
  25. const tagBlob = await GitProcess.exec(['tag', '--list', '-l', `v${next}-alpha.*`], ELECTRON_DIR);
  26. const tags = tagBlob.stdout.split('\n').filter(e => e !== '');
  27. tags.sort((t1, t2) => {
  28. const a = parseInt(t1.split('.').pop()!, 10);
  29. const b = parseInt(t2.split('.').pop()!, 10);
  30. return a - b;
  31. });
  32. // increment the latest existing alpha tag or start at alpha.1 if it's a new alpha line
  33. return tags.length === 0 ? `${next}-alpha.1` : semver.inc(tags.pop()!, 'prerelease')!;
  34. }
  35. export async function nextBeta (v: string) {
  36. const next = semver.coerce(semver.clean(v));
  37. const tagBlob = await GitProcess.exec(['tag', '--list', '-l', `v${next}-beta.*`], ELECTRON_DIR);
  38. const tags = tagBlob.stdout.split('\n').filter(e => e !== '');
  39. tags.sort((t1, t2) => {
  40. const a = parseInt(t1.split('.').pop()!, 10);
  41. const b = parseInt(t2.split('.').pop()!, 10);
  42. return a - b;
  43. });
  44. // increment the latest existing beta tag or start at beta.1 if it's a new beta line
  45. return tags.length === 0 ? `${next}-beta.1` : semver.inc(tags.pop()!, 'prerelease')!;
  46. }
  47. export async function nextNightly (v: string) {
  48. let next = semver.valid(semver.coerce(v));
  49. const pre = `nightly.${getCurrentDate()}`;
  50. const branch = (await GitProcess.exec(['rev-parse', '--abbrev-ref', 'HEAD'], ELECTRON_DIR)).stdout.trim();
  51. if (branch === 'main') {
  52. next = semver.inc(await getLastMajorForMain(), 'major');
  53. } else if (isStable(v)) {
  54. next = semver.inc(next!, 'patch');
  55. }
  56. return `${next}-${pre}`;
  57. }
  58. async function getLastMajorForMain () {
  59. let branchNames;
  60. const result = await GitProcess.exec(['branch', '-a', '--remote', '--list', 'origin/[0-9]*-x-y'], ELECTRON_DIR);
  61. if (result.exitCode === 0) {
  62. branchNames = result.stdout.trim().split('\n');
  63. const filtered = branchNames.map(b => b.replace('origin/', ''));
  64. return getNextReleaseBranch(filtered);
  65. } else {
  66. throw new Error('Release branches could not be fetched.');
  67. }
  68. }
  69. function getNextReleaseBranch (branches: string[]) {
  70. const converted = branches.map(b => b.replace(/-/g, '.').replace('x', '0').replace('y', '0'));
  71. return converted.reduce((v1, v2) => semver.gt(v1, v2) ? v1 : v2);
  72. }