1 | #!/usr/bin/env node
|
2 |
|
3 | const url = require('url');
|
4 | const assert = require('assert');
|
5 | const GitHub = require('github');
|
6 | const package = require('../../../package.json');
|
7 |
|
8 |
|
9 | const github = new GitHub();
|
10 | assert(process.env.GITHUB_OAUTH_TOKEN, 'GITHUB_OAUTH_TOKEN env variable should contain your personal access token');
|
11 | github.authenticate({ type: 'oauth', token: process.env.GITHUB_OAUTH_TOKEN });
|
12 |
|
13 | var repoUrl = package.repository.url || package.homepage;
|
14 | assert(repoUrl, 'Cannot detect repository name. Either `package.repository.url` or `package.homepage` should be set');
|
15 |
|
16 | var repositoryPath = url.parse(repoUrl).path.replace(/\.git$/, '');
|
17 | var repositoryParsed = repositoryPath.match(/\/(\S+)\/(\S+)/);
|
18 | const user = repositoryParsed[1];
|
19 | const repo = repositoryParsed[2];
|
20 |
|
21 |
|
22 | const checkErr = (err) => {
|
23 | if (err) {
|
24 | console.error(err.toJSON());
|
25 | process.exit(1);
|
26 | }
|
27 | };
|
28 |
|
29 | github.repos.getLatestRelease({ user, repo }, (err, latestRelease) => {
|
30 | if (err) {
|
31 | if (err.code === 404) {
|
32 | latestRelease = { name: 'unknown', created_at: new Date('1970-01-01') };
|
33 | } else {
|
34 | checkErr()
|
35 | }
|
36 | }
|
37 |
|
38 | console.log('Latest release: %s', latestRelease.name)
|
39 |
|
40 | github.pullRequests.getAll({ user, repo, state: 'closed', sort: 'updated', direction: 'desc' }, (err, prs) => {
|
41 | checkErr(err);
|
42 |
|
43 | const name = `v${package.version}`;
|
44 | const body = prs
|
45 | .filter((item) => item.merged_at > latestRelease.created_at)
|
46 | .sort((a, b) => b.title.localeCompare(a.title))
|
47 | .map((item) => `- ${item.title} #${item.number} (by @${item.user.login})`)
|
48 | .join('\n');
|
49 |
|
50 | console.log('Publishing release: %s', name);
|
51 | console.log(body);
|
52 |
|
53 | github.repos.createRelease({
|
54 | user,
|
55 | repo,
|
56 | tag_name: name,
|
57 | target_commitish: 'master',
|
58 | name,
|
59 | body,
|
60 | draft: false,
|
61 | prerelease: false,
|
62 | }, (err) => {
|
63 | checkErr(err);
|
64 | process.exit(0);
|
65 | });
|
66 | });
|
67 | });
|