| 
									
										
										
										
											2018-12-06 11:00:10 -08:00
										 |  |  | #!/usr/bin/env node
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const { GitProcess } = require('dugite'); | 
					
						
							| 
									
										
										
										
											2021-06-02 12:53:23 -07:00
										 |  |  | const { promises: fs } = require('fs'); | 
					
						
							| 
									
										
										
										
											2018-12-06 11:00:10 -08:00
										 |  |  | const semver = require('semver'); | 
					
						
							|  |  |  | const path = require('path'); | 
					
						
							|  |  |  | const minimist = require('minimist'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-24 10:18:04 -07:00
										 |  |  | const { ELECTRON_DIR } = require('../lib/utils'); | 
					
						
							|  |  |  | const versionUtils = require('./version-utils'); | 
					
						
							| 
									
										
										
										
											2021-06-02 12:53:23 -07:00
										 |  |  | const supported = path.resolve(ELECTRON_DIR, 'docs', 'tutorial', 'support.md'); | 
					
						
							| 
									
										
										
										
											2019-06-24 10:18:04 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-02 12:53:23 -07:00
										 |  |  | const writeFile = fs.writeFile; | 
					
						
							|  |  |  | const readFile = fs.readFile; | 
					
						
							| 
									
										
										
										
											2018-12-06 11:00:10 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | function parseCommandLine () { | 
					
						
							|  |  |  |   let help; | 
					
						
							|  |  |  |   const opts = minimist(process.argv.slice(2), { | 
					
						
							| 
									
										
										
										
											2020-03-20 08:12:18 -07:00
										 |  |  |     string: ['bump', 'version'], | 
					
						
							|  |  |  |     boolean: ['dryRun', 'help'], | 
					
						
							|  |  |  |     alias: { version: ['v'] }, | 
					
						
							| 
									
										
										
										
											2018-12-06 11:00:10 -08:00
										 |  |  |     unknown: arg => { help = true; } | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   if (help || opts.help || !opts.bump) { | 
					
						
							|  |  |  |     console.log(`
 | 
					
						
							|  |  |  |       Bump release version number. Possible arguments:\n | 
					
						
							|  |  |  |         --bump=patch to increment patch version\n | 
					
						
							|  |  |  |         --version={version} to set version number directly\n | 
					
						
							|  |  |  |         --dryRun to print the next version without updating files | 
					
						
							|  |  |  |       Note that you can use both --bump and --stable  simultaneously.  | 
					
						
							|  |  |  |     `);
 | 
					
						
							|  |  |  |     process.exit(0); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return opts; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // run the script
 | 
					
						
							|  |  |  | async function main () { | 
					
						
							|  |  |  |   const opts = parseCommandLine(); | 
					
						
							| 
									
										
										
										
											2019-06-24 10:18:04 -07:00
										 |  |  |   const currentVersion = await versionUtils.getElectronVersion(); | 
					
						
							| 
									
										
										
										
											2018-12-06 11:00:10 -08:00
										 |  |  |   const version = await nextVersion(opts.bump, currentVersion); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const parsed = semver.parse(version); | 
					
						
							|  |  |  |   const components = { | 
					
						
							|  |  |  |     major: parsed.major, | 
					
						
							|  |  |  |     minor: parsed.minor, | 
					
						
							|  |  |  |     patch: parsed.patch, | 
					
						
							|  |  |  |     pre: parsed.prerelease | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // print would-be new version and exit early
 | 
					
						
							|  |  |  |   if (opts.dryRun) { | 
					
						
							|  |  |  |     console.log(`new version number would be: ${version}\n`); | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-02 12:53:23 -07:00
										 |  |  |   if (shouldUpdateSupported(opts.bump, currentVersion, version)) { | 
					
						
							|  |  |  |     await updateSupported(version, supported); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-06 11:00:10 -08:00
										 |  |  |   // update all version-related files
 | 
					
						
							|  |  |  |   await Promise.all([ | 
					
						
							|  |  |  |     updateVersion(version), | 
					
						
							|  |  |  |     updatePackageJSON(version), | 
					
						
							|  |  |  |     updateWinRC(components) | 
					
						
							|  |  |  |   ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // commit all updated version-related files
 | 
					
						
							|  |  |  |   await commitVersionBump(version); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   console.log(`Bumped to version: ${version}`); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-19 17:58:15 -07:00
										 |  |  | // get next version for release based on [nightly, alpha, beta, stable]
 | 
					
						
							| 
									
										
										
										
											2018-12-06 11:00:10 -08:00
										 |  |  | async function nextVersion (bumpType, version) { | 
					
						
							| 
									
										
										
										
											2021-07-19 17:58:15 -07:00
										 |  |  |   if ( | 
					
						
							|  |  |  |     versionUtils.isNightly(version) || | 
					
						
							|  |  |  |     versionUtils.isAlpha(version) || | 
					
						
							|  |  |  |     versionUtils.isBeta(version) | 
					
						
							|  |  |  |   ) { | 
					
						
							| 
									
										
										
										
											2018-12-06 11:00:10 -08:00
										 |  |  |     switch (bumpType) { | 
					
						
							|  |  |  |       case 'nightly': | 
					
						
							| 
									
										
										
										
											2019-06-24 10:18:04 -07:00
										 |  |  |         version = await versionUtils.nextNightly(version); | 
					
						
							| 
									
										
										
										
											2018-12-06 11:00:10 -08:00
										 |  |  |         break; | 
					
						
							| 
									
										
										
										
											2021-07-19 17:58:15 -07:00
										 |  |  |       case 'alpha': | 
					
						
							|  |  |  |         version = await versionUtils.nextAlpha(version); | 
					
						
							|  |  |  |         break; | 
					
						
							| 
									
										
										
										
											2018-12-06 11:00:10 -08:00
										 |  |  |       case 'beta': | 
					
						
							| 
									
										
										
										
											2019-06-24 10:18:04 -07:00
										 |  |  |         version = await versionUtils.nextBeta(version); | 
					
						
							| 
									
										
										
										
											2018-12-06 11:00:10 -08:00
										 |  |  |         break; | 
					
						
							|  |  |  |       case 'stable': | 
					
						
							|  |  |  |         version = semver.valid(semver.coerce(version)); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       default: | 
					
						
							|  |  |  |         throw new Error('Invalid bump type.'); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-06-24 10:18:04 -07:00
										 |  |  |   } else if (versionUtils.isStable(version)) { | 
					
						
							| 
									
										
										
										
											2018-12-06 11:00:10 -08:00
										 |  |  |     switch (bumpType) { | 
					
						
							|  |  |  |       case 'nightly': | 
					
						
							| 
									
										
										
										
											2019-06-24 10:18:04 -07:00
										 |  |  |         version = versionUtils.nextNightly(version); | 
					
						
							| 
									
										
										
										
											2018-12-06 11:00:10 -08:00
										 |  |  |         break; | 
					
						
							| 
									
										
										
										
											2021-07-19 17:58:15 -07:00
										 |  |  |       case 'alpha': | 
					
						
							|  |  |  |         throw new Error('Cannot bump to alpha from stable.'); | 
					
						
							| 
									
										
										
										
											2018-12-06 11:00:10 -08:00
										 |  |  |       case 'beta': | 
					
						
							|  |  |  |         throw new Error('Cannot bump to beta from stable.'); | 
					
						
							| 
									
										
										
										
											2019-10-23 14:07:10 -04:00
										 |  |  |       case 'minor': | 
					
						
							|  |  |  |         version = semver.inc(version, 'minor'); | 
					
						
							|  |  |  |         break; | 
					
						
							| 
									
										
										
										
											2018-12-06 11:00:10 -08:00
										 |  |  |       case 'stable': | 
					
						
							|  |  |  |         version = semver.inc(version, 'patch'); | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |       default: | 
					
						
							|  |  |  |         throw new Error('Invalid bump type.'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     throw new Error(`Invalid current version: ${version}`); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return version; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-02 12:53:23 -07:00
										 |  |  | function shouldUpdateSupported (bump, current, version) { | 
					
						
							|  |  |  |   return isMajorStable(bump, current) || isMajorNightly(version, current); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function isMajorStable (bump, currentVersion) { | 
					
						
							|  |  |  |   if (versionUtils.isBeta(currentVersion) && (bump === 'stable')) return true; | 
					
						
							|  |  |  |   return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function isMajorNightly (version, currentVersion) { | 
					
						
							|  |  |  |   const parsed = semver.parse(version); | 
					
						
							|  |  |  |   const current = semver.parse(currentVersion); | 
					
						
							|  |  |  |   if (versionUtils.isNightly(currentVersion) && (parsed.major > current.major)) return true; | 
					
						
							|  |  |  |   return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-06 11:00:10 -08:00
										 |  |  | // update VERSION file with latest release info
 | 
					
						
							|  |  |  | async function updateVersion (version) { | 
					
						
							| 
									
										
										
										
											2019-06-24 10:18:04 -07:00
										 |  |  |   const versionPath = path.resolve(ELECTRON_DIR, 'ELECTRON_VERSION'); | 
					
						
							| 
									
										
										
										
											2018-12-06 11:00:10 -08:00
										 |  |  |   await writeFile(versionPath, version, 'utf8'); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // update package metadata files with new version
 | 
					
						
							|  |  |  | async function updatePackageJSON (version) { | 
					
						
							| 
									
										
										
										
											2019-06-24 10:18:04 -07:00
										 |  |  |   const filePath = path.resolve(ELECTRON_DIR, 'package.json'); | 
					
						
							|  |  |  |   const file = require(filePath); | 
					
						
							|  |  |  |   file.version = version; | 
					
						
							|  |  |  |   await writeFile(filePath, JSON.stringify(file, null, 2)); | 
					
						
							| 
									
										
										
										
											2018-12-06 11:00:10 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // push bump commit to release branch
 | 
					
						
							|  |  |  | async function commitVersionBump (version) { | 
					
						
							|  |  |  |   const gitArgs = ['commit', '-a', '-m', `Bump v${version}`, '-n']; | 
					
						
							| 
									
										
										
										
											2019-06-24 10:18:04 -07:00
										 |  |  |   await GitProcess.exec(gitArgs, ELECTRON_DIR); | 
					
						
							| 
									
										
										
										
											2018-12-06 11:00:10 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-13 14:28:59 -07:00
										 |  |  | // updates electron.rc file with new semver values
 | 
					
						
							| 
									
										
										
										
											2018-12-06 11:00:10 -08:00
										 |  |  | async function updateWinRC (components) { | 
					
						
							| 
									
										
										
										
											2020-04-13 14:28:59 -07:00
										 |  |  |   const filePath = path.resolve(ELECTRON_DIR, 'shell', 'browser', 'resources', 'win', 'electron.rc'); | 
					
						
							| 
									
										
										
										
											2018-12-06 11:00:10 -08:00
										 |  |  |   const data = await readFile(filePath, 'utf8'); | 
					
						
							|  |  |  |   const arr = data.split('\n'); | 
					
						
							|  |  |  |   arr.forEach((line, idx) => { | 
					
						
							|  |  |  |     if (line.includes('FILEVERSION')) { | 
					
						
							| 
									
										
										
										
											2019-06-24 10:18:04 -07:00
										 |  |  |       arr[idx] = ` FILEVERSION ${versionUtils.makeVersion(components, ',', versionUtils.preType.PARTIAL)}`; | 
					
						
							|  |  |  |       arr[idx + 1] = ` PRODUCTVERSION ${versionUtils.makeVersion(components, ',', versionUtils.preType.PARTIAL)}`; | 
					
						
							| 
									
										
										
										
											2018-12-06 11:00:10 -08:00
										 |  |  |     } else if (line.includes('FileVersion')) { | 
					
						
							| 
									
										
										
										
											2019-06-24 10:18:04 -07:00
										 |  |  |       arr[idx] = `            VALUE "FileVersion", "${versionUtils.makeVersion(components, '.')}"`; | 
					
						
							|  |  |  |       arr[idx + 5] = `            VALUE "ProductVersion", "${versionUtils.makeVersion(components, '.')}"`; | 
					
						
							| 
									
										
										
										
											2018-12-06 11:00:10 -08:00
										 |  |  |     } | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   await writeFile(filePath, arr.join('\n')); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-02 12:53:23 -07:00
										 |  |  | // updates support.md file with new semver values (stable only)
 | 
					
						
							|  |  |  | async function updateSupported (version, filePath) { | 
					
						
							|  |  |  |   const v = parseInt(version); | 
					
						
							| 
									
										
										
										
											2021-10-26 22:26:17 -07:00
										 |  |  |   const newVersions = [`* ${v}.x.y`, `* ${v - 1}.x.y`, `* ${v - 2}.x.y`, `* ${v - 3}.x.y`]; | 
					
						
							| 
									
										
										
										
											2021-06-02 12:53:23 -07:00
										 |  |  |   const contents = await readFile(filePath, 'utf8'); | 
					
						
							|  |  |  |   const previousVersions = contents.split('\n').filter((elem) => { | 
					
						
							|  |  |  |     return (/[^\n]*\.x\.y[^\n]*/).test(elem); | 
					
						
							|  |  |  |   }, []); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const newContents = previousVersions.reduce((contents, current, i) => { | 
					
						
							|  |  |  |     return contents.replace(current, newVersions[i]); | 
					
						
							|  |  |  |   }, contents); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await writeFile(filePath, newContents, 'utf8'); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-06 11:00:10 -08:00
										 |  |  | if (process.mainModule === module) { | 
					
						
							|  |  |  |   main().catch((error) => { | 
					
						
							|  |  |  |     console.error(error); | 
					
						
							|  |  |  |     process.exit(1); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-02 12:53:23 -07:00
										 |  |  | module.exports = { nextVersion, shouldUpdateSupported, updateSupported }; |