|
|
@@ -1,5 +1,9 @@ |
|
|
|
|
|
|
|
var __Promise = {}; |
|
|
|
// if(!String.prototype.trim) String.prototype.trim = function(){ |
|
|
|
// return this.replace(/^\s+|\s+$/g, ''); |
|
|
|
// }; |
|
|
|
|
|
|
|
// var ovrrides = { |
|
|
|
// resolve : function(v){ |
|
|
|
// if(v && v.then) return v; |
|
|
@@ -18,8 +22,23 @@ var stampedFilePfx = function(date) { |
|
|
|
} |
|
|
|
var runtimestamp = (new Date()).getTime(); |
|
|
|
|
|
|
|
var promises = []; |
|
|
|
function startPromises(){ |
|
|
|
promises.forEach(function(p){ |
|
|
|
// console.log(p.chain) |
|
|
|
p(); |
|
|
|
// promises.splice(0,1) |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
function isWin(){ return /^win/.test(process.platform) } |
|
|
|
|
|
|
|
try{ |
|
|
|
__Promise = Promise |
|
|
|
var __require = require |
|
|
|
var map = Array.map |
|
|
|
|
|
|
|
|
|
|
|
// -------------------------------------------- |
|
|
|
// Node Exists. Lets launch ourselves in Node itself |
|
|
|
|
|
|
@@ -43,10 +62,12 @@ try{ |
|
|
|
var selectedinstance = { root : path.resolve(".") } |
|
|
|
__main(selectedinstance) |
|
|
|
} |
|
|
|
// catch(e){} |
|
|
|
catch(e){ |
|
|
|
// // -------------------------------------------- |
|
|
|
// // Cscript |
|
|
|
var wsh = true; |
|
|
|
function isWin(){ return true; } |
|
|
|
// If UCase( Right( WScript.FullName, 12 ) ) = "\CSCRIPT.EXE" Then |
|
|
|
|
|
|
|
var clii = { |
|
|
@@ -248,7 +269,7 @@ catch(e){ |
|
|
|
} |
|
|
|
|
|
|
|
var shell = new ActiveXObject('shell.application'); |
|
|
|
var promises = []; |
|
|
|
|
|
|
|
promises.forEach = forEach |
|
|
|
function startPromises(){ |
|
|
|
promises.forEach(function(p){ |
|
|
@@ -267,6 +288,7 @@ catch(e){ |
|
|
|
var shellExec = function(cmd, argstr){ |
|
|
|
|
|
|
|
var objShell = WScript.createobject("wscript.shell") |
|
|
|
// console.log(argstr.join( ' ')) |
|
|
|
var oExec = objShell.Exec(cmd + ' ' + argstr.join(' ')) |
|
|
|
var result = {} |
|
|
|
var shellresult = { shell : objShell, result : result } |
|
|
@@ -275,10 +297,10 @@ catch(e){ |
|
|
|
var WshFinished = 1 |
|
|
|
var WshFailed = 2 |
|
|
|
while(oExec.Status === WshRunning){ |
|
|
|
WScript.StdOut.write('.') |
|
|
|
WScript.StdOut.write('s.') |
|
|
|
WScript.Sleep(500) |
|
|
|
} |
|
|
|
var strOutput = '' |
|
|
|
var strOutput = '\n' |
|
|
|
switch(oExec.Status) { |
|
|
|
case WshFinished : |
|
|
|
strOutput = oExec.StdOut.ReadAll() |
|
|
@@ -295,28 +317,29 @@ catch(e){ |
|
|
|
} |
|
|
|
result.result = command + ' ' + cargs + ' exited with code ' + result.code |
|
|
|
result.messages = [strOutput] |
|
|
|
// console.log(strOutput) |
|
|
|
// WScript.Echo(oExec.Status) |
|
|
|
// WScript.Echo(oExec.ProcessID) |
|
|
|
// WScript.Echo(oExec.ExitCode) |
|
|
|
|
|
|
|
// console.log(objShell.StdOut.ReadAll) |
|
|
|
// console.log(objShell.StdErr.ReadAll) |
|
|
|
|
|
|
|
// objShell = WScript.createobject("wscript.shell") |
|
|
|
objShell = null; |
|
|
|
return shellresult; |
|
|
|
} |
|
|
|
|
|
|
|
var p = null; |
|
|
|
var pworker = function(resolve, reject){ |
|
|
|
// console.dir(p) |
|
|
|
var pfx = selectedinstance.root + '/.elxr/run-' + runtimestamp + '/' + stampedFilePfx(new Date()) |
|
|
|
var pfx = selectedinstance.root + '\\.elxr\\run-' + runtimestamp + '\\' + stampedFilePfx(new Date()) |
|
|
|
// console.log('p.chain.length ================ ' + p.chain.length) |
|
|
|
options = options || { |
|
|
|
runFile : path.normalize( pfx + "out.txt") |
|
|
|
// runFile : null |
|
|
|
} |
|
|
|
var runFile = null; |
|
|
|
// var runFile = options.runFile |
|
|
|
// var runFile = selectedinstance.root + '\\' + stampedFilePfx(new Date()) + command + cargs + "out.txt"; |
|
|
|
var runFile = options.runFile || pfx + command + cargs + "out.txt"; |
|
|
|
// console.log(runFile) |
|
|
|
var args = cargs.concat() |
|
|
|
// runFile ? (args.push(">"), args.push(runFile)) : cargs |
|
|
@@ -332,7 +355,14 @@ catch(e){ |
|
|
|
|
|
|
|
var runbat = path.normalize(pfx + "run.bat") |
|
|
|
// console.log('runbat : ' + runbat) |
|
|
|
fs.writeFileSync(runbat, command + ' ' + args.join(' ') + ' \r\n' + 'echo done > ' + runFile ) |
|
|
|
fs.writeFileSync(runbat, |
|
|
|
'@echo off \r\n' + |
|
|
|
(options.cwd ? 'cd ' + options.cwd + ' \r\n' : '') + |
|
|
|
// ' cmd /k notepad.exe \r\n' + |
|
|
|
command + ' ' + args.join(' ') + ' \r\n' + |
|
|
|
'cmd /c echo done >> ' + runFile + ' \r\n' + |
|
|
|
'echo done' |
|
|
|
) |
|
|
|
// fs.writeFileSync(runFile, 'started') |
|
|
|
// WScript.Quit() |
|
|
|
// elevatedshellexecute(runFile) |
|
|
@@ -344,50 +374,59 @@ catch(e){ |
|
|
|
// // cmd /b /c |
|
|
|
// }, 500) } |
|
|
|
|
|
|
|
|
|
|
|
console.log(options.waitmsg || ('awaiting ' + command + ' ' + args.join(' '))) |
|
|
|
var shellresult = shellExec( 'cmd', [ '/c', runbat]) |
|
|
|
// var shellresult = shellExec( 'cmd', ['/c', runbat]) |
|
|
|
var shellresult = shellExec( command, args) |
|
|
|
// var shellresult = shellExec( command, args) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var wrapup = function(result) { |
|
|
|
// console.log('Wrapping up') |
|
|
|
try { |
|
|
|
// console.log('resolving.....................'); |
|
|
|
// console.log('--------------P' + result.messages.join(' ').trim() +'P--------------') |
|
|
|
// if(result.messages.join().trim()) resolve(result) |
|
|
|
// else reject(result) |
|
|
|
resolve(result) |
|
|
|
} |
|
|
|
catch(e){ |
|
|
|
// console.dir(e) |
|
|
|
if(e.message === 'Input past end of file') { |
|
|
|
// console.log('resolving'); console.dir(result) |
|
|
|
// console.log('---------------------------------------') |
|
|
|
// console.dir(result) |
|
|
|
resolve(result) |
|
|
|
} |
|
|
|
else { |
|
|
|
// console.dir(e) |
|
|
|
reject(e) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if(runFile){ |
|
|
|
var waitr = function(){ |
|
|
|
WScript.StdOut.write('.') |
|
|
|
if(existsSync(runFile)) { |
|
|
|
var strOutput = fs.readFileSync(runFile) |
|
|
|
shellresult.result.messages = [strOutput] |
|
|
|
wrapup(shellresult.result) |
|
|
|
sfs.unlinkSync(runFile) |
|
|
|
} |
|
|
|
wait( waitr, 500) |
|
|
|
} |
|
|
|
// console.log(wait) |
|
|
|
// if(runFile){ |
|
|
|
// var waitr = function(){ |
|
|
|
// WScript.StdOut.write('w.') |
|
|
|
// if(existsSync(runFile)) { |
|
|
|
// var strOutput = fs.readFileSync(runFile) |
|
|
|
// shellresult.result.messages = [strOutput] |
|
|
|
// wrapup(shellresult.result) |
|
|
|
// fs.unlinkSync(runFile) |
|
|
|
// } |
|
|
|
// // console.dir(shellresult.result) |
|
|
|
// wait( waitr, 500) |
|
|
|
// } |
|
|
|
// // console.log(wait) |
|
|
|
|
|
|
|
wait( waitr, 500) |
|
|
|
} |
|
|
|
else { |
|
|
|
// wait( waitr, 500) |
|
|
|
// } |
|
|
|
// else { |
|
|
|
// console.log('There is no runfile.') |
|
|
|
// console.log(shellresult.strOutput) |
|
|
|
|
|
|
|
wrapup(shellresult.result) |
|
|
|
} |
|
|
|
// } |
|
|
|
} |
|
|
|
p = new Promise(pworker) |
|
|
|
// promises.push(p) |
|
|
@@ -547,7 +586,7 @@ function createPromiseClass(overrides) { |
|
|
|
p.chain.push(thenfn) |
|
|
|
return p; |
|
|
|
} |
|
|
|
, pcatch : function(catchfn) { |
|
|
|
, 'catch' : function(catchfn) { |
|
|
|
catchfn.isCatch = true |
|
|
|
p.chain.push(catchfn) |
|
|
|
return p; |
|
|
@@ -578,8 +617,6 @@ function createPromiseClass(overrides) { |
|
|
|
, resolve : resolve |
|
|
|
, processchain : processchain |
|
|
|
} |
|
|
|
|
|
|
|
p['catch'] = p['pcatch'] |
|
|
|
p.chain.forEach = forEach; |
|
|
|
return p; |
|
|
|
} |
|
|
@@ -727,13 +764,10 @@ function __main( selectedinstance ){ |
|
|
|
var runFile = path.normalize(selectedinstance.root + '/.elxr/run-' + runtimestamp + '/' + stampedFilePfx(new Date()) + 'where' + command + "out.txt"); |
|
|
|
var p = nodeShellExec.apply(null, ['cmd', ['/c', 'where', command], { runFile : runFile } ]) |
|
|
|
p.runFile = runFile; |
|
|
|
var catchr = 'catch' |
|
|
|
// console.log(p['catch']) |
|
|
|
if(p['catch']) { catchr = 'catch' } else { catchr = 'pcatch';} |
|
|
|
if (options.ignorefailures) { |
|
|
|
return p.then(function(v) { |
|
|
|
// WScript.Echo('firstThen ' + v); |
|
|
|
return v })[catchr]( function(e) { |
|
|
|
return v })['catch']( function(e) { |
|
|
|
console.error(e); |
|
|
|
// Ignore. Not a major error if where command fails !!! |
|
|
|
throw e; |
|
|
@@ -800,6 +834,26 @@ function __main( selectedinstance ){ |
|
|
|
// return decision |
|
|
|
// } |
|
|
|
|
|
|
|
// prereq definition helpers. We can't do proper inheritance in cscript. So fallback to global functions. |
|
|
|
function exists(next){ |
|
|
|
var self = this; |
|
|
|
console.log('checking existence of ' + self.shellcmd) |
|
|
|
return getTaskCheckExists(self.shellcmd, { ignorefailures: true })().then(function(exists) { |
|
|
|
// console.log('-------------exists=======================') |
|
|
|
// console.dir(exists) |
|
|
|
// console.log(exists + ' ' + self.shellcmd + ' exists') |
|
|
|
if(exists && exists.messages.join(' ').indexOf(self.shellcmd) > -1 ) { |
|
|
|
return true; |
|
|
|
} |
|
|
|
else return false |
|
|
|
})['catch'](function(e){ |
|
|
|
// console.log('-------------exists catch=======================') |
|
|
|
console.dir(e) |
|
|
|
return false; |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var prerequisites = [ |
|
|
|
{ |
|
|
|
shellcmd: 'git', |
|
|
@@ -847,7 +901,7 @@ function __main( selectedinstance ){ |
|
|
|
var self = this; |
|
|
|
console.log('Git Installsteps called') |
|
|
|
var ifns = [self.installcmd] |
|
|
|
ifns.map = map; |
|
|
|
if(!ifns.map) ifns.map = map; |
|
|
|
return any(ifns.map(callsheltask))['catch'](function(e){ |
|
|
|
if(e.code === 1602) { |
|
|
|
console.warn("Installation was probably cancelled.") |
|
|
@@ -879,7 +933,7 @@ function __main( selectedinstance ){ |
|
|
|
, ['git', ['config', '--global', '--add', 'user.email', gitEmail]] |
|
|
|
] |
|
|
|
|
|
|
|
steps.map = map; |
|
|
|
if(!steps.map) steps.map = map; |
|
|
|
return any(steps.map(callsheltask)).then(function(){ |
|
|
|
|
|
|
|
}) |
|
|
@@ -897,17 +951,7 @@ function __main( selectedinstance ){ |
|
|
|
else return self.install(); |
|
|
|
}) |
|
|
|
} |
|
|
|
, exists : function(next){ |
|
|
|
var self = this; |
|
|
|
return getTaskCheckExists(self.shellcmd, { ignorefailures: true })().then(function(exists) { |
|
|
|
// console.dir(exists) |
|
|
|
// console.log(exists + ' git exists') |
|
|
|
if(exists && exists.messages.join(' ').indexOf(self.shellcmd) > -1 ) { |
|
|
|
return true; |
|
|
|
} |
|
|
|
else return false |
|
|
|
}) |
|
|
|
} |
|
|
|
, exists : exists |
|
|
|
, getUser : function(repo, onNoResult){ |
|
|
|
|
|
|
|
|
|
|
@@ -916,7 +960,7 @@ function __main( selectedinstance ){ |
|
|
|
if(!repo) globalOrLocal = '--global'; |
|
|
|
else globalOrLocal = '--local' |
|
|
|
var fns = [['git', ['config', globalOrLocal, '--get-all', 'user.name']]] |
|
|
|
fns.map = map; |
|
|
|
if(!ifns.map) ifns.map = map; |
|
|
|
return any(fns.map(callsheltask)).then(function(result){ |
|
|
|
// not yet configured. |
|
|
|
if(!result.success) return onNoResult() |
|
|
@@ -930,7 +974,7 @@ function __main( selectedinstance ){ |
|
|
|
else return users[0]; // PB : TODO == We should probably prompt with all the users available for selection ! |
|
|
|
} |
|
|
|
}) |
|
|
|
.pcatch(function(e){ |
|
|
|
['catch'](function(e){ |
|
|
|
console.log(e) |
|
|
|
return onNoResult() |
|
|
|
}) |
|
|
@@ -947,7 +991,7 @@ function __main( selectedinstance ){ |
|
|
|
, install : function() { |
|
|
|
var self = this; |
|
|
|
var ifns = [self.installcmd] |
|
|
|
ifns.map = map; |
|
|
|
if(!ifns.map) ifns.map = map; |
|
|
|
return any(ifns.map(callsheltask))['catch'](function(e){ |
|
|
|
if(e.code === 1602) { |
|
|
|
console.warn("Installation was probably cancelled.") |
|
|
@@ -956,19 +1000,7 @@ function __main( selectedinstance ){ |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
, exists : function(next){ |
|
|
|
var self = this; |
|
|
|
return getTaskCheckExists(self.shellcmd, { ignorefailures: true })().then(function(exists) { |
|
|
|
// console.log(self.shellcmd + ' ' + exists + ' node exists') |
|
|
|
if(exists && exists.messages.join(' ').indexOf(self.shellcmd) > -1 ) { |
|
|
|
return true |
|
|
|
} |
|
|
|
else { |
|
|
|
// console.log(self.shellcmd + ' ' + exists + ' node doesnt exist') |
|
|
|
return false |
|
|
|
} |
|
|
|
}) |
|
|
|
} |
|
|
|
, exists : exists |
|
|
|
, preinstallsteps: function() { |
|
|
|
var self = this; |
|
|
|
console.log('Node preinstall steps') |
|
|
@@ -991,6 +1023,81 @@ function __main( selectedinstance ){ |
|
|
|
// return any([any(steps), any(prompts)]) |
|
|
|
} |
|
|
|
} |
|
|
|
, |
|
|
|
{ |
|
|
|
shellcmd: 'elxr' |
|
|
|
, installcmd: [ isWin() ? 'npm.cmd' : 'npm' , ['link'], { cwd : selectedinstance.root + '\\elxr' /* cwd should be the cloned dir*/}] |
|
|
|
, preinstallsteps: function() { |
|
|
|
var self = this; |
|
|
|
console.log('Elxr preinstall steps') |
|
|
|
|
|
|
|
var steps = []; |
|
|
|
steps.push( |
|
|
|
function(){ |
|
|
|
console.log('Elxr PreInstallsteps called') |
|
|
|
var ifns = [ ['git', ['clone', 'http://git.bbh/chess\\elxr'] ] ] |
|
|
|
if(existsSyncFolder( selectedinstance.root + '\\elxr')) { |
|
|
|
if(existsSyncFolder( selectedinstance.root + '\\elxr\\.git')) { |
|
|
|
// PB : TODO -- use a elxr guid signature to detect more reliably folders named the same that is not us. |
|
|
|
ifns = [ ['git', ['pull'], { cwd : selectedinstance.root + '\\elxr' } ] ] |
|
|
|
} |
|
|
|
else { |
|
|
|
throw 'elxr subfolder not recognized as a git repository. Please cleanup and continue.' |
|
|
|
} |
|
|
|
} |
|
|
|
else console.log(selectedinstance.root + '\\elxr' + ' NOT FOUND ') |
|
|
|
if(!ifns.map) ifns.map = map; |
|
|
|
return any(ifns.map(callsheltask))['catch'](function(e){ |
|
|
|
if(e.code === 1602) { |
|
|
|
console.warn("Installation was probably cancelled.") |
|
|
|
} |
|
|
|
else throw e |
|
|
|
}) |
|
|
|
} |
|
|
|
) |
|
|
|
return any([any(steps)]) |
|
|
|
} |
|
|
|
, installsteps: function () { |
|
|
|
var self = this; |
|
|
|
console.log('Elxr Installsteps called') |
|
|
|
var ifns = [self.installcmd] |
|
|
|
if(!ifns.map) ifns.map = map; |
|
|
|
return any(ifns.map(callsheltask))['catch'](function(e){ |
|
|
|
if(e.code === 1602) { |
|
|
|
console.warn("Installation was probably cancelled.") |
|
|
|
} |
|
|
|
else throw e |
|
|
|
}) |
|
|
|
} |
|
|
|
, install: function () { |
|
|
|
var self = this; |
|
|
|
console.log('Elxr Install called') |
|
|
|
return any([ /*self.preinstallsteps,*/ function(){ return self.installsteps() } ]) |
|
|
|
} |
|
|
|
// , exists : function(){ |
|
|
|
// console.log('Elxr PreInstallsteps called') |
|
|
|
// var ifns = [ ['git', ['clone', 'http://git.bbh/chess\\elxr'] ] ] |
|
|
|
// if(existsSyncFolder( selectedinstance.root + '\\elxr')) { |
|
|
|
// if(existsSyncFolder( selectedinstance.root + '\\elxr\\.git')) { |
|
|
|
// // PB : TODO -- use a elxr guid signature to detect more reliably folders named the same that is not us. |
|
|
|
// ifns = [ ['git', ['pull'], { cwd : selectedinstance.root + '\\elxr' } ] ] |
|
|
|
// } |
|
|
|
// else { |
|
|
|
// throw 'elxr subfolder not recognized as a git repository. Please cleanup and continue.' |
|
|
|
// } |
|
|
|
// } |
|
|
|
// else console.log(selectedinstance.root + '\\elxr' + ' NOT FOUND ') |
|
|
|
// if(!ifns.map) ifns.map = map; |
|
|
|
// return any(ifns.map(callsheltask))['catch'](function(e){ |
|
|
|
// if(e.code === 1602) { |
|
|
|
// console.warn("Installation was probably cancelled.") |
|
|
|
// } |
|
|
|
// else throw e |
|
|
|
// }) |
|
|
|
// } |
|
|
|
, exists : exists |
|
|
|
|
|
|
|
} |
|
|
|
] |
|
|
|
|
|
|
|
if(!prerequisites.forEach) prerequisites.forEach = forEach; |
|
|
@@ -1000,6 +1107,6 @@ function __main( selectedinstance ){ |
|
|
|
// , downloadsdir + '/' + 'Git-2.32.0.2-64-bit.exe']).start() |
|
|
|
promises.push(verifyAndInstallPrerequisites()) |
|
|
|
|
|
|
|
if(wsh) startPromises(); |
|
|
|
startPromises(); |
|
|
|
} |
|
|
|
|