| global.env = process.env | |||||
| global.env.NODE_ENV = global.env.NODE_ENV || 'development' | |||||
| var __g = require('global-this'); | |||||
| __g.env = process.env | |||||
| __g.env.NODE_ENV = __g.env.NODE_ENV || 'development' | |||||
| const fs = require('fs') | const fs = require('fs') | ||||
| var path = require('path'); | var path = require('path'); | ||||
| var utils = require('bbhverse'); | var utils = require('bbhverse'); | ||||
| const cliargs = utils.cliargs; | |||||
| const processedArgs = cliargs(process.argv.slice(2)); | |||||
| if(!processedArgs.wd){ | |||||
| if(process.env.wd){ | |||||
| } | |||||
| else { | |||||
| process.env.wd = process.cwd(); | |||||
| if(process.cwd() === __dirname) { | |||||
| // This script was launched in the same dir. | |||||
| // We do not know if it was copied to some random location. Check if we have elxr installed in current location. Or subidr. | |||||
| process.env.wd = path.dirname( process.env.wd ); // Default to the parent. | |||||
| } | |||||
| } | |||||
| } | |||||
| else process.env.wd = processedArgs.wd | |||||
| var ENV = Object.assign({}, process.env); // Shallow clone it. | |||||
| const __ALIAS__STAMP__ = '9e7bebe0-1f57-11ec-8f88-778ffeea9d1b' | |||||
| const BUILD_VERSION = '[VI]Version: {version} - built on {date}[/VI]'; | |||||
| const runtimestamp = processedArgs.runtimestamp ? (new Date(processedArgs.runtimestamp)).getTime() : (new Date()).getTime(); | |||||
| function getVersion() { return BUILD_VERSION; } | |||||
| console.log(getVersion()); | |||||
| var selectedinstance = (function() { | |||||
| var __pvt = { root : process.env.wd || process.env.PWD } | |||||
| var __pub = { | |||||
| get root(){ return __pvt.root } | |||||
| , set root(val){ | |||||
| throw 'root has changed' | |||||
| // if the root changes for this run we need to relocate all the necessary files to that folder for this run. | |||||
| if(__pvt.root === val){ | |||||
| fsMove() | |||||
| return __pvt.root = val | |||||
| } | |||||
| else __pvt.root | |||||
| } | |||||
| } | |||||
| Object.defineProperty(__g, 'selectedinstance', { | |||||
| get(){ return __pub} | |||||
| , set( inst ){ __pvt = inst; return __pub } | |||||
| }) | |||||
| return __pub; | |||||
| })() | |||||
| var any = utils.any; | var any = utils.any; | ||||
| var Tasq = utils.Tasq | var Tasq = utils.Tasq | ||||
| var statuslog = utils.Traq | var statuslog = utils.Traq | ||||
| var Traq = utils.Traq | var Traq = utils.Traq | ||||
| Tasq.addlistener(statuslog.statuslog) | Tasq.addlistener(statuslog.statuslog) | ||||
| // fs.writeFileSync('run.log', ', ' + JSON.stringify( { m : 'Hello'} ), { 'flag': 'a+' }) | |||||
| Tasq.addlistener((e)=>{ fs.writeFileSync('run.log', ', ' + JSON.stringify( e ), { 'flag': 'a+' }) }) | |||||
| // Instead of waiting for the root to be establised we start working at the current locatoin and then relocate when root changes. | |||||
| var runlogjson = `${selectedinstance.root}/.elxr/run-${runtimestamp}/run.log` | |||||
| ensureDirectoryExistence(runlogjson) | |||||
| fs.writeFileSync(runlogjson, JSON.stringify( `Started ${runtimestamp}`)) // Initialize a new log file with "logrotate" for every run | |||||
| Tasq.addlistener((e)=>{ fs.writeFileSync(runlogjson, ', ' + JSON.stringify( e ), { 'flag': 'a+' }) }) | |||||
| var cli = require('./cliverse') | var cli = require('./cliverse') | ||||
| function isWin(){ return /^win/.test(process.platform) } | function isWin(){ return /^win/.test(process.platform) } | ||||
| if(isWin()) { | if(isWin()) { | ||||
| var shell_verse = lin_verse; | var shell_verse = lin_verse; | ||||
| } | } | ||||
| var nodeShellExec = cli.nodeShellExec; | var nodeShellExec = cli.nodeShellExec; | ||||
| var chalk = require('chalk') | var chalk = require('chalk') | ||||
| const homedir = require('os').homedir(); | const homedir = require('os').homedir(); | ||||
| function sysAddPathVar(addpath){ | function sysAddPathVar(addpath){ | ||||
| // Object.assign({ | // Object.assign({ | ||||
| // inherit: true, shell: true, env: ENV, title: `${command} ${args}` | // inherit: true, shell: true, env: ENV, title: `${command} ${args}` | ||||
| $newpath = $path + ';${addpath}' | $newpath = $path + ';${addpath}' | ||||
| [Environment]::SetEnvironmentVariable("PATH", $newpath, 'Machine')` | [Environment]::SetEnvironmentVariable("PATH", $newpath, 'Machine')` | ||||
| ]).then(() => { | ]).then(() => { | ||||
| fs.writeFileSync('run.done', 'success') | |||||
| fs.writeFileSync('run.done', 'success') // PB : TODO -- IPC through files is needed only for windows. | |||||
| }).catch(() => { | }).catch(() => { | ||||
| fs.writeFileSync('run.done', 'error') | fs.writeFileSync('run.done', 'error') | ||||
| }) | }) | ||||
| return any(tasks); | return any(tasks); | ||||
| } | } | ||||
| const __ALIAS__STAMP__ = '9e7bebe0-1f57-11ec-8f88-778ffeea9d1b' | |||||
| const BUILD_VERSION = '[VI]Version: {version} - built on {date}[/VI]'; | |||||
| const runtimestamp = (new Date()).getTime(); | |||||
| function getVersion() { return BUILD_VERSION; } | |||||
| console.log(getVersion()); | |||||
| // 'use strict'; | // 'use strict'; | ||||
| // PB : TODO -- make sure folder context is proper coz we can now run elxr from anywhere. | // PB : TODO -- make sure folder context is proper coz we can now run elxr from anywhere. | ||||
| } | } | ||||
| const existsFolderSync = existsSync; | const existsFolderSync = existsSync; | ||||
| const cliargs = utils.cliargs; | |||||
| const processedArgs = cliargs(process.argv.slice(2)); | |||||
| if(!processedArgs.wd){ | |||||
| if(process.env.wd){ | |||||
| } | |||||
| else { | |||||
| process.env.wd = process.cwd(); | |||||
| if(process.cwd() === __dirname) { | |||||
| // This script was launched in the same dir. | |||||
| // We do not know if it was copied to some random location. Check if we have elxr installed in current location. Or subidr. | |||||
| process.env.wd = path.dirname( process.env.wd ); // Default to the parent. | |||||
| } | |||||
| } | |||||
| } | |||||
| else process.env.wd = processedArgs.wd | |||||
| var ENV = Object.assign({}, process.env); // Shallow clone it. | |||||
| } | } | ||||
| ]; | ]; | ||||
| return any(tasks).then(() => { | return any(tasks).then(() => { | ||||
| fs.writeFileSync('run.done', 'success') | |||||
| fs.writeFileSync('run.done', 'success') // PB : TODO -- IPC through files is needed only for windows. | |||||
| }).catch(() => { | }).catch(() => { | ||||
| fs.writeFileSync('run.done', 'error') | fs.writeFileSync('run.done', 'error') | ||||
| }) | }) | ||||
| selectedinstance.instanceName && runconfig.use === selectedinstance.instanceName) { | selectedinstance.instanceName && runconfig.use === selectedinstance.instanceName) { | ||||
| console.log(`No change detected. Already using requested specs : ${runconfig.NODE_ENV} ${runconfig.use}`) | console.log(`No change detected. Already using requested specs : ${runconfig.NODE_ENV} ${runconfig.use}`) | ||||
| if (processedArgs.runas) { fs.writeFileSync('run.done', 'success') } | |||||
| if (processedArgs.runas) { fs.writeFileSync('run.done', 'success') } // PB : TODO -- IPC through files is needed only for windows. | |||||
| if (existsSync('config') && existsSync('data')){ | if (existsSync('config') && existsSync('data')){ | ||||
| return | return | ||||
| } | } | ||||
| console.warn('elevated repo manifest has obsolete format. Attempting upgrade.') | console.warn('elevated repo manifest has obsolete format. Attempting upgrade.') | ||||
| selectedinstance.elevated = selectedinstance.elevated.map(function(repo){ return { repo } }) | selectedinstance.elevated = selectedinstance.elevated.map(function(repo){ return { repo } }) | ||||
| } | } | ||||
| chessinstances[selected.instanceName][selected.node_env] = selectedinstance = utils.assign_core( { arraymergetype : utils.assign_core.DISTINCT_UNION } | |||||
| chessinstances[selected.instanceName][selected.node_env] = selectedinstance = __g.selectedinstance = utils.assign_core( { arraymergetype : utils.assign_core.DISTINCT_UNION } | |||||
| , selected, selectedinstance) | , selected, selectedinstance) | ||||
| chessinstances[selected.instanceName][selected.node_env].reposervers = Array.from(new Set(chessinstances[selected.instanceName][selected.node_env].reposervers)) | chessinstances[selected.instanceName][selected.node_env].reposervers = Array.from(new Set(chessinstances[selected.instanceName][selected.node_env].reposervers)) | ||||
| selectedinstance.reposerver = selectedinstance.reposerver || selectedinstance.reposervers[0] // PB : TODO -- Attempt first one that is available and online... | selectedinstance.reposerver = selectedinstance.reposerver || selectedinstance.reposervers[0] // PB : TODO -- Attempt first one that is available and online... | ||||
| console.warn('elevated repo manifest has obsolete format. Attempting upgrade.') | console.warn('elevated repo manifest has obsolete format. Attempting upgrade.') | ||||
| selectedinstance.elevated = selectedinstance.elevated.map(function(repo){ return { repo } }) | selectedinstance.elevated = selectedinstance.elevated.map(function(repo){ return { repo } }) | ||||
| } | } | ||||
| chessinstances[selected.instanceName][selected.node_env] = selectedinstance = utils.assign_core( { arraymergetype : utils.assign_core.DISTINCT_UNION } | |||||
| chessinstances[selected.instanceName][selected.node_env] = selectedinstance = __g.selectedinstance = utils.assign_core( { arraymergetype : utils.assign_core.DISTINCT_UNION } | |||||
| , selected, selectedinstance) | , selected, selectedinstance) | ||||
| chessinstances[selected.instanceName][selected.node_env].reposervers = Array.from(new Set(chessinstances[selected.instanceName][selected.node_env].reposervers)) | chessinstances[selected.instanceName][selected.node_env].reposervers = Array.from(new Set(chessinstances[selected.instanceName][selected.node_env].reposervers)) | ||||
| selectedinstance.reposerver = selectedinstance.reposerver || selectedinstance.reposervers[0] // PB : TODO -- Attempt first one that is available and online... | selectedinstance.reposerver = selectedinstance.reposerver || selectedinstance.reposervers[0] // PB : TODO -- Attempt first one that is available and online... | ||||
| // function updateselection(selected) { selectedinstance = utils.assign(selectedinstance, selected) } | // function updateselection(selected) { selectedinstance = utils.assign(selectedinstance, selected) } | ||||
| var selectedinstance = { root : process.env.wd }; | |||||
| var runconfig = null; | var runconfig = null; | ||||
| var chessinstances = { current_run : {} }; | var chessinstances = { current_run : {} }; | ||||
| // PB : TODO -- We now have options that can be passed into assign_core to control this behavior. | // PB : TODO -- We now have options that can be passed into assign_core to control this behavior. | ||||
| if(selected_overrides.node_env === undefined) delete selected_overrides.node_env | if(selected_overrides.node_env === undefined) delete selected_overrides.node_env | ||||
| selectedinstance = utils.assign_core( { arraymergetype : utils.assign_core.DISTINCT_UNION } | |||||
| selectedinstance = __g.selectedinstance = utils.assign_core( { arraymergetype : utils.assign_core.DISTINCT_UNION } | |||||
| , __default | , __default | ||||
| , chessinstances[instanceName][node_env] | , chessinstances[instanceName][node_env] | ||||
| , clioverrides | , clioverrides | ||||
| var timer = function(){ | var timer = function(){ | ||||
| l('.'); | l('.'); | ||||
| if(fso.FileExists("run.done")) { | if(fso.FileExists("run.done")) { | ||||
| fso.DeleteFile('run.done') | |||||
| fso.DeleteFile('run.done') // PB : TODO -- IPC through files is needed only for windows we need to do it per run... | |||||
| close(); | close(); | ||||
| } | } | ||||
| else window.setTimeout(timer, 1000); | else window.setTimeout(timer, 1000); | ||||
| var cmdprompts = cmdinstance.getPossiblePrompts() | var cmdprompts = cmdinstance.getPossiblePrompts() | ||||
| selectedinstance.node_env ? selectedinstance.node_env : selectedinstance.node_env = clioverrides.node_env | selectedinstance.node_env ? selectedinstance.node_env : selectedinstance.node_env = clioverrides.node_env | ||||
| // PB : TODO -- Most recent should be at the tip ! at index 0 so utils.reverseassign is required !!! | // PB : TODO -- Most recent should be at the tip ! at index 0 so utils.reverseassign is required !!! | ||||
| selectedinstance = utils.assign_core( { arraymergetype : utils.assign_core.DISTINCT_UNION } | |||||
| selectedinstance = __g.selectedinstance = utils.assign_core( { arraymergetype : utils.assign_core.DISTINCT_UNION } | |||||
| , ...detectedinstanceoptions.slice(-2), promptkeys ) | , ...detectedinstanceoptions.slice(-2), promptkeys ) | ||||
| // promptkeys = utils.assign(promptkeys, clioverrides) | // promptkeys = utils.assign(promptkeys, clioverrides) | ||||