2017-03-08 15:51:02 +00:00
|
|
|
import * as plugins from './smartshell.plugins'
|
|
|
|
|
2017-03-10 19:14:40 +00:00
|
|
|
// interfaces
|
|
|
|
import { ChildProcess } from 'child_process'
|
|
|
|
import { Deferred } from 'smartq'
|
|
|
|
|
2017-03-11 12:46:08 +00:00
|
|
|
/**
|
|
|
|
* interface for ExecResult
|
|
|
|
*/
|
2017-03-08 15:51:02 +00:00
|
|
|
export interface IExecResult {
|
|
|
|
exitCode: number,
|
|
|
|
stdout: string
|
|
|
|
}
|
|
|
|
|
2017-03-11 12:46:08 +00:00
|
|
|
/**
|
|
|
|
* interface for streaming ExecResult
|
|
|
|
*/
|
2017-03-10 19:14:40 +00:00
|
|
|
export interface IExecResultStreaming {
|
|
|
|
childProcess: ChildProcess,
|
|
|
|
finalPromise: Promise<IExecResult>
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* executes a given command async
|
|
|
|
* @param commandStringArg
|
|
|
|
*/
|
2017-03-08 15:51:02 +00:00
|
|
|
export let exec = (commandStringArg: string): Promise<IExecResult> => {
|
|
|
|
let done = plugins.smartq.defer<IExecResult>()
|
2017-03-10 19:14:40 +00:00
|
|
|
plugins.shelljs.exec(commandStringArg, { async: true }, (code, stdout, stderr) => {
|
2017-03-08 15:51:02 +00:00
|
|
|
done.resolve({
|
|
|
|
exitCode: code,
|
|
|
|
stdout: stdout
|
|
|
|
})
|
|
|
|
})
|
|
|
|
return done.promise
|
|
|
|
}
|
|
|
|
|
2017-03-10 19:14:40 +00:00
|
|
|
/**
|
|
|
|
* executes a given command async and silent
|
|
|
|
* @param commandStringArg
|
|
|
|
*/
|
2017-03-08 15:51:02 +00:00
|
|
|
export let execSilent = (commandStringArg: string) => {
|
|
|
|
let done = plugins.smartq.defer<IExecResult>()
|
2017-03-10 19:14:40 +00:00
|
|
|
plugins.shelljs.exec(commandStringArg, { async: true, silent: true }, (code, stdout, stderr) => {
|
2017-03-08 15:51:02 +00:00
|
|
|
done.resolve({
|
|
|
|
exitCode: code,
|
|
|
|
stdout: stdout
|
|
|
|
})
|
|
|
|
})
|
|
|
|
return done.promise
|
|
|
|
}
|
2017-03-10 19:14:40 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* executes a command and allws you to stream output
|
|
|
|
*/
|
|
|
|
export let execStreaming = (commandStringArg: string) => {
|
|
|
|
let childProcessEnded = plugins.smartq.defer<IExecResult>()
|
|
|
|
let execChildProcess = plugins.shelljs.exec(commandStringArg, {async: true, silent: true}, (code, stdout, stderr) => {
|
|
|
|
childProcessEnded.resolve({
|
|
|
|
exitCode: code,
|
|
|
|
stdout: stdout
|
|
|
|
})
|
|
|
|
})
|
|
|
|
return {
|
|
|
|
childProcess: execChildProcess,
|
|
|
|
finalPromise: childProcessEnded.promise
|
|
|
|
}
|
|
|
|
}
|
2017-03-11 12:46:08 +00:00
|
|
|
|
2017-06-22 16:17:45 +00:00
|
|
|
/**
|
|
|
|
* executes a command and returns promise that will be fullfilled once an putput line matches RegexArg
|
|
|
|
* @param commandStringArg
|
2017-06-26 13:46:15 +00:00
|
|
|
* @param regexArg
|
2017-06-22 16:17:45 +00:00
|
|
|
*/
|
|
|
|
export let execAndWaitForLine = (commandStringArg: string, regexArg: RegExp) => {
|
|
|
|
let done = plugins.smartq.defer()
|
|
|
|
let execStreamingResult = execStreaming(commandStringArg)
|
2017-06-26 13:46:15 +00:00
|
|
|
execStreamingResult.childProcess.stdout.on('data', (stdOutChunk: string) => {
|
2017-06-22 16:17:45 +00:00
|
|
|
if (regexArg.test(stdOutChunk)) {
|
|
|
|
done.resolve()
|
|
|
|
}
|
|
|
|
})
|
|
|
|
return done.promise
|
|
|
|
}
|
|
|
|
|
2017-03-11 12:46:08 +00:00
|
|
|
/**
|
|
|
|
* get a path
|
|
|
|
*/
|
|
|
|
export let which = (cmd: string): Promise<string> => {
|
|
|
|
let done = plugins.smartq.defer()
|
|
|
|
plugins.which(cmd, (err, path: string) => {
|
|
|
|
if (err) {
|
|
|
|
done.reject(err)
|
|
|
|
}
|
|
|
|
done.resolve(path)
|
|
|
|
})
|
|
|
|
return done.promise
|
|
|
|
}
|