Skip to content
This repository was archived by the owner on Jan 10, 2023. It is now read-only.

Commit 7c1f16e

Browse files
dale taneddiemoore
dale tan
authored andcommittedSep 4, 2018
fix: support .codecov.yml/codecov.yml files for token (#108)
* fix: support `.codecov.yml`/`codecov.yml` files for token * fix: added more test coverage for gitlab * fix: cleanup env vars to avoid leaking into other tests * fix: updated test to use process.cwd() * package bumps
1 parent 1fff4dc commit 7c1f16e

File tree

5 files changed

+147
-32
lines changed

5 files changed

+147
-32
lines changed
 

‎lib/codecov.js

+21-8
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ var fs = require('fs')
22
var path = require('path')
33
var request = require('request')
44
var urlgrey = require('urlgrey')
5+
var jsYaml = require('js-yaml')
56
var walk = require('ignore-walk')
67
var execSync = require('child_process').execSync
78

@@ -258,20 +259,22 @@ var upload = function(args, on_success, on_failure) {
258259
version
259260
)
260261

261-
query.yaml = [yamlFile, '.codecov.yml'].reduce(function(result, file) {
262-
return (
263-
result ||
264-
(fs.existsSync(path.resolve(process.cwd(), file)) ? file : undefined)
265-
)
266-
}, undefined)
267-
268262
if ((args.options.disable || '').split(',').indexOf('detect') === -1) {
269263
console.log('==> Detecting CI Provider')
270264
query = detectProvider()
271265
} else {
272266
debug.push('disabled detect')
273267
}
274268

269+
query.yaml = [yamlFile, '.codecov.yml'].reduce(function(result, file) {
270+
return (
271+
result ||
272+
(fs.existsSync(path.resolve(process.cwd(), file))
273+
? path.resolve(process.cwd(), file)
274+
: undefined)
275+
)
276+
}, undefined)
277+
275278
if (args.options.build) {
276279
query.build = args.options.build
277280
}
@@ -294,8 +297,18 @@ var upload = function(args, on_success, on_failure) {
294297
query.flags = flags
295298
}
296299

300+
var yamlToken
301+
try {
302+
var loadedYamlFile = jsYaml.safeLoad(fs.readFileSync(query.yaml, 'utf8'))
303+
yamlToken = loadedYamlFile && loadedYamlFile.codecov && loadedYamlFile.codecov.token
304+
} catch (e) {
305+
// silently fail
306+
}
297307
var token =
298-
args.options.token || process.env.codecov_token || process.env.CODECOV_TOKEN
308+
args.options.token ||
309+
yamlToken ||
310+
process.env.codecov_token ||
311+
process.env.CODECOV_TOKEN
299312
if (token) {
300313
query.token = token
301314
}

‎package-lock.json

+15-14
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎package.json

+2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"dependencies": {
2929
"argv": "^0.0.2",
3030
"ignore-walk": "^3.0.1",
31+
"js-yaml": "^3.12.0",
3132
"request": "^2.87.0",
3233
"urlgrey": "^0.4.4"
3334
},
@@ -38,6 +39,7 @@
3839
"husky": "^0.14.3",
3940
"lint-staged": "^7.2.0",
4041
"mocha": "^5.2.0",
42+
"mock-fs": "^4.6.0",
4143
"nyc": "^12.0.2",
4244
"prettier": "^1.13.7"
4345
},

‎test/index.js

+85-10
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
var fs = require('fs')
2+
var mockFs = require('mock-fs')
23
var codecov = require('../lib/codecov')
34

45
var isWindows =
@@ -29,6 +30,7 @@ describe('Codecov', function() {
2930
expect(codecov.upload({ options: { dump: true } }).query.token).to.eql(
3031
'ABC123'
3132
)
33+
delete process.env.CODECOV_TOKEN
3234
})
3335

3436
it('can get a token passed in cli', function() {
@@ -37,6 +39,69 @@ describe('Codecov', function() {
3739
).to.eql('qwerty')
3840
})
3941

42+
it('can read a codecov.yml file', function() {
43+
mockFs({
44+
'codecov.yml': 'codecov:\n token: fake-token',
45+
})
46+
expect(codecov.upload({ options: { dump: true } }).query.token).to.eql(
47+
'fake-token'
48+
)
49+
mockFs.restore()
50+
})
51+
it('can read a .codecov.yml file', function() {
52+
mockFs({
53+
'.codecov.yml': 'codecov:\n token: fake-token-dotfile',
54+
})
55+
expect(codecov.upload({ options: { dump: true } }).query.token).to.eql(
56+
'fake-token-dotfile'
57+
)
58+
mockFs.restore()
59+
})
60+
it('should have no token if yaml file does not supplied', function() {
61+
mockFs({
62+
'.codecov.yml': 'codecov:\n noconfig: true',
63+
})
64+
expect(codecov.upload({ options: { dump: true } }).query.token).to.eql(
65+
undefined
66+
)
67+
mockFs.restore()
68+
})
69+
70+
it('token precedence should be respected', function() {
71+
// options.token || .codecov.yml/codecov.yml file || codecov_token || CODECOV_TOKEN
72+
mockFs({
73+
'.codecov.yml': 'codecov:\n token: fake-token-dotfile',
74+
})
75+
var upload = codecov.upload({ options: { dump: true, token: 'qwerty' } })
76+
expect(upload.query.token).to.eql('qwerty')
77+
mockFs.restore()
78+
79+
process.env.codecov_token = 'abc123'
80+
upload = codecov.upload({ options: { dump: true, token: 'qwerty2' } })
81+
expect(upload.query.token).to.eql('qwerty2')
82+
delete process.env.codecov_token
83+
84+
process.env.CODECOV_TOKEN = 'ABC123'
85+
upload = codecov.upload({ options: { dump: true, token: 'qwerty3' } })
86+
expect(upload.query.token).to.eql('qwerty3')
87+
delete process.env.CODECOV_TOKEN
88+
89+
mockFs({
90+
'.codecov.yml': 'codecov:\n token: fake-token-dotfile',
91+
})
92+
process.env.codecov_token = 'abc123'
93+
upload = codecov.upload({ options: { dump: true } })
94+
expect(upload.query.token).to.eql('fake-token-dotfile')
95+
mockFs.restore()
96+
97+
process.env.codecov_token = 'abc123'
98+
process.env.CODECOV_TOKEN = 'ABC123'
99+
upload = codecov.upload({ options: { dump: true } })
100+
expect(upload.query.token).to.eql('abc123')
101+
delete process.env.codecov_token
102+
delete process.env.CODECOV_TOKEN
103+
})
104+
40105
it('can auto detect reports', function() {
41106
var res = codecov.upload({ options: { dump: true } })
42107
expect(res.files[0].split(pathSeparator).pop()).to.eql(
@@ -125,6 +190,7 @@ describe('Codecov', function() {
125190
var res = codecov.upload({ options: { dump: true, env: 'HELLO,VAR1' } })
126191
expect(res.body).to.contain('HELLO=world\n')
127192
expect(res.body).to.contain('VAR1=\n')
193+
delete process.env.HELLO
128194
})
129195

130196
it('can include env in env', function() {
@@ -134,6 +200,8 @@ describe('Codecov', function() {
134200
expect(res.body).to.contain('HELLO=world\n')
135201
expect(res.body).to.contain('VAR1=\n')
136202
expect(res.body).to.contain('VAR2=\n')
203+
delete process.env.HELLO
204+
delete process.env.CODECOV_ENV
137205
})
138206

139207
it('can have custom args for gcov', function() {
@@ -163,33 +231,40 @@ describe('Codecov', function() {
163231
})
164232

165233
it('Should use codecov.yml via env variable', function() {
234+
var CWD = process.cwd()
166235
expect(
167236
codecov.upload({ options: { dump: true, disable: 'detect' } }).query.yaml
168-
).to.eql('codecov.yml')
237+
).to.eql(CWD + '/codecov.yml')
169238

170-
fs.writeFileSync('foo.yml', '')
239+
mockFs({
240+
'foo.yml': '',
241+
})
171242
process.env.codecov_yml = 'foo.yml'
172243
expect(
173244
codecov.upload({ options: { dump: true, disable: 'detect' } }).query.yaml
174-
).to.eql('foo.yml')
175-
fs.unlinkSync('foo.yml')
245+
).to.eql(CWD + '/foo.yml')
246+
mockFs.restore()
176247
delete process.env.codecov_yml
177248

178-
fs.writeFileSync('FOO.yml', '')
249+
mockFs({
250+
'FOO.yml': '',
251+
})
179252
process.env.CODECOV_YML = 'FOO.yml'
180253
expect(
181254
codecov.upload({ options: { dump: true, disable: 'detect' } }).query.yaml
182-
).to.eql('FOO.yml')
183-
fs.unlinkSync('FOO.yml')
255+
).to.eql(CWD + '/FOO.yml')
256+
mockFs.restore()
184257
delete process.env.CODECOV_YML
185258
})
186259

187260
it('can get config from cli args', function() {
188-
fs.writeFileSync('foo.yml', '')
261+
mockFs({
262+
'foo.yml': '',
263+
})
189264
var res = codecov.upload({
190265
options: { dump: true, yml: 'foo.yml', disable: 'detect' },
191266
})
192-
expect(res.query.yaml).to.eql('foo.yml')
193-
fs.unlinkSync('foo.yml')
267+
expect(res.query.yaml).to.eql(process.cwd() + '/foo.yml')
268+
mockFs.restore()
194269
})
195270
})

‎test/services/gitlab.js

+24
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ describe('Gitlab CI Provider', function() {
66
expect(gitlab.detect()).to.be(true)
77
})
88

9+
it('cannot detect gitlab', function() {
10+
delete process.env.GITLAB_CI
11+
expect(gitlab.detect()).to.be(false)
12+
})
13+
914
it('can get service env info', function() {
1015
process.env.CI_BUILD_ID = '1234'
1116
process.env.CI_BUILD_REPO = 'https://gitlab.com/owner/repo.git'
@@ -20,5 +25,24 @@ describe('Gitlab CI Provider', function() {
2025
slug: 'owner/repo',
2126
branch: 'master',
2227
})
28+
delete process.env.CI_BUILD_REPO
29+
process.env.CI_REPOSITORY_URL = 'https://gitlab.com/owner/repo2.git'
30+
expect(gitlab.configuration()).to.eql({
31+
service: 'gitlab',
32+
build: '1234',
33+
root: '/',
34+
commit: '5678',
35+
slug: 'owner/repo2',
36+
branch: 'master',
37+
})
38+
delete process.env.CI_REPOSITORY_URL
39+
expect(gitlab.configuration()).to.eql({
40+
service: 'gitlab',
41+
build: '1234',
42+
root: '/',
43+
commit: '5678',
44+
slug: '',
45+
branch: 'master',
46+
})
2347
})
2448
})

0 commit comments

Comments
 (0)
This repository has been archived.