-
Notifications
You must be signed in to change notification settings - Fork 36
/
Copy pathindex.js
114 lines (96 loc) · 3.31 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
'use strict'
const assign = require('object-assign')
const conventionalChangelog = require('conventional-changelog')
const debug = require(`debug`)(`conventional-github-releaser`)
const gitSemverTags = require('git-semver-tags')
const ghGot = require('gh-got')
const merge = require('lodash.merge')
const Q = require('q')
const semver = require('semver')
const through = require('through2')
const transform = require('./transform')
/* eslint max-params: ["error", 7] */
function conventionalGithubReleaser (auth, changelogOpts, context, gitRawCommitsOpts, parserOpts, writerOpts, userCb) {
if (!auth) {
throw new Error('Expected an auth object')
}
const promises = []
const changelogArgs = [changelogOpts, context, gitRawCommitsOpts, parserOpts, writerOpts].map(function (arg) {
if (typeof arg === 'function') {
userCb = arg
return {}
}
return arg || {}
})
if (!userCb) {
throw new Error('Expected an callback')
}
changelogOpts = changelogArgs[0]
context = changelogArgs[1]
gitRawCommitsOpts = changelogArgs[2]
parserOpts = changelogArgs[3]
writerOpts = changelogArgs[4]
changelogOpts = merge({
transform: transform,
releaseCount: 1
}, changelogOpts)
writerOpts.includeDetails = true
// ignore the default header partial
writerOpts.headerPartial = writerOpts.headerPartial || ''
Q.nfcall(gitSemverTags)
.then(function (tags) {
if (!tags || !tags.length) {
setImmediate(userCb, new Error('No semver tags found'))
return
}
const releaseCount = changelogOpts.releaseCount
if (releaseCount !== 0) {
gitRawCommitsOpts = assign({
from: tags[releaseCount]
}, gitRawCommitsOpts)
}
gitRawCommitsOpts.to = gitRawCommitsOpts.to || tags[0]
conventionalChangelog(changelogOpts, context, gitRawCommitsOpts, parserOpts, writerOpts)
.on('error', function (err) {
userCb(err)
})
.pipe(through.obj(function (chunk, enc, cb) {
if (!chunk.keyCommit || !chunk.keyCommit.version) {
cb()
return
}
const url = `repos/${context.owner}/${context.repository}/releases`
const options = {
endpoint: auth.url,
body: {
body: chunk.log,
draft: changelogOpts.draft || false,
name: changelogOpts.name || chunk.keyCommit.version,
prerelease: semver.parse(chunk.keyCommit.version).prerelease.length > 0,
tag_name: chunk.keyCommit.version,
target_commitish: changelogOpts.targetCommitish
}
}
if (changelogOpts.discussion) {
options.body.discussion_category_name = changelogOpts.discussion
}
debug(`posting %o to the following URL - ${url}`, options)
// Set auth after debug output so that we don't print auth token to console.
options.token = auth.token
promises.push(ghGot(url, options))
cb()
}, function () {
Q.all(promises)
.then(function (responses) {
userCb(null, responses)
})
.catch(function (err) {
userCb(err)
})
}))
})
.catch(function (err) {
userCb(err)
})
}
module.exports = conventionalGithubReleaser