diff --git a/bin/codecov b/bin/codecov index 93103295b..fb1b62406 100755 --- a/bin/codecov +++ b/bin/codecov @@ -103,4 +103,16 @@ var argv = require("yargs") // eslint-disable-line .help("help") .alias("help", "h").argv; -app.main(argv); + const start = Date.now() + + app.log(`Start of uploader: ${start}...`, { level: 'debug', argv }) + app.main(argv).then(() => { + const end = Date.now() + app.log(`End of uploader: ${end - start} milliseconds`, { level: 'debug', argv }) + }).catch(error => { + app.log(`Error!: ${error}`, { level: 'error', argv }) + const end = Date.now() + app.log(`End of uploader: ${end - start} milliseconds`, { level: 'debug', argv }) + process.exit(argv.nonZero ? -1 : 0) +}) + diff --git a/src/index.js b/src/index.js index 568223926..c19de0835 100644 --- a/src/index.js +++ b/src/index.js @@ -16,15 +16,12 @@ const providers = require('./ci_providers') * @param {Object} args * @param {number} start */ -function dryRun(uploadHost, token, query, uploadFile, args, start) { +function dryRun(uploadHost, token, query, uploadFile) { log('==> Dumping upload file (no upload)') log( `${uploadHost}/upload/v4?package=uploader-${version}&token=${token}&${query}`, ) log(uploadFile) - const end = Date.now() - log(`End of uploader: ${end - start} milliseconds`, { level: 'debug', args }) - process.exit() } /** @@ -52,10 +49,7 @@ function dryRun(uploadHost, token, query, uploadFile, args, start) { * @param {string} args.feature Toggle features */ async function main(args) { - const start = Date.now() - log(`Start of uploader: ${start}...`, { level: 'debug', args }) - try { - /* + /* Step 1: validate and sanitize inputs Step 2: detect if we are in a git repo Step 3: get network (file listing) @@ -65,144 +59,147 @@ async function main(args) { Step 7: either upload or dry-run */ - // == Step 1: validate and sanitize inputs - // TODO: clean and sanitize envs and args - const envs = process.env - // args - const inputs = { args, envs } - - const uploadHost = validateHelpers.validateURL(args.url) - ? args.url - : 'https://codecov.io' - let token = validateHelpers.validateToken(args.token) ? args.token : '' - if (token === '') { - token = process.env.CODECOV_TOKEN || '' - } - token = args.token || process.env.CODECOV_TOKEN || '' - log(generateHeader(getVersion())) - - // == Step 2: detect if we are in a git repo - const projectRoot = args.rootDir || fileHelpers.fetchGitRoot() - if (projectRoot === '') { - log( - '=> No git repo detected. Please use the -R flag if the below detected directory is not correct.', - ) - } - - log(`=> Project root located at: ${projectRoot}`) + // == Step 1: validate and sanitize inputs + // TODO: clean and sanitize envs and args + const envs = process.env + // args + const inputs = { args, envs } + + const uploadHost = validateHelpers.validateURL(args.url) + ? args.url + : 'https://codecov.io' + let token = validateHelpers.validateToken(args.token) ? args.token : '' + if (token === '') { + token = process.env.CODECOV_TOKEN || '' + } + token = args.token || process.env.CODECOV_TOKEN || '' + log(generateHeader(getVersion())) + + // == Step 2: detect if we are in a git repo + const projectRoot = args.rootDir || fileHelpers.fetchGitRoot() + if (projectRoot === '') { + log( + '=> No git repo detected. Please use the -R flag if the below detected directory is not correct.', + ) + } - // == Step 3: get network - let uploadFile = '' + log(`=> Project root located at: ${projectRoot}`) - if ( - !args.feature || - args.feature.split(',').includes('network') === false - ) { - log('Start of network processing...', { level: 'debug', args }) - const fileListing = await fileHelpers.getFileListing(projectRoot, args) + // == Step 3: get network + let uploadFile = '' - uploadFile = uploadFile - .concat(fileListing) - .concat(fileHelpers.endNetworkMarker()) + if (!args.feature || args.feature.split(',').includes('network') === false) { + log('Start of network processing...', { level: 'debug', args }) + let fileListing + try { + fileListing = await fileHelpers.getFileListing(projectRoot, args) + } catch (error) { + throw new Error(`Error getting file listing: ${error}`) } - // == Step 4: select coverage files (search or specify) + uploadFile = uploadFile + .concat(fileListing) + .concat(fileHelpers.endNetworkMarker()) + } - // Look for files - let coverageFilePaths = [] - if (!args.file) { - coverageFilePaths = fileHelpers.getCoverageFiles( - args.dir || projectRoot, - // TODO: Determine why this is so slow (I suspect it's walking paths it should not) - fileHelpers.coverageFilePatterns(), - ) - if (coverageFilePaths.length > 0) { - log(`=> Found ${coverageFilePaths.length} possible coverage files:`) - log(coverageFilePaths.join('\n')) - } else { - log( - 'No coverage files located, please try use `-f`, or change the project root with `-R`', - { level: 'error' }, - ) - process.exit(args.nonZero ? -1 : 0) - } + // == Step 4: select coverage files (search or specify) + + // Look for files + let coverageFilePaths = [] + if (!args.file) { + coverageFilePaths = fileHelpers.getCoverageFiles( + args.dir || projectRoot, + // TODO: Determine why this is so slow (I suspect it's walking paths it should not) + fileHelpers.coverageFilePatterns(), + ) + if (coverageFilePaths.length > 0) { + log(`=> Found ${coverageFilePaths.length} possible coverage files:`) + log(coverageFilePaths.join('\n')) } else { - coverageFilePaths[0] = validateHelpers.validateFileNamePath(args.file) - ? args.file - : '' - if (coverageFilePaths.length === 0) { - log('Not coverage file found, exiting.', { level: 'error' }) - process.exit(args.nonZero ? -1 : 0) - } + throw new Error( + 'No coverage files located, please try use `-f`, or change the project root with `-R`', + ) + } + } else { + coverageFilePaths[0] = validateHelpers.validateFileNamePath(args.file) + ? args.file + : '' + if (coverageFilePaths.length === 0) { + throw new Error('Not coverage file found, exiting.') } - log('End of network processing', { level: 'debug', args }) + } + log('End of network processing', { level: 'debug', args }) - // == Step 5: generate upload file - // TODO: capture envs + // == Step 5: generate upload file + // TODO: capture envs - // Get coverage report contents - for (const coverageFile of coverageFilePaths) { - const fileContents = await fileHelpers.readCoverageFile( + // Get coverage report contents + for (const coverageFile of coverageFilePaths) { + let fileContents + try { + fileContents = await fileHelpers.readCoverageFile( args.dir || projectRoot, coverageFile, ) - uploadFile = uploadFile.concat(fileHelpers.fileHeader(coverageFile)) - uploadFile = uploadFile.concat(fileContents) - uploadFile = uploadFile.concat(fileHelpers.endFileMarker()) + } catch (error) { + throw new Error(`Error reading coverage file (${coverageFile}): ${error}`) } - // Cleanup - if (args.clean) { - for (const coverageFile of coverageFilePaths) { - fileHelpers.removeFile(args.dir || projectRoot, coverageFile) - } - } + uploadFile = uploadFile.concat(fileHelpers.fileHeader(coverageFile)) + uploadFile = uploadFile.concat(fileContents) + uploadFile = uploadFile.concat(fileHelpers.endFileMarker()) + } - // Environment variables - if (args.env || envs.CODECOV_ENV) { - const environmentVars = args.env || envs.CODECOV_ENV - const vars = environmentVars - .split(',') - .filter(Boolean) - .map(evar => `${evar}=${process.env[evar] || ''}\n`) - .join('') - uploadFile = uploadFile.concat(vars) - uploadFile = uploadFile.concat(fileHelpers.endEnvironmentMarker()) + // Cleanup + if (args.clean) { + for (const coverageFile of coverageFilePaths) { + fileHelpers.removeFile(args.dir || projectRoot, coverageFile) } + } - const gzippedFile = zlib.gzipSync(uploadFile) + // Environment variables + if (args.env || envs.CODECOV_ENV) { + const environmentVars = args.env || envs.CODECOV_ENV + const vars = environmentVars + .split(',') + .filter(Boolean) + .map(evar => `${evar}=${process.env[evar] || ''}\n`) + .join('') + uploadFile = uploadFile.concat(vars) + uploadFile = uploadFile.concat(fileHelpers.endEnvironmentMarker()) + } - // == Step 6: determine CI provider + const gzippedFile = zlib.gzipSync(uploadFile) - // Determine CI provider - let serviceParams - for (const provider of providers) { - if (provider.detect(envs)) { - log(`Detected ${provider.getServiceName()} as the CI provider.`) - serviceParams = provider.getServiceParams(inputs) - break - } - } + // == Step 6: determine CI provider - if (serviceParams === undefined) { - log('Unable to detect service, please specify manually.', { - level: 'error', - }) - process.exit(args.nonZero ? -1 : 0) + // Determine CI provider + let serviceParams + for (const provider of providers) { + if (provider.detect(envs)) { + log(`Detected ${provider.getServiceName()} as the CI provider.`) + serviceParams = provider.getServiceParams(inputs) + break } + } - // == Step 7: either upload or dry-run + if (serviceParams === undefined) { + throw new Error('Unable to detect service, please specify manually.') + } - const query = webHelpers.generateQuery( - webHelpers.populateBuildParams(inputs, serviceParams), - ) + // == Step 7: either upload or dry-run - if (args.dryRun) { - dryRun(uploadHost, token, query, uploadFile, args, start) - } else { - log( - `Pinging Codecov: ${uploadHost}/v4?package=uploader-${version}&token=*******&${query}`, - ) + const query = webHelpers.generateQuery( + webHelpers.populateBuildParams(inputs, serviceParams), + ) + + if (args.dryRun) { + return dryRun(uploadHost, token, query, uploadFile) + } else { + log( + `Pinging Codecov: ${uploadHost}/v4?package=uploader-${version}&token=*******&${query}`, + ) + try { const uploadURL = await webHelpers.uploadToCodecov( uploadHost, token, @@ -213,19 +210,10 @@ async function main(args) { const result = await webHelpers.uploadToCodecovPUT(uploadURL, gzippedFile) log(result) return result + } catch (error) { + throw new Error(`Error uploading to ${uploadHost}: ${error}`) } - } catch (error) { - // Output any exceptions and exit - log(error.message, { level: 'error' }) - const end = Date.now() - log(`End of uploader: ${end - start} milliseconds`, { - level: 'debug', - args, - }) - process.exit(args.nonZero ? -1 : 0) } - const end = Date.now() - log(`End of uploader: ${end - start} milliseconds`, { level: 'debug', args }) } /** @@ -250,6 +238,7 @@ function getVersion() { } module.exports = { + log, main, getVersion, generateHeader,