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