114 lines
		
	
	
	
		
			3.4 KiB
			
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
	
		
			3.4 KiB
			
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable file
		
	
	
	
	
| #!/usr/bin/env node
 | |
| 
 | |
| if (!process.env.CI) require('dotenv-safe').load()
 | |
| const args = require('minimist')(process.argv.slice(2), {
 | |
|   string: ['tag', 'releaseID'],
 | |
|   default: { releaseID: '' }
 | |
| })
 | |
| const path = require('path')
 | |
| const { execSync } = require('child_process')
 | |
| const { GitProcess } = require('dugite')
 | |
| const { getCurrentBranch, ELECTRON_DIR } = require('../lib/utils.js')
 | |
| 
 | |
| const octokit = require('@octokit/rest')({
 | |
|   auth: process.env.ELECTRON_GITHUB_TOKEN
 | |
| })
 | |
| 
 | |
| require('colors')
 | |
| const pass = '✓'.green
 | |
| const fail = '✗'.red
 | |
| 
 | |
| function getLastBumpCommit (tag) {
 | |
|   const data = execSync(`git log -n1 --grep "Bump ${tag}" --format='format:{"hash": "%H", "message": "%s"}'`).toString()
 | |
|   return JSON.parse(data)
 | |
| }
 | |
| 
 | |
| async function revertBumpCommit (tag) {
 | |
|   const branch = await getCurrentBranch()
 | |
|   const commitToRevert = getLastBumpCommit(tag).hash
 | |
|   await GitProcess.exec(['revert', commitToRevert], ELECTRON_DIR)
 | |
|   const pushDetails = await GitProcess.exec(['push', 'origin', `HEAD:${branch}`, '--follow-tags'], ELECTRON_DIR)
 | |
|   if (pushDetails.exitCode === 0) {
 | |
|     console.log(`${pass} successfully reverted release commit.`)
 | |
|   } else {
 | |
|     const error = GitProcess.parseError(pushDetails.stderr)
 | |
|     console.error(`${fail} could not push release commit: `, error)
 | |
|     process.exit(1)
 | |
|   }
 | |
| }
 | |
| 
 | |
| async function deleteDraft (releaseId, targetRepo) {
 | |
|   try {
 | |
|     const result = await octokit.repos.getRelease({
 | |
|       owner: 'electron',
 | |
|       repo: targetRepo,
 | |
|       release_id: parseInt(releaseId, 10)
 | |
|     })
 | |
|     console.log(result)
 | |
|     if (!result.data.draft) {
 | |
|       console.log(`${fail} published releases cannot be deleted.`)
 | |
|       return false
 | |
|     } else {
 | |
|       await octokit.repos.deleteRelease({
 | |
|         owner: 'electron',
 | |
|         repo: targetRepo,
 | |
|         release_id: result.data.id
 | |
|       })
 | |
|     }
 | |
|     console.log(`${pass} successfully deleted draft with id ${releaseId} from ${targetRepo}`)
 | |
|     return true
 | |
|   } catch (err) {
 | |
|     console.error(`${fail} couldn't delete draft with id ${releaseId} from ${targetRepo}: `, err)
 | |
|     return false
 | |
|   }
 | |
| }
 | |
| 
 | |
| async function deleteTag (tag, targetRepo) {
 | |
|   try {
 | |
|     await octokit.git.deleteRef({
 | |
|       owner: 'electron',
 | |
|       repo: targetRepo,
 | |
|       ref: `tags/${tag}`
 | |
|     })
 | |
|     console.log(`${pass} successfully deleted tag ${tag} from ${targetRepo}`)
 | |
|   } catch (err) {
 | |
|     console.log(`${fail} couldn't delete tag ${tag} from ${targetRepo}: `, err)
 | |
|   }
 | |
| }
 | |
| 
 | |
| async function cleanReleaseArtifacts () {
 | |
|   const releaseId = args.releaseID.length > 0 ? args.releaseID : null
 | |
|   const isNightly = args.tag.includes('nightly')
 | |
| 
 | |
|   // try to revert commit regardless of tag and draft deletion status
 | |
|   await revertBumpCommit(args.tag)
 | |
| 
 | |
|   if (releaseId) {
 | |
|     if (isNightly) {
 | |
|       const deletedNightlyDraft = await deleteDraft(releaseId, 'nightlies')
 | |
| 
 | |
|       // don't delete tag unless draft deleted successfully
 | |
|       if (deletedNightlyDraft) {
 | |
|         await Promise.all([
 | |
|           deleteTag(args.tag, 'electron'),
 | |
|           deleteTag(args.tag, 'nightlies')
 | |
|         ])
 | |
|       }
 | |
|     } else {
 | |
|       const deletedElectronDraft = await deleteDraft(releaseId, 'electron')
 | |
|       // don't delete tag unless draft deleted successfully
 | |
|       if (deletedElectronDraft) {
 | |
|         await deleteTag(args.tag, 'electron')
 | |
|       }
 | |
|     }
 | |
|   } else {
 | |
|     await Promise.all([
 | |
|       deleteTag(args.tag, 'electron'),
 | |
|       deleteTag(args.tag, 'nightlies')
 | |
|     ])
 | |
|   }
 | |
| 
 | |
|   console.log(`${pass} failed release artifact cleanup complete`)
 | |
| }
 | |
| 
 | |
| cleanReleaseArtifacts()
 | 
