| // -------------- | // -------------- | ||||
| // elxr | // elxr | ||||
| // A cli tool for elixr. | // 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 cliargs = require('../elxr/cliargs'); // Use minimist... | ||||
| const processedArgs = cliargs(process.argv.slice(2)); | const processedArgs = cliargs(process.argv.slice(2)); | ||||
| console.dir(processedArgs) | console.dir(processedArgs) | ||||
| var path = require('path') | var path = require('path') | ||||
| // 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 cli = 'elxr'; | ||||
| var ver = '#unversioned'; | var ver = '#unversioned'; | ||||
| var op = { | var op = { | ||||
| 'h' : ()=>{ console.log(cli + ' ' + ver + ' ' + help); return '-h' } | 'h' : ()=>{ console.log(cli + ' ' + ver + ' ' + help); return '-h' } | ||||
| , 'upgrade' : ()=>{ | , 'upgrade' : ()=>{ | ||||
| console.log('upgrade.......') | |||||
| var tasks = [ | |||||
| ()=>{ | |||||
| var p = nodeShellExec('npm', ['i', '-g', 'npm-upgrade'], { | |||||
| inherit : true, shell: true | |||||
| , env: process.env | |||||
| }).catch((e)=>{ console.error(e) }) | |||||
| p.position = 1; | |||||
| console.log('One') | |||||
| return p; | |||||
| } | |||||
| , ()=>{ | |||||
| var p = nodeShellExec('npm', ['cache', 'clean', '-f'], { | |||||
| inherit : true, shell: true | |||||
| , env: process.env | |||||
| }).catch((e)=>{ console.error(e) }) | |||||
| p.position = 2; | |||||
| console.log('Two') | |||||
| return p; | |||||
| } | |||||
| , ()=>{ | |||||
| var p = nodeShellExec('npm', ['install', '-g', 'n'], { | |||||
| inherit : true, shell: true | |||||
| , env: process.env | |||||
| }).catch((e)=>{ console.error(e) }) | |||||
| p.position = 3; | |||||
| console.log('Three') | |||||
| return p; | |||||
| } | |||||
| , ()=>{ | |||||
| var p = nodeShellExec('n', ['latest'], { | |||||
| inherit : true, shell: true | |||||
| , env: process.env | |||||
| }).catch((e)=>{ console.error(e) }) | |||||
| p.position = 4; | |||||
| console.log('Four') | |||||
| return p; | |||||
| } | |||||
| ] | |||||
| any(tasks) | |||||
| console.log('.......done') | |||||
| console.log('Running exlr upgrade in : ' + path.dirname(__dirname)) | console.log('Running exlr upgrade in : ' + path.dirname(__dirname)) | ||||
| console.log('Currently only upgrades ember : ' + path.dirname(__dirname)); | console.log('Currently only upgrades ember : ' + path.dirname(__dirname)); | ||||
| console.info('Uninstalling existing ember globally') ; | console.info('Uninstalling existing ember globally') ; | ||||
| var env = Object.assign({}, process.env); // Shallow clone it. | var env = Object.assign({}, process.env); // Shallow clone it. | ||||
| // console.dir(env) | // console.dir(env) | ||||
| console.log('Running exlr pull : ' + path.dirname(__dirname)) | console.log('Running exlr pull : ' + path.dirname(__dirname)) | ||||
| nodeShellExec('cmd', ['/c', 'setup\\utility\\chess.bat', 'pull'], { | |||||
| // nodeShellExec('cmd', ['/c', '..\\setup\\utility\\chess.bat', 'pull'], { | |||||
| stdio: ['pipe', process.stdout, process.stderr], | |||||
| inherit : true, | |||||
| shell: true, | |||||
| cwd : path.dirname(__dirname), | |||||
| env: env | |||||
| // nodeShellExec('cmd', ['/c', 'setup\\utility\\chess.bat', 'pull'], { | |||||
| // // nodeShellExec('cmd', ['/c', '..\\setup\\utility\\chess.bat', 'pull'], { | |||||
| // stdio: ['pipe', process.stdout, process.stderr], | |||||
| // inherit : true, | |||||
| // shell: true, | |||||
| // cwd : path.dirname(__dirname), | |||||
| // env: env | |||||
| // }) | |||||
| var isElevated; | |||||
| try { | |||||
| nodeShellExec( "fsutil", ["dirty", "query", "C:"], { | |||||
| inherit : true, shell: true | |||||
| , env: process.env | |||||
| }).then((exitcode)=>{ | |||||
| console.log('Elevated') | |||||
| }).catch(()=>{ | |||||
| console.log('Not Elevated') | |||||
| console.log('Requesting Elevated Privileges') | |||||
| nodeShellExec('MSHTA', ["javascript: var shell = new ActiveXObject('shell.application'); shell.ShellExecute('node', 'elxr pull', '', 'runas', 1);close();"] | |||||
| , { | |||||
| inherit : true | |||||
| // , shell: true | |||||
| // , env: process.env | |||||
| , | |||||
| title : `runsAs` | |||||
| } | |||||
| ); | |||||
| }); | |||||
| // isElevated = true; | |||||
| } | |||||
| catch ( e ) { | |||||
| // isElevated = false; | |||||
| } | |||||
| // nodeShellExec('MSHTA', ["javascript: var shell = new ActiveXObject('shell.application'); shell.ShellExecute('node', 'elxr pull', '', 'runas', 1);close();"]); | |||||
| // 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 => { | |||||
| if(existsSync(clonable)) { | |||||
| console.log('pulling ' + clonable) | |||||
| nodeShellExec('git', ['pull'], { | |||||
| inherit : true, shell: true | |||||
| , cwd : clonable | |||||
| , env: process.env | |||||
| , title : `git pull ${clonable}` | |||||
| }).catch((e)=>{ console.error(e) }) | |||||
| } | |||||
| else { | |||||
| console.log('cloning ' + clonable) | |||||
| nodeShellExec('git', ['clone', '//172.16.0.27/repos/' + clonable + '.git'], | |||||
| { | |||||
| inherit : true, shell: true | |||||
| , cwd : clonable | |||||
| , env: process.env | |||||
| , title : `git pull ${clonable}` | |||||
| }).catch((e)=>{ console.error(e) }) | |||||
| } | |||||
| }) | }) | ||||
| } | } | ||||
| , 'start' : (label)=>{ | , 'start' : (label)=>{ | ||||
| function nodeShellExec() { | function nodeShellExec() { | ||||
| var args = Array.from(arguments); | |||||
| const child = spawn(...arguments); | const child = spawn(...arguments); | ||||
| // 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)); | |||||
| return new Promise(function(resolve, reject){ | |||||
| child.on('error', (chunk) => console.error(chunk)); | |||||
| // child.stderr.pipe(process.stderr); | |||||
| // use child.stdout.setEncoding('utf8'); if you want text chunks | |||||
| child.stdout.setEncoding('utf8'); | |||||
| child.stdout.on('data', (chunk) => console.log(chunk)); | |||||
| 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(` ${args[2].title} exited with code ${code}`) | |||||
| if(code !== 0 ) return reject(code) | |||||
| resolve(true) | |||||
| }); | |||||
| }); | |||||
| } | } | ||||