Spaces:
Running
Running
/* | |
* Licensed to the Apache Software Foundation (ASF) under one | |
* or more contributor license agreements. See the NOTICE file | |
* distributed with this work for additional information | |
* regarding copyright ownership. The ASF licenses this file | |
* to you under the Apache License, Version 2.0 (the | |
* "License"); you may not use this file except in compliance | |
* with the License. You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, | |
* software distributed under the License is distributed on an | |
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
* KIND, either express or implied. See the License for the | |
* specific language governing permissions and limitations | |
* under the License. | |
*/ | |
// Prepare release materials like mail, release note | |
const commander = require('commander'); | |
const fse = require('fs-extra'); | |
const pathTool = require('path'); | |
const https = require('https'); | |
commander | |
.usage('[options]') | |
.description([ | |
'Generate source release' | |
].join('\n')) | |
.option( | |
'--rcversion <version>', | |
'Release version' | |
) | |
.option( | |
'--commit <commit>', | |
'Hash of commit' | |
) | |
.option( | |
'--repo <repo>', | |
'Repo' | |
) | |
.option( | |
'--out <out>', | |
'Out directory. Default to be tmp/release-mail' | |
) | |
.parse(process.argv); | |
const outDir = pathTool.resolve(process.cwd(), commander.out || 'tmp/release-materials'); | |
const releaseCommit = commander.commit; | |
if (!releaseCommit) { | |
throw new Error('Release commit is required'); | |
} | |
const repo = commander.repo || 'apache/echarts'; | |
let rcVersion = commander.rcversion + ''; | |
if (rcVersion.startsWith('v')) { // tag may have v prefix, v5.1.0 | |
rcVersion = rcVersion.substr(1); | |
} | |
if (rcVersion.indexOf('-rc.') < 0) { | |
throw new Error('Only rc version is accepeted.'); | |
} | |
const parts = /(\d+)\.(\d+)\.(\d+)\-rc\.(\d+)/.exec(rcVersion); | |
if (!parts) { | |
throw new Error(`Invalid version number ${rcVersion}`); | |
} | |
const major = +parts[1]; | |
const minor = +parts[2]; | |
const patch = +parts[3]; | |
const rc = +parts[4]; | |
const stableVersion = `${major}.${minor}.${patch}`; | |
const releaseFullName = `Apache ECharts ${stableVersion} (release candidate ${rc})`; | |
console.log('[Release Repo] ' + repo); | |
console.log('[Release Verion] ' + rcVersion); | |
console.log('[Release Commit] ' + releaseCommit); | |
console.log('[Release Name] ' + releaseFullName); | |
const voteTpl = fse.readFileSync(pathTool.join(__dirname, './template/vote-release.tpl'), 'utf-8'); | |
const voteResultTpl = fse.readFileSync(pathTool.join(__dirname, './template/vote-result.tpl'), 'utf-8'); | |
const announceTpl = fse.readFileSync(pathTool.join(__dirname, './template/announce-release.tpl'), 'utf-8'); | |
const voteUntil = new Date(+new Date() + (72 + 12) * 3600 * 1000); // 3.5 day. | |
fse.ensureDirSync(outDir); | |
fse.writeFileSync( | |
pathTool.resolve(outDir, 'vote.txt'), | |
voteTpl.replace(/{{ECHARTS_RELEASE_VERSION}}/g, rcVersion) | |
.replace(/{{ECHARTS_RELEASE_VERSION_FULL_NAME}}/g, releaseFullName) | |
.replace(/{{ECHARTS_RELEASE_COMMIT}}/g, releaseCommit) | |
.replace(/{{VOTE_UNTIL}}/g, voteUntil.toISOString()), | |
'utf-8' | |
); | |
fse.ensureDirSync(outDir); | |
fse.writeFileSync( | |
pathTool.resolve(outDir, 'vote-result.txt'), | |
voteResultTpl.replace(/{{ECHARTS_RELEASE_VERSION}}/g, rcVersion) | |
.replace(/{{ECHARTS_RELEASE_VERSION_FULL_NAME}}/g, releaseFullName), | |
'utf-8' | |
); | |
fse.writeFileSync( | |
pathTool.resolve(outDir, 'announce.txt'), | |
announceTpl.replace(/{{ECHARTS_RELEASE_VERSION}}/g, stableVersion) | |
.replace(/{{ECHARTS_RELEASE_COMMIT}}/g, releaseCommit), | |
'utf-8' | |
); | |
// Fetch RELEASE_NOTE | |
https.get({ | |
hostname: 'api.github.com', | |
path: `/repos/${repo}/releases`, | |
headers: { | |
'User-Agent': 'NodeJS' | |
} | |
}, function (res) { | |
console.log(`https://api.github.com/repos/${repo}/releases`); | |
if (res.statusCode !== 200) { | |
console.error(`Failed to fetch releases ${res.statusCode}`); | |
res.resume(); | |
return; | |
} | |
res.setEncoding('utf8'); | |
let rawData = ''; | |
res.on('data', (chunk) => { | |
rawData += chunk; | |
}); | |
res.on('end', () => { | |
let releaseNote = ''; | |
const releases = JSON.parse(rawData); | |
const found = releases.find(release => release.name === rcVersion); | |
if (!found) { | |
throw 'Can\'t found release'; | |
} | |
else { | |
releaseNote = found.body.trim(); | |
if (!releaseNote) { | |
throw 'Release description is empty'; | |
} | |
} | |
const firstLine = releaseNote.split('\n')[0]; | |
if (firstLine.indexOf(stableVersion) < 0) { | |
// Add version if release note is not start with version. | |
} | |
releaseNote = `## ${stableVersion}\n\n${releaseNote}`; | |
fse.writeFileSync( | |
pathTool.resolve(outDir, 'RELEASE_NOTE.txt'), | |
releaseNote, | |
'utf-8' | |
); | |
}); | |
}).on('error', (e) => { | |
throw e; | |
}); |