| @@ -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) | |||
| }); | |||
| }); | |||
| } | |||