mirror of
https://github.com/openstf/stf
synced 2025-10-03 17:59:28 +02:00
Shut down stf local in proper order so that the console doesn't get ugly.
This commit is contained in:
parent
78b768406a
commit
aec95d87a4
2 changed files with 130 additions and 95 deletions
|
@ -4,9 +4,10 @@ var cp = require('child_process')
|
|||
var Promise = require('bluebird')
|
||||
|
||||
function ExitError(code) {
|
||||
Error.call(this, util.format('Exit code "%d"', code))
|
||||
Error.call(this)
|
||||
this.name = 'ExitError'
|
||||
this.code = code
|
||||
this.message = util.format('Exit code "%d"', code)
|
||||
Error.captureStackTrace(this, ExitError)
|
||||
}
|
||||
|
||||
|
@ -17,22 +18,50 @@ module.exports.ExitError = ExitError
|
|||
|
||||
// Export
|
||||
module.exports.fork = function() {
|
||||
var args = arguments
|
||||
var resolver = Promise.defer()
|
||||
var proc = cp.fork.apply(cp, arguments)
|
||||
|
||||
return new Promise(function(resolve, reject) {
|
||||
var proc = cp.fork.apply(cp, args)
|
||||
function sigintListener() {
|
||||
proc.kill('SIGINT')
|
||||
}
|
||||
|
||||
proc.on('error', function(err) {
|
||||
reject(err)
|
||||
proc.kill()
|
||||
})
|
||||
function sigtermListener() {
|
||||
proc.kill('SIGTERM')
|
||||
}
|
||||
|
||||
proc.on('exit', function(code) {
|
||||
if (code > 0) {
|
||||
reject(new ExitError(code))
|
||||
}
|
||||
})
|
||||
process.on('SIGINT', sigintListener)
|
||||
process.on('SIGTERM', sigtermListener)
|
||||
|
||||
proc.on('error', function(err) {
|
||||
resolver.reject(err)
|
||||
proc.kill()
|
||||
})
|
||||
|
||||
proc.on('exit', function(code, signal) {
|
||||
if (signal) {
|
||||
resolver.resolve(code)
|
||||
}
|
||||
else if (code > 0 && code !== 130 && code !== 143) {
|
||||
resolver.reject(new ExitError(code))
|
||||
}
|
||||
else {
|
||||
resolver.resolve(code)
|
||||
}
|
||||
})
|
||||
|
||||
return resolver.promise.cancellable()
|
||||
.finally(function() {
|
||||
process.removeListener('SIGINT', sigintListener)
|
||||
process.removeListener('SIGTERM', sigtermListener)
|
||||
})
|
||||
.catch(Promise.CancellationError, function(err) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
proc.on('exit', function() {
|
||||
resolver.resolve()
|
||||
})
|
||||
proc.kill()
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// Export
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue