| /* | 
| * 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; | 
|   }); |