Skip to content

Commit d2ac6dc

Browse files
christophwitzkoboennemann
authored andcommitted
feat: rewrite cli
This is a larger refactor/rewrite of the CLI. It addresses a few open issues, pull requests and updates dependencies. It is now using async/await to handle async code. feat: set publishConfig.access to "restricted" for private repos Closes #83 chore: test modern node versions (4,6,7) on travis Closes #85 chore: update dependencies Closes #87, Closes #90, Closes #92 fix: make keytar an optional dependency Closes #86 feat: update travis template with recent npm and node Closes #35 feat: use newer travis_after_all (with travis enterprise support) Closes #91 fix: confirm before overwriting travis.yml #12 fix: write placeholder version to package.json instead of deleting it Closes #72, Closes #71 BREAKING CHANGE: The CLI now requires node >= 4. A lot of code got rewritten. Breakage possible. This release was long overdue. Thanks for your patience.
1 parent bdbf616 commit d2ac6dc

File tree

13 files changed

+375
-507
lines changed

13 files changed

+375
-507
lines changed

.cz.json

Lines changed: 0 additions & 3 deletions
This file was deleted.

.travis.yml

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,22 @@
1-
sudo: false
21
language: node_js
32
cache:
43
directories:
5-
- node_modules
4+
- node_modules
65
notifications:
76
email: false
8-
addons:
9-
apt:
10-
packages:
11-
- xvfb
12-
- gnome-keyring
13-
- libgnome-keyring-dev
147
node_js:
15-
- iojs-v2
16-
- iojs-v1
17-
- '0.12'
18-
- '0.10'
19-
before_install: |
20-
case ${TRAVIS_NODE_VERSION} in
21-
iojs*)
22-
echo "Not upgrading npm for iojs."
23-
;;
24-
*)
25-
npm update -g npm
26-
;;
27-
esac
8+
- '4'
9+
- '6'
10+
- '7'
11+
before_install:
12+
- npm update -g npm
2813
before_script:
29-
- npm prune
14+
- npm prune
3015
after_success:
31-
- curl -Lo travis_after_all.py https://git.io/travis_after_all
32-
- python travis_after_all.py
33-
- export $(cat .to_export_back) &> /dev/null
34-
- npm run coverage:upload
35-
- npm run semantic-release
16+
- 'curl -Lo travis_after_all.py https://git.io/vXXtr'
17+
- python travis_after_all.py
18+
- export $(cat .to_export_back) &> /dev/null
19+
- npm run semantic-release
20+
branches:
21+
except:
22+
- /^v\d+\.\d+\.\d+$/

bin/semantic-release.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ try {
55
require('../dist')(process.argv)
66
} catch (err) {
77
if (err.code === 'MODULE_NOT_FOUND') {
8-
require('babel/register')
8+
require('babel-register')
99
require('../src')(process.argv)
1010
} else {
1111
console.log(err)

package.json

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,45 +2,57 @@
22
"name": "semantic-release-cli",
33
"description": "setup automated semver compliant package publishing",
44
"author": "Christoph Witzko <npm@christophwitzko.com> (http://christophwitzko.com)",
5+
"babel": {
6+
"presets": [
7+
"es2015-node4"
8+
],
9+
"plugins": [
10+
"transform-async-to-generator"
11+
]
12+
},
513
"bin": {
614
"semantic-release-cli": "./bin/semantic-release.js"
715
},
816
"bugs": {
917
"url": "https://github.com/semantic-release/cli/issues"
1018
},
1119
"dependencies": {
12-
"async": "^2.1.2",
1320
"base32": "0.0.6",
21+
"bluebird": "^3.4.6",
1422
"github-url-from-git": "^1.4.0",
1523
"ini": "^1.3.4",
1624
"inquirer": "^1.2.2",
1725
"js-yaml": "^3.3.1",
18-
"keytar": "^3.0.0",
1926
"lodash": "^4.16.4",
2027
"nopt": "^3.0.2",
28+
"npm": "^3.10.9",
2129
"npm-registry-client": "^7.3.0",
22-
"npmconf": "^2.1.2",
2330
"npmlog": "^4.0.0",
2431
"parse-github-repo-url": "^1.0.0",
2532
"request": "^2.58.0",
26-
"travis-ci": "https://github.com/mykmelez/node-travis-ci/tarball/e35375de8b06bbe7209b5dfe94f816737002e928",
33+
"request-promise": "^4.1.1",
34+
"travis-ci": "^2.1.1",
2735
"update-notifier": "^1.0.2",
2836
"user-home": "^2.0.0",
2937
"validator": "^6.1.0"
3038
},
39+
"optionalDependencies": {
40+
"keytar": "^3.0.0"
41+
},
3142
"devDependencies": {
32-
"babel": "^6.5.2",
33-
"cz-conventional-changelog": "^1.1.0",
43+
"babel-cli": "^6.18.0",
44+
"babel-plugin-transform-async-to-generator": "^6.16.0",
45+
"babel-preset-es2015-node4": "^2.1.0",
3446
"mkdirp": "^0.5.1",
3547
"nyc": "^8.3.2",
3648
"rimraf": "^2.4.2",
37-
"semantic-release": "^4.0.0",
49+
"semantic-release": "^4.3.5",
3850
"standard": "^8.5.0",
3951
"tap": "^8.0.0"
4052
},
4153
"engines": {
42-
"node": ">=0.10",
43-
"npm": ">=2"
54+
"node": ">=4",
55+
"npm": ">=3"
4456
},
4557
"homepage": "https://github.com/semantic-release/cli",
4658
"keywords": [
@@ -66,11 +78,9 @@
6678
"coverage": "nyc report",
6779
"coverage:upload": "npm run coverage -- --reporter=lcovonly && coveralls < coverage/lcov.info",
6880
"prepublish": "npm run build",
69-
"pretest:unit": "npm run build && npm run test:build",
7081
"semantic-release": "semantic-release pre && npm publish && semantic-release post",
7182
"test": "npm run test:style && npm run test:unit",
72-
"test:build": "rimraf .test && mkdirp .test && babel test --out-dir .test",
7383
"test:style": "standard",
74-
"test:unit": "nyc tap --no-cov .test/specs/*.js"
84+
"test:unit": "nyc tap --no-cov test/specs/*.js"
7585
}
7686
}

src/index.js

Lines changed: 46 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
const { readFileSync, writeFileSync } = require('fs')
1+
const {readFileSync, writeFileSync} = require('fs')
22

33
const _ = require('lodash')
4-
const async = require('async')
4+
const {promisify} = require('bluebird')
55
const nopt = require('nopt')
6-
const npmconf = require('npmconf')
7-
const request = require('request')
6+
const npm = require('npm')
7+
const request = require('request-promise').defaults({json: true})
88

99
const getLog = require('./lib/log')
1010

@@ -33,7 +33,7 @@ const shortHands = {
3333
h: ['--help']
3434
}
3535

36-
module.exports = function (argv) {
36+
module.exports = async function (argv) {
3737
let info = {
3838
options: _.defaults(
3939
nopt(knownOptions, shortHands, argv, 2),
@@ -70,51 +70,49 @@ Aliases:
7070
process.exit(0)
7171
}
7272

73-
npmconf.load((err, conf) => {
74-
if (err) {
75-
log.error('Failed to load npm config.', err)
76-
process.exit(1)
77-
}
78-
79-
info.loglevel = conf.get('loglevel') || 'warn'
80-
const log = info.log = getLog(info.loglevel)
81-
82-
async.applyEachSeries([
83-
require('./lib/repository'),
84-
require('./lib/npm'),
85-
require('./lib/github'),
86-
require('./lib/ci')
87-
], pkg, info, (err) => {
88-
if (err) {
89-
log.error(err)
90-
process.exit(1)
91-
}
73+
try {
74+
var config = (await promisify(npm.load.bind(npm))({progress: false})).config
75+
} catch (e) {
76+
console.log('Failed to load npm config.', e)
77+
process.exit(1)
78+
}
9279

93-
delete pkg.version
80+
info.loglevel = config.get('loglevel') || 'warn'
81+
const log = info.log = getLog(info.loglevel)
82+
83+
try {
84+
await require('./lib/repository')(pkg, info)
85+
await require('./lib/npm')(pkg, info)
86+
await require('./lib/github')(pkg, info)
87+
await require('./lib/ci')(pkg, info)
88+
} catch (err) {
89+
log.error(err)
90+
process.exit(1)
91+
}
9492

95-
pkg.scripts = pkg.scripts || {}
96-
pkg.scripts['semantic-release'] = 'semantic-release pre && npm publish && semantic-release post'
93+
pkg.version = '0.0.0-development'
9794

98-
pkg.repository = pkg.repository || {
99-
type: 'git',
100-
url: info.giturl
101-
}
95+
pkg.scripts = pkg.scripts || {}
96+
pkg.scripts['semantic-release'] = 'semantic-release pre && npm publish && semantic-release post'
97+
98+
pkg.repository = pkg.repository || {
99+
type: 'git',
100+
url: info.giturl
101+
}
102+
103+
if (info.ghrepo.private && !pkg.publishConfig) {
104+
pkg.publishConfig = {access: 'restricted'}
105+
}
106+
107+
try {
108+
const {'dist-tags': distTags} = await request('https://registry.npmjs.org/semantic-release')
109+
pkg.devDependencies = pkg.devDependencies || {}
110+
pkg.devDependencies['semantic-release'] = `^${distTags[info.options.tag]}`
111+
} catch (e) {
112+
log.error('Could not get latest `semantic-release` version.', e)
113+
}
102114

103-
request({
104-
url: 'https://registry.npmjs.org/semantic-release',
105-
json: true
106-
}, (err, res, body) => {
107-
if (err) {
108-
log.error('Could not get latest `semantic-release` version.', err)
109-
} else {
110-
pkg.devDependencies = pkg.devDependencies || {}
111-
pkg.devDependencies['semantic-release'] = `^${body['dist-tags'][info.options.tag]}`
112-
}
113-
114-
log.verbose('Writing `package.json`.')
115-
writeFileSync('package.json', `${JSON.stringify(pkg, null, 2)}\n`)
116-
log.info('Done.')
117-
})
118-
})
119-
})
115+
log.verbose('Writing `package.json`.')
116+
writeFileSync('package.json', `${JSON.stringify(pkg, null, 2)}\n`)
117+
log.info('Done.')
120118
}

src/lib/ci.js

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,21 @@ const cis = {
88
'Travis CI': travis.bind(null, 'https://api.travis-ci.org'),
99
'Travis CI Pro': travis.bind(null, 'https://api.travis-ci.com'),
1010
'Travis CI Enterprise': travis,
11-
'Other (prints tokens)': (pkg, info, cb) => {
11+
'Other (prints tokens)': (pkg, info) => {
1212
const message = `
1313
${_.repeat('-', 46)}
1414
GH_TOKEN=${info.github.token}
1515
NPM_TOKEN=${info.npm.token}
1616
${_.repeat('-', 46)}
1717
`
1818
console.log(message)
19-
cb(null)
2019
}
2120
}
2221

23-
module.exports = function (pkg, info, cb) {
24-
const choices = Object.keys(cis)
22+
module.exports = async function (pkg, info) {
23+
const choices = _.keys(cis)
2524

26-
inquirer.prompt([{
25+
const answers = await inquirer.prompt([{
2726
type: 'list',
2827
name: 'ci',
2928
message: 'What CI are you using?',
@@ -37,12 +36,8 @@ module.exports = function (pkg, info, cb) {
3736
protocols: [ 'http', 'https' ],
3837
require_protocol: true
3938
}),
40-
when: (ans) => ans.ci === choices[2]
41-
}], (answers) => {
42-
if (answers.endpoint) {
43-
return cis[answers.ci](answers.endpoint, pkg, info, cb)
44-
}
39+
when: answers => answers.ci === choices[2]
40+
}])
4541

46-
cis[answers.ci](pkg, info, cb)
47-
})
42+
await cis[answers.ci].apply(null, _.compact([answers.endpoint, pkg, info]))
4843
}

0 commit comments

Comments
 (0)