|  |  | @@ -2,12 +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) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 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 ver = '#unversioned'; | 
		
	
	
		
			
			|  |  | @@ -33,6 +109,48 @@ 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 | 
		
	
		
			
			|  |  |  | }).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('Currently only upgrades ember : ' + path.dirname(__dirname)); | 
		
	
		
			
			|  |  |  | console.info('Uninstalling existing ember globally') ; | 
		
	
	
		
			
			|  |  | @@ -68,13 +186,82 @@ var __runcmd = function(label){ | 
		
	
		
			
			|  |  |  | var env = Object.assign({}, process.env); // Shallow clone it. | 
		
	
		
			
			|  |  |  | // console.dir(env) | 
		
	
		
			
			|  |  |  | 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)=>{ | 
		
	
	
		
			
			|  |  | @@ -178,18 +365,23 @@ __runcmd(processedArgs.label || processedArgs._[0] || 'h'); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function nodeShellExec() { | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var args = Array.from(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) | 
		
	
		
			
			|  |  |  | }); | 
		
	
		
			
			|  |  |  | }); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 |