merge-release.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #!/usr/bin/env node
  2. require('colors')
  3. const assert = require('assert')
  4. const branchToRelease = process.argv[2]
  5. const fail = '\u2717'.red
  6. const { GitProcess, GitError } = require('dugite')
  7. const pass = '\u2713'.green
  8. const path = require('path')
  9. const pkg = require('../package.json')
  10. assert(process.env.ELECTRON_GITHUB_TOKEN, 'ELECTRON_GITHUB_TOKEN not found in environment')
  11. if (!branchToRelease) {
  12. console.log(`Usage: merge-release branch`)
  13. process.exit(1)
  14. }
  15. const gitDir = path.resolve(__dirname, '..')
  16. async function callGit (args, errorMessage, successMessage) {
  17. let gitResult = await GitProcess.exec(args, gitDir)
  18. if (gitResult.exitCode === 0) {
  19. console.log(`${pass} ${successMessage}`)
  20. return true
  21. } else {
  22. console.log(`${fail} ${errorMessage} ${gitResult.stderr}`)
  23. process.exit(1)
  24. }
  25. }
  26. async function checkoutBranch (branchName) {
  27. console.log(`Checking out ${branchName}.`)
  28. let errorMessage = `Error checking out branch ${branchName}:`
  29. let successMessage = `Successfully checked out branch ${branchName}.`
  30. return callGit(['checkout', branchName], errorMessage, successMessage)
  31. }
  32. async function commitMerge () {
  33. console.log(`Committing the merge for v${pkg.version}`)
  34. let errorMessage = `Error committing merge:`
  35. let successMessage = `Successfully committed the merge for v${pkg.version}`
  36. let gitArgs = ['commit', '-m', `v${pkg.version}`]
  37. return callGit(gitArgs, errorMessage, successMessage)
  38. }
  39. async function mergeReleaseIntoBranch (branchName) {
  40. console.log(`Merging release branch into ${branchName}.`)
  41. let mergeArgs = ['merge', 'release-1-6-x', '--squash']
  42. let mergeDetails = await GitProcess.exec(mergeArgs, gitDir)
  43. if (mergeDetails.exitCode === 0) {
  44. return true
  45. } else {
  46. const error = GitProcess.parseError(mergeDetails.stderr)
  47. if (error === GitError.MergeConflicts) {
  48. console.log(`${fail} Could not merge release branch into ${branchName} ` +
  49. `due to merge conflicts.`)
  50. return false
  51. } else {
  52. console.log(`${fail} Could not merge release branch into ${branchName} ` +
  53. `due to an error: ${mergeDetails.stderr}.`)
  54. process.exit(1)
  55. }
  56. }
  57. }
  58. async function pushBranch (branchName) {
  59. console.log(`Pushing branch ${branchName}.`)
  60. let pushArgs = ['push', 'origin', branchName]
  61. let errorMessage = `Could not push branch ${branchName} due to an error:`
  62. let successMessage = `Successfully pushed branch ${branchName}.`
  63. return callGit(pushArgs, errorMessage, successMessage)
  64. }
  65. async function pull () {
  66. console.log(`Performing a git pull`)
  67. let errorMessage = `Could not pull due to an error:`
  68. let successMessage = `Successfully performed a git pull`
  69. return callGit(['pull'], errorMessage, successMessage)
  70. }
  71. async function rebase (targetBranch) {
  72. console.log(`Rebasing release branch from ${targetBranch}`)
  73. let errorMessage = `Could not rebase due to an error:`
  74. let successMessage = `Successfully rebased release branch from ` +
  75. `${targetBranch}`
  76. return callGit(['rebase', targetBranch], errorMessage, successMessage)
  77. }
  78. async function mergeRelease () {
  79. await checkoutBranch(branchToRelease)
  80. let mergeSuccess = await mergeReleaseIntoBranch(branchToRelease)
  81. if (mergeSuccess) {
  82. console.log(`${pass} Successfully merged release branch into ` +
  83. `${branchToRelease}.`)
  84. await commitMerge()
  85. let pushSuccess = await pushBranch(branchToRelease)
  86. if (pushSuccess) {
  87. console.log(`${pass} Success!!! ${branchToRelease} now has the latest release!`)
  88. }
  89. } else {
  90. console.log(`Trying rebase of ${branchToRelease} into release branch.`)
  91. await pull()
  92. await checkoutBranch('release-1-6-x')
  93. let rebaseResult = await rebase(branchToRelease)
  94. if (rebaseResult) {
  95. let pushResult = pushBranch('HEAD')
  96. if (pushResult) {
  97. console.log(`Rebase of ${branchToRelease} into release branch was ` +
  98. `successful. Let release builds run and then try this step again.`)
  99. }
  100. // Exit as failure so release doesn't continue
  101. process.exit(1)
  102. }
  103. }
  104. }
  105. mergeRelease()