Browse Source

Added serialized promises for nodeshellexec.

production
--replace-all 4 years ago
parent
commit
b8d9157d6e
1 changed files with 178 additions and 13 deletions
  1. 178
    13
      index.js

+ 178
- 13
index.js View File

@@ -2,11 +2,88 @@
// --------------
// elxr
// A cli tool for elixr.
const { spawn } = require('child_process');
const { existsSync } = require('fs');
const { spawn, spawnSync } = require('child_process');
const cliargs = require('../elxr/cliargs'); // Use minimist...
const processedArgs = cliargs(process.argv.slice(2));
console.dir(processedArgs)

// Serialize a set of functions that will execute to return a promises one after the other.
// Will stop when any one fails.
function any(iterable) {
return iterable.reduce(
(p, fn, i ,a) => {
// console.log('accumulator :');
// console.log(p);
if(Promise.resolve(p) === p ) {
return p.then((pVal) => {

if(Promise.resolve(pVal) === pVal) {
// Passed in function retured a promise. We still need to wait for it.
pVal.then((pVal)=>{

// console.log('Then --pVal = ' + pVal + ' bContinue = ' + continueOnFailure ); console.log(p);
if(!pVal && !continueOnFailure) {
console.error("E : pVal :" + pVal);
// i==0 ? null : console.error("E :1 a[i-1] " + a[i-1]);
// a.map((i)=>console.error(i.toString()));
console.error('debugData 3 -------------------');
// console.error(debugData);
console.error('debugData 3 -------------------');
console.log("Cancelling remaining...");
throw 'Failed in reduce 1 '
return false;
}
// console.log('calling fn : '+ fn);
return (Promise.resolve(fn) === fn ) ? fn : fn() ;
})
}
else {

// console.log('Then --pVal = ' + pVal + ' bContinue = ' + continueOnFailure ); console.log(p);
if(!pVal && !continueOnFailure) {
console.error("E : pVal :" + pVal);
// i==0 ? null : console.error("E :1 a[i-1] " + a[i-1]);
// a.map((i)=>console.error(i.toString()));
console.error('debugData 3 -------------------');
// console.error(debugData);
console.error('debugData 3 -------------------');
console.log("Cancelling remaining...");
throw 'Failed in reduce 1 '
return false;
}
// console.log('calling fn : '+ fn);
return (Promise.resolve(fn) === fn ) ? fn : fn() ;
}

}).catch((error) => {
console.error("E : " + error);
fn ? console.error("Fn : " + fn.toString()) : null;
// i==0 ? null : console.error("E :2 a[i-1] " + a[i-1]);
// a.map((i)=>console.error(i.toString()));
console.error('debugData 4-------------------------');
// console.error(debugData);
console.error('debugData 4-------------------------');

throw 'Failed in reduce 2 '
return false;
})
}
else if(!p) {
console.log("Bypass on failure");
return false;
}
}
, Promise.resolve(true)
);
}



var cli = 'elxr';
var ver = '#unversioned';
var help = '#unkown list of commands... please refer dveloper documentation for ' + cli;
@@ -29,6 +106,88 @@ var __runcmd = function(label){

var op = {
'h' : ()=>{ console.log(cli + ' ' + ver + ' ' + help); return '-h' }
, 'upgrade' : ()=>{
console.log('upgrade.......')
var tasks = [
()=>{
var p = nodeShellExec('npm', ['i', '-g', 'npm-upgrade'], {
inherit : true, shell: true
, env: process.env
})
p.position = 1;
console.log('One')
return p;
}
, ()=>{
var p = nodeShellExec('npm', ['cache', 'clean', '-f'], {
inherit : true, shell: true
, env: process.env
})
p.position = 2;
console.log('Two')
return p;
}
, ()=>{
var p = nodeShellExec('npm', ['install', '-g', 'n'], {
inherit : true, shell: true
, env: process.env
})
p.position = 3;
console.log('Three')
return p;
}
, ()=>{
var p = nodeShellExec('n', ['latest'], {
inherit : true, shell: true
, env: process.env
})
p.position = 4;
console.log('Four')
return p;
}
]
any(tasks)
console.log('.......done')
}
, 'pull' : ()=>{
// Clone if not exists
var gitclonables = [
'ember-masonry-grid'
, 'bbhverse'
, 'clientverse'
, 'serververse'
, 'client'
, 'elixir-client'
, 'elixir-client-unlinked'
, 'ember-searchable-select'
, 'loopback-component-jsonapi'
, 'config'
, 'loopback-connector-ds'
, 'chess-server-lib'
, 'elixir-server'
, 'chess-server'
, 'setup'
]

gitclonables.forEach(clonable => {
console.log('' + process.cwd())
if(existsSync(clonable)) {
console.log('pulling ' + clonable)
nodeShellExec('git', ['pull'], {
inherit : true, shell: true
, cwd : clonable
, env: process.env
})
}
else {
console.log('cloning...')
nodeShellExec('git', ['clone', '//172.16.0.27/repos/' + clonable + '.git'])
}
})

console.log('pull')
}
, 'start' : (label)=>{
console.log('Starting Elixir Server.');
var env = Object.assign({}, process.env); // Shallow clone it.
@@ -40,16 +199,14 @@ var __runcmd = function(label){
inherit : true,
shell: true, detached: true,
cwd : 'loopback',
env: env,
shell : true
env: env
})

nodeShellExec('node', ['--inspect=9227', 'sage-r/server.js'], {
inherit : true,
shell: true, detached: true,
cwd : 'loopback',
env: env,
shell : true
env: env
})
// nodeShellExec('node', ['--inspect=9226', ' bin/www'], {
@@ -119,16 +276,24 @@ function nodeShellExec() {

const child = spawn(...arguments);

// use child.stdout.setEncoding('utf8'); if you want text chunks
child.stdout.setEncoding('utf8');
// console.log('here')
return new Promise(function(resolve, reject){

// use child.stdout.setEncoding('utf8'); if you want text chunks
child.stdout.setEncoding('utf8');
// console.log('here')

child.stdout.on('data', (chunk) => console.log(chunk));
child.stdout.on('data', (chunk) => console.log(chunk));

child.on('error', (chunk) => console.error(chunk));
child.stderr.pipe(process.stderr);
child.on('error', (chunk) => console.error(chunk));
child.stderr.pipe(process.stderr);

child.on('close', (code) => console.log(`child process ${Array.from(arguments)[0]} exited with code ${code}`));
return child;
child.on('close', (code) => {
console.log(`child process ${Array.from(arguments)[0]} exited with code ${code}`)
if(code !== 0 ) return reject(code)
resolve(true)
});
});
}


Loading…
Cancel
Save