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