毕设专用git仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

162 lines
4.5 KiB

/**
* @author Toru Nagashima
* @copyright 2016 Toru Nagashima. All rights reserved.
* See LICENSE file in root directory for full license.
*/
'use strict'
// ------------------------------------------------------------------------------
// Requirements
// ------------------------------------------------------------------------------
const cp = require('child_process')
const fs = require('fs')
const path = require('path')
const BufferStream = require('./buffer-stream')
// ------------------------------------------------------------------------------
// Helpers
// ------------------------------------------------------------------------------
const FILE_NAME = 'test.txt'
const NPM_RUN_ALL = path.resolve(__dirname, '../../bin/npm-run-all/index.js')
const RUN_P = path.resolve(__dirname, '../../bin/run-p/index.js')
const RUN_S = path.resolve(__dirname, '../../bin/run-s/index.js')
/**
* Spawns the given script with the given arguments.
*
* @param {string} filePath - The file path to be executed.
* @param {string[]} args - The arguments to execute.
* @param {Writable} [stdout] - The writable stream to receive stdout.
* @param {Writable} [stderr] - The writable stream to receive stderr.
* @returns {Promise<void>} The promise which becomes fulfilled if the child
* process finished.
*/
function spawn (filePath, args, stdout, stderr) {
return new Promise((resolve, reject) => {
const child = cp.spawn(
process.execPath,
[filePath].concat(args),
{ stdio: 'pipe' }
)
const out = new BufferStream()
const error = new BufferStream()
if (stdout != null) {
child.stdout.pipe(stdout)
}
if (stderr != null) {
child.stderr.pipe(stderr)
} else {
child.stderr.pipe(error)
}
child.stdout.pipe(out)
child.on('close', (exitCode) => {
if (exitCode) {
reject(new Error(error.value || 'Exited with non-zero code.'))
} else {
resolve()
}
})
child.on('error', reject)
})
}
// ------------------------------------------------------------------------------
// Public Interface
// ------------------------------------------------------------------------------
/**
* Gets the result text from `test.txt`.
*
* @returns {string|null} The result text.
*/
module.exports.result = function result () {
try {
return fs.readFileSync(FILE_NAME, { encoding: 'utf8' })
} catch (err) {
if (err.code === 'ENOENT') {
return null
}
throw err
}
}
/**
* Appends text to `test.txt`.
*
* @param {string} content - A text to append.
* @returns {void}
*/
module.exports.appendResult = function appendResult (content) {
fs.appendFileSync(FILE_NAME, content)
}
/**
* Removes `test.txt`.
*
* @returns {void}
*/
module.exports.removeResult = function removeResult () {
try {
fs.unlinkSync(FILE_NAME)
} catch (err) {
if (err.code === 'ENOENT') {
return
}
throw err
}
}
/**
* Delay.
*
* @param {number} timeoutInMillis - The time to delay.
* @returns {Promise<void>} The promise which fulfilled after the given time.
*/
module.exports.delay = function delay (timeoutInMillis) {
return new Promise(resolve => {
setTimeout(resolve, timeoutInMillis)
})
}
/**
* Executes `npm-run-all` with the given arguments.
*
* @param {string[]} args - The arguments to execute.
* @param {Writable} [stdout] - The writable stream to receive stdout.
* @param {Writable} [stderr] - The writable stream to receive stderr.
* @returns {Promise<void>} The promise which becomes fulfilled if the child
* process finished.
*/
module.exports.runAll = function runAll (args, stdout, stderr) {
return spawn(NPM_RUN_ALL, args, stdout, stderr)
}
/**
* Executes `run-p` with the given arguments.
*
* @param {string[]} args - The arguments to execute.
* @param {Writable} [stdout] - The writable stream to receive stdout.
* @param {Writable} [stderr] - The writable stream to receive stderr.
* @returns {Promise<void>} The promise which becomes fulfilled if the child
* process finished.
*/
module.exports.runPar = function runPar (args, stdout, stderr) {
return spawn(RUN_P, args, stdout, stderr)
}
/**
* Executes `run-s` with the given arguments.
*
* @param {string[]} args - The arguments to execute.
* @param {Writable} [stdout] - The writable stream to receive stdout.
* @param {Writable} [stderr] - The writable stream to receive stderr.
* @returns {Promise<void>} The promise which becomes fulfilled if the child
* process finished.
*/
module.exports.runSeq = function runSeq (args, stdout, stderr) {
return spawn(RUN_S, args, stdout, stderr)
}