|  |  | @@ -297,7 +297,10 @@ var callshelltask = (args) => { | 
		
	
		
			
			|  |  |  | var getCmdString = function(args){ return `"${args[0]} ${args[1].join(' ')}"` } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var getshelltask = (args) => { | 
		
	
		
			
			|  |  |  | return args[0] === 'rm' ? getgitbashtask(args) : () => { return nodeShellExec.apply(null, args) } } | 
		
	
		
			
			|  |  |  | return args[0] === 'rm' ? getgitbashtask(args) : () => { | 
		
	
		
			
			|  |  |  | return nodeShellExec.apply(null, args).catch(function(e){ e.benign = args[2].benign; if(!e.benign) {console.error(e); throw e} }) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | var getgitbashtask = (args, onEachError) => { return () => { | 
		
	
		
			
			|  |  |  | return nodeShellExec( `"${gitbash}"`, ['-c', getCmdString(args)], args[2]).catch( onEachError || function(e){ console.error(e) }) } | 
		
	
		
			
			|  |  |  | } | 
		
	
	
		
			
			|  |  | @@ -324,10 +327,10 @@ var gitops = { | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var getPullCmd = (repo, branch) => { | 
		
	
		
			
			|  |  |  | var getPullCmd = (repodef, branch) => { | 
		
	
		
			
			|  |  |  | // console.log(useGitPull)var getPullCmd = (repo, branch) => { | 
		
	
		
			
			|  |  |  | // console.log(useGitPull) | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | var repo = repodef.repo | 
		
	
		
			
			|  |  |  | var pullCmd = [] | 
		
	
		
			
			|  |  |  | if(!branch) { | 
		
	
		
			
			|  |  |  | // console.warn('No branch was specified detecting from working client.') | 
		
	
	
		
			
			|  |  | @@ -403,12 +406,41 @@ var getPullTask = (repodef, branch, repoowner, errHandler, elevatedBatch, regula | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (exists) { | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | // Add the remotes | 
		
	
		
			
			|  |  |  | var tasks = [] | 
		
	
		
			
			|  |  |  | var selectedremotes = Array.from( new Set(selectedinstance.selectedremotes.concat(Object.keys(repodef.remotes || {})))); | 
		
	
		
			
			|  |  |  | var repoRemotes = Object.assign( {}, selectedinstance.remotes, repodef.remotes ); | 
		
	
		
			
			|  |  |  | selectedremotes.forEach((remotename)=>{ | 
		
	
		
			
			|  |  |  | var ai_RemoteAddNeeded = (info)=>{ return true }; // ai prefix for all apis that require an answer if choice is needed. | 
		
	
		
			
			|  |  |  | tasks.push( | 
		
	
		
			
			|  |  |  | ()=>{ | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | return op['remote exists']({ | 
		
	
		
			
			|  |  |  | remotename, repo, benign : true, ignorefailures : true | 
		
	
		
			
			|  |  |  | , url : repoRemotes[remotename].url || processedArgs._[3] | 
		
	
		
			
			|  |  |  | , branch : processedArgs._[4] | 
		
	
		
			
			|  |  |  | }).then( (r) => { | 
		
	
		
			
			|  |  |  | if(!r[1]) return false; // PB : TODO -- Not accessible skip for now probably should remove. | 
		
	
		
			
			|  |  |  | else if(r[0]) return true; // Already added nothing to do | 
		
	
		
			
			|  |  |  | else if(ai_RemoteAddNeeded()) return op['remote add']( { remotename, | 
		
	
		
			
			|  |  |  | 'set-upstream' : remotename === selectedinstance['upstream-remote'] //remote.upstream ??? when url accessible... in order of highest priority | 
		
	
		
			
			|  |  |  | , url : remote.url, branch : checkoutMap[runconfig.NODE_ENV] || runconfig.NODE_ENV | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | // else skipped as remote is not relevant for this repo... | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | ) | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var branchprint =  branch ? ' branch :' + branch  : ''; | 
		
	
		
			
			|  |  |  | var task = ()=>{ | 
		
	
		
			
			|  |  |  | console.log('pulling ' + instanceroot + '/' + repo + branchprint ) | 
		
	
		
			
			|  |  |  | return nodeShellExec.apply(null, getPullCmd(repo, branch)).then(() => { | 
		
	
		
			
			|  |  |  | return true; | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | return any(tasks).then( ()=>{ | 
		
	
		
			
			|  |  |  | return nodeShellExec.apply(null, getPullCmd(repodef, branch)).then(() => { | 
		
	
		
			
			|  |  |  | return true; | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | initTask(task) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
			|  |  | @@ -490,6 +522,10 @@ var dbForLabel = function (label) { | 
		
	
		
			
			|  |  |  | return dbsForLabel[label] || 'mysql' | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // Maps an environment to a branch. Not required if the branch is appropriately named. | 
		
	
		
			
			|  |  |  | var checkoutMap = { 'development': 'master' } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // SAM : TODO Use nodeshellexec where to detect git installation dir | 
		
	
		
			
			|  |  |  | var gitbash = shell_verse.getbash() | 
		
	
		
			
			|  |  |  | // var gitbash = "G:\\Installed\\Git\\bin\\sh.exe" | 
		
	
	
		
			
			|  |  | @@ -627,6 +663,7 @@ var op = { | 
		
	
		
			
			|  |  |  | // git push origin master | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var repo = processedArgs._[1]; | 
		
	
		
			
			|  |  |  | var remote = 'origin' | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var sequentialTaskShellCommands = []; | 
		
	
		
			
			|  |  |  | if (!existsSync(`Z:/${repo}.git`)) { | 
		
	
	
		
			
			|  |  | @@ -648,10 +685,10 @@ var op = { | 
		
	
		
			
			|  |  |  | , env: process.env | 
		
	
		
			
			|  |  |  | }] | 
		
	
		
			
			|  |  |  | // PB : TODO -- Do this conditionally only... | 
		
	
		
			
			|  |  |  | , ['git', ['remote', 'rename', 'origin', 'githubclone'], { cwd: `${instanceroot + '/' + repo}` }, (err) => { | 
		
	
		
			
			|  |  |  | console.log('Ignoring origin rename error : ' + err); return true; //return true to continue. | 
		
	
		
			
			|  |  |  | , ['git', ['remote', 'rename', remote, 'githubclone'], { cwd: `${instanceroot + '/' + repo}` }, (err) => { | 
		
	
		
			
			|  |  |  | console.log(`Ignoring ${remote} rename error : ` + err); return true; //return true to continue. | 
		
	
		
			
			|  |  |  | }] // PB ; Todo -- new repositories created locally will not have origin. Handle this failure. | 
		
	
		
			
			|  |  |  | , ['git', ['remote', 'add', 'origin', `${selectedinstance.reposerver}/${repo}.git`], { cwd: `${instanceroot + '/' + repo}` }] | 
		
	
		
			
			|  |  |  | , ['git', ['remote', 'add', remote, `${selectedinstance.reposerver}/${repo}.git`], { cwd: `${instanceroot + '/' + repo}` }] | 
		
	
		
			
			|  |  |  | // PB : TODO -- If threre is a gitbubclone origin | 
		
	
		
			
			|  |  |  | // Set the master to pull from the local repo. | 
		
	
		
			
			|  |  |  | ] | 
		
	
	
		
			
			|  |  | @@ -665,7 +702,7 @@ var op = { | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | sequentialTaskShellCommands.push(['git', ['push', 'origin', 'master'], { cwd: `${instanceroot + '/' + repo}` }]) | 
		
	
		
			
			|  |  |  | sequentialTaskShellCommands.push(['git', ['push', remote, 'master'], { cwd: `${instanceroot + '/' + repo}` }]) | 
		
	
		
			
			|  |  |  | // console.dir(sequentialTaskShellCommands); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var tasks = []; | 
		
	
	
		
			
			|  |  | @@ -795,50 +832,66 @@ var op = { | 
		
	
		
			
			|  |  |  | var commands = [ | 
		
	
		
			
			|  |  |  | // git remote -v| while read remote; do "${remote#origin/}" "$remote"; done | 
		
	
		
			
			|  |  |  | // ['git', ['remote', '-v', '| while read remote; do "${remote#origin/}" "$remote"; done'], utils.assign( { | 
		
	
		
			
			|  |  |  | ['git', ['remote', '-v'], utils.assign( { | 
		
	
		
			
			|  |  |  | evaluateResult : function(err, result){ | 
		
	
		
			
			|  |  |  | // var found = result.messages.find( (r)=> { return r.includes( __args.remotename )  }) | 
		
	
		
			
			|  |  |  | var remotes = [] | 
		
	
		
			
			|  |  |  | var found = false; | 
		
	
		
			
			|  |  |  | console.dir(result.messages) | 
		
	
		
			
			|  |  |  | console.log(result + '---------------') | 
		
	
		
			
			|  |  |  | result.messages.forEach( (line)=> { | 
		
	
		
			
			|  |  |  | console.log(line + '$$$$$$$$$$$$$$$$$$$$') | 
		
	
		
			
			|  |  |  | var matches = line.match(/(.*)?\s\s([^\(]*)?\s?\(?([^\)]*)\)?/); | 
		
	
		
			
			|  |  |  | if(matches) { | 
		
	
		
			
			|  |  |  | var remote = {}; | 
		
	
		
			
			|  |  |  | remote[matches[1]] = matches[2]; | 
		
	
		
			
			|  |  |  | if( (!matches[3].trim() ||  matches[3].trim() === 'fetch') && matches[1].trim() === remotename.trim()) { | 
		
	
		
			
			|  |  |  | found = true; | 
		
	
		
			
			|  |  |  | result.url = remote[remotename]; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | console.dir(remotes) | 
		
	
		
			
			|  |  |  | return [ | 
		
	
		
			
			|  |  |  | found | 
		
	
		
			
			|  |  |  | , result | 
		
	
		
			
			|  |  |  | ] | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } , options) ] | 
		
	
		
			
			|  |  |  | [ | 
		
	
		
			
			|  |  |  | // 'git', ['remote', '-v'] | 
		
	
		
			
			|  |  |  | 'git', ['config', `remote.${__args.remotename}.url`] | 
		
	
		
			
			|  |  |  | , utils.assign_core( { arraymergetype : utils.assign_core.DISTINCT_UNION } | 
		
	
		
			
			|  |  |  | , { | 
		
	
		
			
			|  |  |  | benign : args.benign, ignorefailures : args.ignorefailures, | 
		
	
		
			
			|  |  |  | evaluateResult : function(err, result){ | 
		
	
		
			
			|  |  |  | // var found = result.messages.find( (r)=> { return r.includes( __args.remotename )  }) | 
		
	
		
			
			|  |  |  | console.log(__args.remotename) | 
		
	
		
			
			|  |  |  | var remotes = [] | 
		
	
		
			
			|  |  |  | var found = false; | 
		
	
		
			
			|  |  |  | if(+result.code === 0) found = true; | 
		
	
		
			
			|  |  |  | // console.dir(result.messages) | 
		
	
		
			
			|  |  |  | // console.log(result + '---------------') | 
		
	
		
			
			|  |  |  | // result.messages.forEach( (line)=> { | 
		
	
		
			
			|  |  |  | //   console.log(line + '$$$$$$$$$$$$$$$$$$$$') | 
		
	
		
			
			|  |  |  | //   var matches = line.match(/(.*)?\s\s([^\(]*)?\s?\(?([^\)]*)\)?/); | 
		
	
		
			
			|  |  |  | //   if(matches) { | 
		
	
		
			
			|  |  |  | //     var remote = {}; | 
		
	
		
			
			|  |  |  | //     remote[matches[1]] = matches[2]; | 
		
	
		
			
			|  |  |  | //     if( (!matches[3].trim() ||  matches[3].trim() === 'fetch') && matches[1].trim() === remotename.trim()) { | 
		
	
		
			
			|  |  |  | //       found = true; | 
		
	
		
			
			|  |  |  | //       result.url = remote[remotename]; | 
		
	
		
			
			|  |  |  | //     } | 
		
	
		
			
			|  |  |  | //   } | 
		
	
		
			
			|  |  |  | // }) | 
		
	
		
			
			|  |  |  | console.dir(remotes) | 
		
	
		
			
			|  |  |  | return [ | 
		
	
		
			
			|  |  |  | found | 
		
	
		
			
			|  |  |  | , result | 
		
	
		
			
			|  |  |  | ] | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } , options) ] | 
		
	
		
			
			|  |  |  | , function(prevserialtaskresult) { | 
		
	
		
			
			|  |  |  | if(!prevserialtaskresult) return [[ false, null], [ false, null]] | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if(!prevserialtaskresult) return [[ false, null], [ false, null]] | 
		
	
		
			
			|  |  |  | console.log('================================') | 
		
	
		
			
			|  |  |  | var url = __args || prevserialtaskresult.url; | 
		
	
		
			
			|  |  |  | console.dir(prevserialtaskresult) | 
		
	
		
			
			|  |  |  | return getshelltask(['git', ['ls-remote', url], utils.assign( { | 
		
	
		
			
			|  |  |  | evaluateResult : function(err, result){ | 
		
	
		
			
			|  |  |  | // fatal: unable to access '${__args.url}/': Failed to connect to git.bbh port 80 after 21025 ms: Timed out | 
		
	
		
			
			|  |  |  | // `fatal: repository '${__args.url}/' not found` | 
		
	
		
			
			|  |  |  | var hasfailed = /^fatal: .*/.test(result.messages.join(' ')) | 
		
	
		
			
			|  |  |  | return [ | 
		
	
		
			
			|  |  |  | !hasfailed, result | 
		
	
		
			
			|  |  |  | ] | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } , options) ])() | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | return getshelltask(['git', ['ls-remote', url], utils.assign_core( { arraymergetype : utils.assign_core.DISTINCT_UNION } | 
		
	
		
			
			|  |  |  | , { | 
		
	
		
			
			|  |  |  | benign : args.benign, | 
		
	
		
			
			|  |  |  | evaluateResult : function(err, result){ | 
		
	
		
			
			|  |  |  | // fatal: unable to access '${__args.url}/': Failed to connect to git.bbh port 80 after 21025 ms: Timed out | 
		
	
		
			
			|  |  |  | // `fatal: repository '${__args.url}/' not found` | 
		
	
		
			
			|  |  |  | var hasfailed = /^fatal: .*/.test(result.messages.join(' ')) | 
		
	
		
			
			|  |  |  | return [ | 
		
	
		
			
			|  |  |  | !hasfailed, result | 
		
	
		
			
			|  |  |  | ] | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } , options) ])().catch( e => { | 
		
	
		
			
			|  |  |  | console.error(e) | 
		
	
		
			
			|  |  |  | return [[ false, null], [ false, null]] | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | ] | 
		
	
		
			
			|  |  |  | var mapped = commands.map(callshelltask)  //.map( p => p.catch(e => e)) // Handle errors later. | 
		
	
		
			
			|  |  |  | return any(mapped).then( allresolved =>{ | 
		
	
		
			
			|  |  |  | return any(mapped, true).then( allresolved =>{ | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | console.dir(allresolved) | 
		
	
		
			
			|  |  |  | !allresolved[0][0] && !allresolved[1][0] ? console.log('was not added as a remote and url is currently inaccessible.') | 
		
	
		
			
			|  |  |  | : allresolved[0][0] && allresolved[1][0] ? console.log('was added as a remote and url is accessible.') | 
		
	
	
		
			
			|  |  | @@ -849,6 +902,9 @@ var op = { | 
		
	
		
			
			|  |  |  | : allresolved[0][0] && allresolved[1][0] ? [1, 1]   // => was added as a remote and url is accessible. | 
		
	
		
			
			|  |  |  | : allresolved[0][0] && !allresolved[1][0] ? [1, 0]  // => was added as a remote but url is currently inaccessible. | 
		
	
		
			
			|  |  |  | : [0, 1]  // => was not added and remote and url is accessible. | 
		
	
		
			
			|  |  |  | }).catch(e => { | 
		
	
		
			
			|  |  |  | console.log(e) | 
		
	
		
			
			|  |  |  | return [0, 0] | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
			|  |  | @@ -883,6 +939,8 @@ var op = { | 
		
	
		
			
			|  |  |  | Object.keys(remote).forEach(remotename => { | 
		
	
		
			
			|  |  |  | __args.remotename = remotename | 
		
	
		
			
			|  |  |  | __args.url = remote[remotename] | 
		
	
		
			
			|  |  |  | __args.benign = true | 
		
	
		
			
			|  |  |  | __args.ignorefailures = true | 
		
	
		
			
			|  |  |  | promises.push( op['remote exists']( __args ).then( exists => { | 
		
	
		
			
			|  |  |  | if(!exists[0]) { | 
		
	
		
			
			|  |  |  | if(!exists[1]) { console.error( `Skipping inaccessible remote url ${__args.url}` ) } | 
		
	
	
		
			
			|  |  | @@ -918,9 +976,10 @@ var op = { | 
		
	
		
			
			|  |  |  | // alias pullall='for i in `git remote`; do git pull $i; done;' | 
		
	
		
			
			|  |  |  | // args === processedArgs ? args = {} : null; | 
		
	
		
			
			|  |  |  | var __args = { | 
		
	
		
			
			|  |  |  | remotename : args.remotename|| processedArgs._[2] | 
		
	
		
			
			|  |  |  | remotename : args.remotename|| processedArgs._[2] | 
		
	
		
			
			|  |  |  | , url : args.url || processedArgs._[3] | 
		
	
		
			
			|  |  |  | , branch : args.branch || processedArgs._[4] | 
		
	
		
			
			|  |  |  | , 'set-upstream' : args['set-upstream'] || processedArgs._[5] | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | var remotename = __args.remotename | 
		
	
	
		
			
			|  |  | @@ -934,22 +993,23 @@ var op = { | 
		
	
		
			
			|  |  |  | var options = { cwd: instanceroot + '/' + repo } | 
		
	
		
			
			|  |  |  | // console.log(repo) | 
		
	
		
			
			|  |  |  | if (pushable) { | 
		
	
		
			
			|  |  |  | return [ | 
		
	
		
			
			|  |  |  | var gacmds =  [ | 
		
	
		
			
			|  |  |  | ['git', ['remote', 'add', remotename, url + '/' + repo], { cwd: instanceroot + '/' + repo }] | 
		
	
		
			
			|  |  |  | , ['git', ['pull', remotename, branch], { cwd: instanceroot + '/' + repo }] | 
		
	
		
			
			|  |  |  | , ['git', ['branch', `--set-upstream-to=${remotename}/${branch}`, branch], { cwd: instanceroot + '/' + repo }] | 
		
	
		
			
			|  |  |  | // , ['git', ['branch', `--set-upstream-to=${remotename}/${branch}`, branch], { cwd: instanceroot + '/' + repo }] | 
		
	
		
			
			|  |  |  | ] | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | else { | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | return [ | 
		
	
		
			
			|  |  |  | var gacmds =   [ | 
		
	
		
			
			|  |  |  | ['git', ['remote', 'add', remotename, url + '/' + repo], { cwd: instanceroot + '/' + repo }] | 
		
	
		
			
			|  |  |  | , ['git', ['remote', `set-url`, '--push', remotename, 'no-pushing'], { cwd: instanceroot + '/' + repo }] | 
		
	
		
			
			|  |  |  | , ['git', ['pull', remotename, branch], { cwd: instanceroot + '/' + repo }] | 
		
	
		
			
			|  |  |  | , ['git', ['branch', `--set-upstream-to=${remotename}/${branch}`, branch], { cwd: instanceroot + '/' + repo }] | 
		
	
		
			
			|  |  |  | // When we add a remote it should not automatically become the upstream. The upstream should be a chosen remote else we do not change | 
		
	
		
			
			|  |  |  | // , ['git', ['branch', `--set-upstream-to=${remotename}/${branch}`, branch], { cwd: instanceroot + '/' + repo }] | 
		
	
		
			
			|  |  |  | ] | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | if(args['set-upstream']) gacmds.push(['git', ['branch', `--set-upstream-to=${remotename}/${branch}`, branch], { cwd: instanceroot + '/' + repo }]) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | var x = (args) => { | 
		
	
		
			
			|  |  |  | return () => { | 
		
	
	
		
			
			|  |  | @@ -1027,9 +1087,9 @@ var op = { | 
		
	
		
			
			|  |  |  | var options = { cwd: instanceroot + '/' + repo } | 
		
	
		
			
			|  |  |  | // console.log(repo) | 
		
	
		
			
			|  |  |  | return [ | 
		
	
		
			
			|  |  |  | ['git', ['remote', 'add', 'chess', `${selectedinstance.reposerver}/${user}/${repo}.git`], { cwd: instanceroot + '/' + repo }] | 
		
	
		
			
			|  |  |  | ['git', ['remote', 'add', 'chess', `${selectedinstance.reposerver}/${user}/${repo}.git`], { cwd: instanceroot + '/' + repo }] | 
		
	
		
			
			|  |  |  | , ['git', ['remote', 'set-url', '--push', 'chess', 'no-pushing'], { cwd: instanceroot + '/' + repo }] | 
		
	
		
			
			|  |  |  | , ['git', ['remote', 'set-url', 'origin', `${selectedinstance.reposerver}/${user}/${repo}.git`], { cwd: instanceroot + '/' + repo }] | 
		
	
		
			
			|  |  |  | , ['git', ['remote', 'set-url', 'userfork', `${selectedinstance.reposerver}/${user}/${repo}.git`], { cwd: instanceroot + '/' + repo }] | 
		
	
		
			
			|  |  |  | ] | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | var x = (args) => { | 
		
	
	
		
			
			|  |  | @@ -1602,8 +1662,6 @@ var op = { | 
		
	
		
			
			|  |  |  | 4) Iterates all repos and checkout to the ENV specified. 'git', ['checkout', checkoutMap[runconfig.NODE_ENV] || runconfig.NODE_ENV] | 
		
	
		
			
			|  |  |  | 5) Iterates all repos and merge from source configured in mergesource. 'git', ['merge', mergesource], | 
		
	
		
			
			|  |  |  | */ | 
		
	
		
			
			|  |  |  | var runconfig = { NODE_ENV: selectedinstance.node_env } | 
		
	
		
			
			|  |  |  | try { runconfig = Object.assign(runconfig, require(instanceroot + '/run.js')) } catch (e) { } | 
		
	
		
			
			|  |  |  | // We no longer need to check ruans.. ??? if we were initiated from self invoked privileged shell ? | 
		
	
		
			
			|  |  |  | if (( /*processedArgs.runas && processedArgs.runas !== 'self' &&*/ !processedArgs.force) && | 
		
	
		
			
			|  |  |  | runconfig.NODE_ENV && runconfig.NODE_ENV === (selectedinstance.node_env || runconfig.NODE_ENV) && | 
		
	
	
		
			
			|  |  | @@ -1651,9 +1709,6 @@ var op = { | 
		
	
		
			
			|  |  |  | // console.log(process.env.cwd) | 
		
	
		
			
			|  |  |  | fs.writeFileSync(instanceroot + '/run.js', 'module.exports = ' + JSON.stringify(runconfig)) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // Maps an environment to a branch. Not required if the branch is appropriately named. | 
		
	
		
			
			|  |  |  | var checkoutMap = { 'development': 'master' } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var branch = checkoutMap[runconfig.NODE_ENV] || runconfig.NODE_ENV | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | var performPullOrCloneForBranch = (def)=>{ | 
		
	
	
		
			
			|  |  | @@ -2173,7 +2228,8 @@ var elxrcmd = (function(){ | 
		
	
		
			
			|  |  |  | // console.log(o) | 
		
	
		
			
			|  |  |  | subs.forEach(sub=>elxrcmd.create( cmds[subcommandlabelFor(o.cmd, sub)] )) | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | var created = utils.assign_strict({}, __cmd, cmds[o.cmd], o) | 
		
	
		
			
			|  |  |  | var created = utils.assign_core( { keycase: true, arraymergetype : utils.assign_core.DISTINCT_UNION } | 
		
	
		
			
			|  |  |  | , {}, __cmd, cmds[o.cmd], o) | 
		
	
		
			
			|  |  |  | cmds[o.cmd] = created; | 
		
	
		
			
			|  |  |  | op[o.cmd] = created.cmdFn; | 
		
	
		
			
			|  |  |  | noprerequisites[o.cmd] = created.noprerequisites | 
		
	
	
		
			
			|  |  | @@ -2548,7 +2604,8 @@ var mergeObjByKey = function(arrOfObjs, keyName) { | 
		
	
		
			
			|  |  |  | if(o) (keyedDistinct[o[keyName]] || (keyedDistinct[o[keyName]] = []) ).push(o) | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | Object.keys(keyedDistinct).forEach(key => { | 
		
	
		
			
			|  |  |  | distinctArrOfObjs.push(  utils.assign( ...keyedDistinct[key] ) ) // PB : TODO -- Shallow use utils.assign | 
		
	
		
			
			|  |  |  | distinctArrOfObjs.push(  utils.assign_core( { arraymergetype : utils.assign_core.DISTINCT_UNION } | 
		
	
		
			
			|  |  |  | , ...keyedDistinct[key] ) ) // PB : TODO -- Shallow use utils.assign | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | return distinctArrOfObjs; | 
		
	
	
		
			
			|  |  | @@ -2562,22 +2619,35 @@ var cacheWriteInstanceConfig = function(chessinstances){ | 
		
	
		
			
			|  |  |  | fs.writeFileSync(instanceroot + '/chessinstances.js', 'module.exports = ' + JSON.stringify(chessinstances, null, 2) + '', { 'flag': 'w' }) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var os = require("os"); | 
		
	
		
			
			|  |  |  | var hostname = os.hostname(); | 
		
	
		
			
			|  |  |  | var clustername = null; // PB : TODO -- Prompt to acquire. | 
		
	
		
			
			|  |  |  | var configs = (function(){ | 
		
	
		
			
			|  |  |  | return { | 
		
	
		
			
			|  |  |  | clusterNodeInstance(selected) { var clusternodename = 'node01' | 
		
	
		
			
			|  |  |  | return __acquireConfig(selected, selected.username, clusternodename | 
		
	
		
			
			|  |  |  | // We need to discover and use the most specialized config available. | 
		
	
		
			
			|  |  |  | // Two passes are required as the config currently cloned may be switched by the discovery. | 
		
	
		
			
			|  |  |  | // If the repo name is the same but has different remotes the newly acquired config from multiple remotes may | 
		
	
		
			
			|  |  |  | // iteself redefine the remotes, repos and servers for the config which we need to honor.. | 
		
	
		
			
			|  |  |  | return { | 
		
	
		
			
			|  |  |  | ownerClusterNodeConfig(selected) { | 
		
	
		
			
			|  |  |  | // Hostname and therefore clusternodename can be anything and can participate in many clusters. | 
		
	
		
			
			|  |  |  | // Also many cluster node instance can be running as a set of services on the same host on the same port with ( specific domain names ) | 
		
	
		
			
			|  |  |  | var clusternodename = hostname || `CHESS0001${selected.username}`; // Cluster node names need to be unique accross all clusters to avoid collitions. | 
		
	
		
			
			|  |  |  | clustername = clustername || `${selected.username}-CHESS-${selected.node_env}`; | 
		
	
		
			
			|  |  |  | return __acquireConfig(selected, { remote : 'userfork' } // PB : TODO -- accessiblity state should switch to public etc.. | 
		
	
		
			
			|  |  |  | , selected.instanceName + '-config-' + selected.node_env + `-${clusternodename}` | 
		
	
		
			
			|  |  |  | , function(e){ console.info('Customized node level config not found. This is not an Error. Will attempt with owner level config.'); | 
		
	
		
			
			|  |  |  | return e; } | 
		
	
		
			
			|  |  |  | ) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | , ownerInstnace(selected) { return __acquireConfig(selected, selected.username, null, null | 
		
	
		
			
			|  |  |  | , ownerInstnace(selected) { return __acquireConfig(selected, { remote : 'userfork' } | 
		
	
		
			
			|  |  |  | , selected.instanceName + '-config-' + selected.node_env | 
		
	
		
			
			|  |  |  | , function(e){ console.info('Customized user level config not found. This is not an Error. Will attempt global common instance config.'); | 
		
	
		
			
			|  |  |  | return e } | 
		
	
		
			
			|  |  |  | ) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | // PB : TODO -- Use the ORG level instance before falling back to common Instance coz common instance may not exist for certain orgs. | 
		
	
		
			
			|  |  |  | , commonInstance(selected) { return __acquireConfig(selected, defaultRepoOwner | 
		
	
		
			
			|  |  |  | , commonInstance(selected) { return __acquireConfig(selected, { defaultRepoOwner } | 
		
	
		
			
			|  |  |  | // , function(e){ console.info('This is probably an error unless the user is asking to create a new instance with this name.') } | 
		
	
		
			
			|  |  |  | ) } | 
		
	
		
			
			|  |  |  | , genericChessInstance(selected) { return __acquireConfig(selected) } | 
		
	
	
		
			
			|  |  | @@ -2591,7 +2661,7 @@ var eNotImplemented = function(){ | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // PB : TODO -- accept additional arg - an array specifying custom configPriority. | 
		
	
		
			
			|  |  |  | var acquireConfig = function(slections){ | 
		
	
		
			
			|  |  |  | var configPriority = [ 'clusterNodeInstance', 'ownerInstnace', 'commonInstance' /*, 'genericChessInstance'*/ ] | 
		
	
		
			
			|  |  |  | var configPriority = [ 'ownerClusterNodeConfig', 'ownerInstnace', 'commonInstance' /*, 'genericChessInstance'*/ ] | 
		
	
		
			
			|  |  |  | return any(configPriority.map(cfg => { return function() { return configs[cfg](slections) } } ), true, true).then(()=>{ | 
		
	
		
			
			|  |  |  | return acquireData(slections) | 
		
	
		
			
			|  |  |  | }) | 
		
	
	
		
			
			|  |  | @@ -2599,21 +2669,24 @@ var acquireConfig = function(slections){ | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var instanceData = (function(){ | 
		
	
		
			
			|  |  |  | return { | 
		
	
		
			
			|  |  |  | clusterNodeInstance(selected) { var clusternodename = 'node01' | 
		
	
		
			
			|  |  |  | return __acquireData(selected, selected.username, clusternodename | 
		
	
		
			
			|  |  |  | ownerClusterNodeData(selected) { | 
		
	
		
			
			|  |  |  | var clusternodename = hostname || `CHESS0001${selected.username}`; // Cluster node names need to be unique accross all clusters to avoid collitions. | 
		
	
		
			
			|  |  |  | clustername = clustername || `${selected.username}-CHESS-${selected.node_env}`; | 
		
	
		
			
			|  |  |  | return __acquireData(selected, { remote : 'userfork' } | 
		
	
		
			
			|  |  |  | , selected.instanceName + '-data-' + selected.node_env + `-${clusternodename}` | 
		
	
		
			
			|  |  |  | , function(e){ console.info('Customized node level config not found. This is not an Error. Will attempt with owner level config.'); | 
		
	
		
			
			|  |  |  | return e; } | 
		
	
		
			
			|  |  |  | ) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | , ownerInstnace(selected) { return __acquireData(selected, selected.username, null | 
		
	
		
			
			|  |  |  | , ownerInstnace(selected) { return __acquireData(selected, { remote : 'userfork' } | 
		
	
		
			
			|  |  |  | , selected.instanceName + '-data-' + selected.node_env | 
		
	
		
			
			|  |  |  | , function(e){ console.info('Customized user level config not found. This is not an Error. Will attempt global common instance config.'); | 
		
	
		
			
			|  |  |  | return e } | 
		
	
		
			
			|  |  |  | ) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | // PB : TODO -- Use the ORG level instance before falling back to common Instance coz common instance may not exist for certain orgs. | 
		
	
		
			
			|  |  |  | , commonInstance(selected) { return __acquireData(selected, defaultRepoOwner | 
		
	
		
			
			|  |  |  | , commonInstance(selected) { return __acquireData(selected, { defaultRepoOwner } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | // , function(e){ console.info('This is probably an error unless the user is asking to create a new instance with this name.') } | 
		
	
		
			
			|  |  |  | ) } | 
		
	
		
			
			|  |  |  | , genericChessInstance(selected) { return __acquireData(selected) } | 
		
	
	
		
			
			|  |  | @@ -2621,7 +2694,7 @@ var instanceData = (function(){ | 
		
	
		
			
			|  |  |  | })() | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var acquireData = function(slections){ | 
		
	
		
			
			|  |  |  | var configPriority = [ 'clusterNodeInstance', 'ownerInstnace', 'commonInstance' /*, 'genericChessInstance'*/ ] | 
		
	
		
			
			|  |  |  | var configPriority = [ 'ownerClusterNodeData', 'ownerInstnace', 'commonInstance' /*, 'genericChessInstance'*/ ] | 
		
	
		
			
			|  |  |  | return any(configPriority.map(cfg => { return function() { return instanceData[cfg](slections) } } ), true, true) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
			|  |  | @@ -2715,12 +2788,12 @@ var execserial = function(tasklist, task, shellT){ | 
		
	
		
			
			|  |  |  | var execonce = function(taskArgs, task){ return any([task[1].push.apply(task[1], taskArgs)].map(createTasq)) } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var __acquireConfig = function (selected, owner, clusternodename, configrepo, errHandler) { | 
		
	
		
			
			|  |  |  | var __acquireConfig = function (selected, options, configrepo, errHandler) { | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | configrepo = configrepo || selected.instanceName + '-config-' + selected.node_env; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var errorHandler = (e) => { | 
		
	
		
			
			|  |  |  | if(e.messages.join(' ').match(new RegExp (`fatal: unable to access '${selectedinstance.reposerver}/${owner}/${configrepo}.git/': Failed to connect to .*? port .*? after .*? ms: Timed out`))){ | 
		
	
		
			
			|  |  |  | if(e.messages.join(' ').match(new RegExp (`fatal: unable to access '${selectedinstance.reposerver}/${selected.username || options.defaultRepoOwner}/${configrepo}.git/': Failed to connect to .*? port .*? after .*? ms: Timed out`))){ | 
		
	
		
			
			|  |  |  | // console.error('Could not connect to repo server. Timed Out') | 
		
	
		
			
			|  |  |  | return cli.prompt( ['(y)es', '(n)o', '(r)etry'], 'Could not connect to repo server. Timed Out. Would you like to switch server ? (y/n) ', 'y' ).then(propValue => { | 
		
	
		
			
			|  |  |  |  | 
		
	
	
		
			
			|  |  | @@ -2735,14 +2808,15 @@ var __acquireConfig = function (selected, owner, clusternodename, configrepo, er | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if(e.messages.join(' ').match(new RegExp (`fatal: repository '${selectedinstance.reposerver}/${owner}/${configrepo}.git/' not found`))){ | 
		
	
		
			
			|  |  |  | if(e.messages.join(' ').match(new RegExp (`fatal: repository '${selectedinstance.reposerver}/${selected.username || options.defaultRepoOwner}/${configrepo}.git/' not found`))){ | 
		
	
		
			
			|  |  |  | var choices = { | 
		
	
		
			
			|  |  |  | t : `install a new temporary local instance with this name ( will not persist ). | 
		
	
		
			
			|  |  |  | Use your own username for additional options. You can request for a username at chess@bbh.org.in )` | 
		
	
		
			
			|  |  |  | , e : 'exit' } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if(selectedinstance.username !== 'guest' && selectedinstance.username !== 'demo') { | 
		
	
		
			
			|  |  |  | choices = utils.assign({ | 
		
	
		
			
			|  |  |  | choices = utils.assign_core( { arraymergetype : utils.assign_core.DISTINCT_UNION } | 
		
	
		
			
			|  |  |  | , { | 
		
	
		
			
			|  |  |  | i : 'create a new instance with this name => will fork the default config under your username' | 
		
	
		
			
			|  |  |  | , f : 'fork a new instance with this name for yourself for this node from another instance' | 
		
	
		
			
			|  |  |  | , o : 'fork a new instance with this name for your organization from another instance' // prompt organization name... | 
		
	
	
		
			
			|  |  | @@ -2774,7 +2848,8 @@ var __acquireConfig = function (selected, owner, clusternodename, configrepo, er | 
		
	
		
			
			|  |  |  | var successHandler = () => { | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var manifestpath = path.normalize(selected.root + '/' + selected.instanceName + '-config-' + selected.node_env + '/repo-manifest'); | 
		
	
		
			
			|  |  |  | utils.assign_strict(selectedinstance, require(manifestpath)( null, selectedinstance)) | 
		
	
		
			
			|  |  |  | utils.assign_core( { keycase : true, arraymergetype : utils.assign_core.DISTINCT_UNION } | 
		
	
		
			
			|  |  |  | , selectedinstance, require(manifestpath)( null, selectedinstance)) | 
		
	
		
			
			|  |  |  | console.dir(selectedinstance.repos) | 
		
	
		
			
			|  |  |  | // Config from server always override merges into selection except for the current selection. | 
		
	
		
			
			|  |  |  | // PB : TODO -- utils.assign Array merges are non-distinct... | 
		
	
	
		
			
			|  |  | @@ -2786,14 +2861,20 @@ var __acquireConfig = function (selected, owner, clusternodename, configrepo, er | 
		
	
		
			
			|  |  |  | console.warn('elevated repo manifest has obsolete format. Attempting upgrade.') | 
		
	
		
			
			|  |  |  | selectedinstance.elevated = selectedinstance.elevated.map(function(repo){ return { repo } }) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | chessinstances[selected.instanceName][selected.node_env] = selectedinstance = utils.assign(selected, selectedinstance) | 
		
	
		
			
			|  |  |  | chessinstances[selected.instanceName][selected.node_env] = selectedinstance = utils.assign_core( { arraymergetype : utils.assign_core.DISTINCT_UNION } | 
		
	
		
			
			|  |  |  | , selected, selectedinstance) | 
		
	
		
			
			|  |  |  | 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... | 
		
	
		
			
			|  |  |  | cacheWriteInstanceConfig(chessinstances) | 
		
	
		
			
			|  |  |  | ENV.NODE_ENV = selectedinstance.node_env; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | return performPull({repo : configrepo}, null, owner, errHandler || errorHandler || ((e)=>{ throw e })).then( successHandler ) | 
		
	
		
			
			|  |  |  | var selectedremotes = {}; | 
		
	
		
			
			|  |  |  | if(options.remote) selectedremotes[options.remote] = selected.reposerverinstances[selected.reposerver].remotes[options.remote]; | 
		
	
		
			
			|  |  |  | // else known remotes preselected from UI pref. | 
		
	
		
			
			|  |  |  | return performPull({repo : configrepo, remotes : Object.assign(selectedremotes | 
		
	
		
			
			|  |  |  | , selected.repos[configrepo]?.remotes || {} ) } | 
		
	
		
			
			|  |  |  | , null, selected.username || options.defaultRepoOwner, errHandler || errorHandler || ((e)=>{ throw e })).then( successHandler ) | 
		
	
		
			
			|  |  |  | .catch( (e)=>{ | 
		
	
		
			
			|  |  |  | // if(e){ | 
		
	
		
			
			|  |  |  | if(Promise.resolve(e) === e) return e; | 
		
	
	
		
			
			|  |  | @@ -2804,12 +2885,12 @@ var __acquireConfig = function (selected, owner, clusternodename, configrepo, er | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var __acquireData = function (selected, owner, clusternodename, datarepo, errHandler) { | 
		
	
		
			
			|  |  |  | var __acquireData = function (selected, options, datarepo, errHandler) { | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | datarepo = datarepo || selected.instanceName + '-data'; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var errorHandler = (e) => { | 
		
	
		
			
			|  |  |  | if(e.messages.join(' ').match(new RegExp (`fatal: unable to access '${selectedinstance.reposerver}/${owner}/${datarepo}.git/': Failed to connect to .*? port .*? after .*? ms: Timed out`))){ | 
		
	
		
			
			|  |  |  | if(e.messages.join(' ').match(new RegExp (`fatal: unable to access '${selectedinstance.reposerver}/${selected.username || options.defaultRepoOwner}/${datarepo}.git/': Failed to connect to .*? port .*? after .*? ms: Timed out`))){ | 
		
	
		
			
			|  |  |  | // console.error('Could not connect to repo server. Timed Out') | 
		
	
		
			
			|  |  |  | return cli.prompt( ['(y)es', '(n)o', '(r)etry'], 'Could not connect to repo server. Timed Out. Would you like to switch server ? (y/n) ', 'y' ).then(propValue => { | 
		
	
		
			
			|  |  |  |  | 
		
	
	
		
			
			|  |  | @@ -2824,14 +2905,15 @@ var __acquireData = function (selected, owner, clusternodename, datarepo, errHan | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if(e.messages.join(' ').match(new RegExp (`fatal: repository '${selectedinstance.reposerver}/${owner}/${datarepo}.git/' not found`))){ | 
		
	
		
			
			|  |  |  | if(e.messages.join(' ').match(new RegExp (`fatal: repository '${selectedinstance.reposerver}/${selected.username || options.defaultRepoOwner}/${datarepo}.git/' not found`))){ | 
		
	
		
			
			|  |  |  | var choices = { | 
		
	
		
			
			|  |  |  | t : `install a temporary local data folder. | 
		
	
		
			
			|  |  |  | For more options. Request and use a personal username at chess@bbh.org.in )` | 
		
	
		
			
			|  |  |  | , e : 'exit' } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if(selectedinstance.username !== 'guest' && selectedinstance.username !== 'demo') { | 
		
	
		
			
			|  |  |  | choices = utils.assign({ | 
		
	
		
			
			|  |  |  | choices = utils.assign_core( { arraymergetype : utils.assign_core.DISTINCT_UNION } | 
		
	
		
			
			|  |  |  | , { | 
		
	
		
			
			|  |  |  | i : 'create a new instance with this name => will fork the default config under your username' | 
		
	
		
			
			|  |  |  | , f : 'fork a new instance with this name for yourself for this node from another instance' | 
		
	
		
			
			|  |  |  | , o : 'fork a new instance with this name for your organization from another instance' // prompt organization name... | 
		
	
	
		
			
			|  |  | @@ -2864,7 +2946,13 @@ var __acquireData = function (selected, owner, clusternodename, datarepo, errHan | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | return performPull({ repo : datarepo }, null, owner, errHandler || errorHandler || ((e)=>{ throw e })).then( successHandler ) | 
		
	
		
			
			|  |  |  | var selectedremotes = {}; | 
		
	
		
			
			|  |  |  | if(options.remote) selectedremotes[options.remote] = selected.reposerverinstances[selected.reposerver].remotes[options.remote] | 
		
	
		
			
			|  |  |  | // else ... | 
		
	
		
			
			|  |  |  | return performPull({ repo : datarepo | 
		
	
		
			
			|  |  |  | , remotes : Object.assign(selectedremotes | 
		
	
		
			
			|  |  |  | , selected.repos[datarepo]?.remotes || {} ) } | 
		
	
		
			
			|  |  |  | , null, selected.username || options.defaultRepoOwner, errHandler || errorHandler || ((e)=>{ throw e })).then( successHandler ) | 
		
	
		
			
			|  |  |  | .catch( (e)=>{ | 
		
	
		
			
			|  |  |  | // if(e){ | 
		
	
		
			
			|  |  |  | if(Promise.resolve(e) === e) return e; | 
		
	
	
		
			
			|  |  | @@ -2910,118 +2998,9 @@ var detectInstanceRoot = any(instancediscoverytasks, true, true).then( ir => { | 
		
	
		
			
			|  |  |  | instanceroot = path.normalize(thisscriptdir) === path.normalize(launchpath) ? path.normalize(thisscriptdir + '/..') : launchpath ; | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // PB : TODO -- Embed this in the build instead of inlining it. | 
		
	
		
			
			|  |  |  | // Also attepmt to load from ../chess-config/... | 
		
	
		
			
			|  |  |  | var __default = ((name, options)=>{ | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // Default set of users in main repos. | 
		
	
		
			
			|  |  |  | var users = [ | 
		
	
		
			
			|  |  |  | { username : `${options.username}`, password : `${options.password}` } | 
		
	
		
			
			|  |  |  | , { username : `chess` } | 
		
	
		
			
			|  |  |  | // , { username : `baptistdev`, password : 'encrypted' } | 
		
	
		
			
			|  |  |  | // , { username : `guest`, password : 'encrypted' } | 
		
	
		
			
			|  |  |  | ] | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // ${options.reposerver} should be used to lookup current config. | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // User can always add more branches and remotes as needed. Mainifest only occupies | 
		
	
		
			
			|  |  |  | // well defined namespaces | 
		
	
		
			
			|  |  |  | var remotes = { | 
		
	
		
			
			|  |  |  | // these are both fetch and push remotes. Use push - remotes to override push. | 
		
	
		
			
			|  |  |  | 'chess' : { | 
		
	
		
			
			|  |  |  | server : `${options.reposerver}`, user : 'chess', path : ``, get url(){ return `${this.server}/${this.user}/${this.path}`} // fetch | 
		
	
		
			
			|  |  |  | , push : 'no-pushing' } | 
		
	
		
			
			|  |  |  | , 'baptistdev-public' : { | 
		
	
		
			
			|  |  |  | server : `https://github.com`, user : 'baptistdev', path : ``, get url(){ return `${this.server}/${this.user}/${this.path}`} // fetch | 
		
	
		
			
			|  |  |  | , push : 'no-pushing' } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // Multiple urls dont tell us the current origin which may be | 
		
	
		
			
			|  |  |  | // different based on currently available/accessible based on device and client. | 
		
	
		
			
			|  |  |  | // We just treat them as different remotes and merge as needed. | 
		
	
		
			
			|  |  |  | // | 
		
	
		
			
			|  |  |  | , 'origin' : { | 
		
	
		
			
			|  |  |  | server : `${options.reposerver}`, user : '${options.username}', path : ``, get url(){ return `${this.server}/${this.user}/${this.path}`} // fetch | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | , 'origin-public' : { | 
		
	
		
			
			|  |  |  | // export GIT_SSL_NO_VERIFY=true | 
		
	
		
			
			|  |  |  | server : `https://git.bbh.org.in`, user : 'chess', path : ``, get url(){ return `${this.server}/${this.user}/${this.path}`} // fetch | 
		
	
		
			
			|  |  |  | , push : { | 
		
	
		
			
			|  |  |  | server : `${options.reposerver}`, user : `${options.username}`, path : ``, get url(){ return `${this.server}/${this.user}/${this.path}`} | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | , 'origin-unc' : { | 
		
	
		
			
			|  |  |  | server : `//172.16.0.27/repos`, user : '${options.username}', path : ``, get url(){ return `${this.server}/${this.user}/${this.path}`} // fetch | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | // , { `${options.username}` : `https://git.bbh.org.in/${options.username}/elxr.git` } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // , 'fetch-remotes' : [] // Multiple fetch remotes are not supported by git. | 
		
	
		
			
			|  |  |  | // We therefore need to use | 
		
	
		
			
			|  |  |  | // - a pullall | 
		
	
		
			
			|  |  |  | // - or branch alias for multiple remote branch tracking branch strategy. | 
		
	
		
			
			|  |  |  | // 		-- This is however limited to corresponding branch names | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // tracking branches. | 
		
	
		
			
			|  |  |  | // We at least need one branch for each remote that we wish to track. | 
		
	
		
			
			|  |  |  | // , 'tracking-branches' : [ | 
		
	
		
			
			|  |  |  | //   { master : ['origin/master', 'chess/master'] } | 
		
	
		
			
			|  |  |  | // ] | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var reposerverinstances = { | 
		
	
		
			
			|  |  |  | 'http://git.bbh' : { users, remotes } | 
		
	
		
			
			|  |  |  | , 'https://git.bbh.org.in' : { users, remotes, external : true } | 
		
	
		
			
			|  |  |  | , '//172.16.0.27/repos' : { users, remotes } | 
		
	
		
			
			|  |  |  | , 'https://github.com' : { | 
		
	
		
			
			|  |  |  | // We host a miniaml set of repositories in github. | 
		
	
		
			
			|  |  |  | get users() { return [{ username : `${this.username}` }]}, username : `baptistdev` | 
		
	
		
			
			|  |  |  | , remotes : { | 
		
	
		
			
			|  |  |  | 'baptistdev-public' : { | 
		
	
		
			
			|  |  |  | server : `https://github.com`, user : 'baptistdev', path : ``, get url(){ return `${this.server}/${this.user}/${this.path}`} // fetch | 
		
	
		
			
			|  |  |  | , push : 'no-pushing' } | 
		
	
		
			
			|  |  |  | // , Add other remotes here. | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | , external : true, public : true | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | return { | 
		
	
		
			
			|  |  |  | reposervers : Object.keys(reposerverinstances) | 
		
	
		
			
			|  |  |  | , reposerverinstances | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // Common baseline repos for all chess instances. | 
		
	
		
			
			|  |  |  | , repos : [ | 
		
	
		
			
			|  |  |  | { repo : 'ember-masonry-grid' /*, branch : master*/ } // Default need not be specified. | 
		
	
		
			
			|  |  |  | , { repo : 'bbhverse' } | 
		
	
		
			
			|  |  |  | , { repo : 'clientverse' } | 
		
	
		
			
			|  |  |  | , { repo : 'serververse' } | 
		
	
		
			
			|  |  |  | , { repo : 'elxr' } | 
		
	
		
			
			|  |  |  | , { repo : 'ember-searchable-select' } | 
		
	
		
			
			|  |  |  | , { repo : 'loopback-component-jsonapi' } | 
		
	
		
			
			|  |  |  | , { repo : 'loopback-jsonapi-model-serializer' } | 
		
	
		
			
			|  |  |  | , { repo : 'loopback-connector-mysql' } | 
		
	
		
			
			|  |  |  | , { repo : 'loopback-connector-ds' } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | , { repo : 'ember-service-worker' } | 
		
	
		
			
			|  |  |  | , { repo : 'ember-service-worker-asset-cache' } | 
		
	
		
			
			|  |  |  | , { repo : 'ember-service-worker-cache-fallback' } | 
		
	
		
			
			|  |  |  | , { repo : 'ember-service-worker-index' } | 
		
	
		
			
			|  |  |  | , { repo : 'ember-sw-client-route' } | 
		
	
		
			
			|  |  |  | , { repo : 'global-this' } | 
		
	
		
			
			|  |  |  | ] | 
		
	
		
			
			|  |  |  | // Requires elevation only in windows | 
		
	
		
			
			|  |  |  | , elevated : [ { repo : 'chess-server-lib', requiresElevation : true  } ] | 
		
	
		
			
			|  |  |  | , exludeMergeRepos : { } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | })( | 
		
	
		
			
			|  |  |  | '__default' // name | 
		
	
		
			
			|  |  |  | , { username : 'guest', instanceName : 'chess', node_env : 'development', reposerver : 'https://git.bbh.org.in' } // options | 
		
	
		
			
			|  |  |  | ) | 
		
	
		
			
			|  |  |  | // We first load the default and then override with a runconfig if it exists else we override with the interactive prompts. | 
		
	
		
			
			|  |  |  | // Then acquire and reload and replace this default. | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var hasElxr = function(path, options, cb) { | 
		
	
		
			
			|  |  |  | // PB : TOOD -- Navigate up the folder chain to discover the relevant .elxr directory. | 
		
	
		
			
			|  |  |  | options = options || {}; | 
		
	
	
		
			
			|  |  | @@ -3183,12 +3162,12 @@ var shouldPrompt = function(k, possiblePrompts, target){ | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var getBoundEachPrompt = function(target, possiblePrompts, promptables, choices, promptsfilter) { | 
		
	
		
			
			|  |  |  | return function(prompts, k, i, a){ | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | // Reducer for all prompts on targets. | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | // No local instances config found. We use a default initialized instance available in selectedinstance | 
		
	
		
			
			|  |  |  | // Confirm those that were not supplied as user choices in runtime args and proceed to reattempt. | 
		
	
		
			
			|  |  |  | // PB : TODO -- selectedinstance === __default check to prompt everything... | 
		
	
		
			
			|  |  |  | if(  shouldPrompt(k, possiblePrompts, target) ) { | 
		
	
		
			
			|  |  |  | if( shouldPrompt(k, possiblePrompts, target) ) { | 
		
	
		
			
			|  |  |  | delete reconfirm[k]; | 
		
	
		
			
			|  |  |  | // console.log(k) | 
		
	
		
			
			|  |  |  | // console.dir(possiblePrompts); //console.dir(target) | 
		
	
	
		
			
			|  |  | @@ -3282,13 +3261,70 @@ var __interactive_prompts = function( target, choices, promptsfilter ){ | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | , instanceType : { label : `Enter Instance Type ( <= ${target.instanceType || 'development'} ) : ` | 
		
	
		
			
			|  |  |  | , choices : choices['instanceType'], defaultchoice : 'development' | 
		
	
		
			
			|  |  |  | , selectedchoice : target.instanceType | 
		
	
		
			
			|  |  |  | , selectedchoice : target.instanceType || 'development' | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | , reposerver   : { label : `Enter Repo Url ( <= ${target.reposerver || 'https://git.bbh.org.in'} ) : ` | 
		
	
		
			
			|  |  |  | , choices : choices['reposerver'], defaultchoice : 'https://git.bbh.org.in' | 
		
	
		
			
			|  |  |  | , reposerver   : { label : `Enter Repo Server Base Url ( <= ${target.reposerver || 'https://git.bbh.org.in'} ) : ` | 
		
	
		
			
			|  |  |  | , get choices() { | 
		
	
		
			
			|  |  |  | choices['reposerver'].forEach( rs => { | 
		
	
		
			
			|  |  |  | var __rs = new URL(rs); | 
		
	
		
			
			|  |  |  | __rs.hostname = __rs.host; | 
		
	
		
			
			|  |  |  | __rs.path = '/' | 
		
	
		
			
			|  |  |  | __rs.method = 'GET' | 
		
	
		
			
			|  |  |  | RESTAPI.get(__rs, function(data){ rs.accessibility = 'unaccessible' } | 
		
	
		
			
			|  |  |  | , function(error){ rs.accessibility = 'unaccessible' } ) | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | return choices['reposerver'] | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | , defaultchoice : 'https://git.bbh.org.in' | 
		
	
		
			
			|  |  |  | , selectedchoice : target.reposerver | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | , 'upstream-remote' : { label : `Enter Remote Name ( <= ${target['upstream-remote'] || 'chess'} ) : ` | 
		
	
		
			
			|  |  |  | , get choices() { | 
		
	
		
			
			|  |  |  | var reposerver = target['reposerver'] | 
		
	
		
			
			|  |  |  | var remotes = [] | 
		
	
		
			
			|  |  |  | target.reposervers.forEach(rs => { | 
		
	
		
			
			|  |  |  | if(rs.server === reposerver){ | 
		
	
		
			
			|  |  |  | remotes.push(remote) | 
		
	
		
			
			|  |  |  | // PB : TODO -- Sort and display highest priority target.remotes.sort(   ) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | return remotes | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | , defaultchoice : 'userfork' | 
		
	
		
			
			|  |  |  | , selectedchoice : target['upstream-remote'] || 'userfork' | 
		
	
		
			
			|  |  |  | // Just using getters resolves dependencies..., dependencies : [ ()=>{ return target['reposerver'] } ] | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | , 'selectedremotes' : { label : `Chose Remote Names ( <= ${target['selectedremotes'] || 'chess'} ) : ` | 
		
	
		
			
			|  |  |  | , get choices() { | 
		
	
		
			
			|  |  |  | var reposerver = target['reposerver'] // PB : TODO -- We need options to work with multiple selected reposervers at the same time.. | 
		
	
		
			
			|  |  |  | var remotenames = [] | 
		
	
		
			
			|  |  |  | Object.entries(target.remotes).forEach( ([rname, r]) => { | 
		
	
		
			
			|  |  |  | if(r.server === reposerver){ | 
		
	
		
			
			|  |  |  | remotes.push(rname) | 
		
	
		
			
			|  |  |  | // PB : TODO -- Sort and display highest priority target.remotes.sort(   ) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | // PB : TODO -- Need to generate all possible permuted choices nP( 1 -> n ) | 
		
	
		
			
			|  |  |  | // Currenty handles all combinations without any priority order. | 
		
	
		
			
			|  |  |  | var _remotechoices = [] // Array of arrays of choices. | 
		
	
		
			
			|  |  |  | remotenames.forEach( r => { | 
		
	
		
			
			|  |  |  | var __rcs = [] | 
		
	
		
			
			|  |  |  | _remotechoices.forEach(rc => { | 
		
	
		
			
			|  |  |  | __rcs.push(  rc.concat(r) ) | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | Array.prototype.push.apply( _remotechoices, __rcs) | 
		
	
		
			
			|  |  |  | _remotechoices.push(r) | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | return _remotechoices | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | , defaultchoice : ['userfork-public', 'chess-public'] | 
		
	
		
			
			|  |  |  | , selectedchoice : target['selectedremotes'] || ['userfork-public', 'chess-public'] | 
		
	
		
			
			|  |  |  | // , defaultchoice : { 'userfork-public' : target.remotes['userfork-public'] , 'chess-public' : target.remotes['chess-public'] } | 
		
	
		
			
			|  |  |  | // , selectedchoice : target['selectedremotes'] || { 'userfork-public' : target.remotes['userfork-public'] , 'chess-public' : target.remotes['chess-public'] } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | // Info : Just using getters resolves dependencies..., dependencies : [ ()=>{ return target['reposerver'] } ] | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | , get username()  { return { label : `Enter User Id for ${target.reposerver} ( <= ${target.username || 'chess'} ) : ` | 
		
	
		
			
			|  |  |  | , choices : choices['username'], defaultchoice : 'chess', selectedchoice : target.username } } | 
		
	
		
			
			|  |  |  | , get password()  { return { label : `Enter Password for ${target.username} @ ${target.reposerver} ( <= ${target.password || ''} ) : ` | 
		
	
	
		
			
			|  |  | @@ -3483,25 +3519,29 @@ function verifyAndInstallPrerequisites() { | 
		
	
		
			
			|  |  |  | var getPromptableAsyncPropDescriptor = function(propName, promptable){ | 
		
	
		
			
			|  |  |  | return { | 
		
	
		
			
			|  |  |  | get (){ | 
		
	
		
			
			|  |  |  | return cli.prompt( promptable.choices, promptable.label, promptable.defaultchoice, promptable.selectedchoice ).then(propValue => { | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | var asyncprop = Promise.resolve(propValue) | 
		
	
		
			
			|  |  |  | if(promptable.interpret){ | 
		
	
		
			
			|  |  |  | asyncprop = promptable.interpret(propValue) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | return any( promptable.dependencies || [] ).then(()=>{ | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | return asyncprop.then( | 
		
	
		
			
			|  |  |  | ()=>{ | 
		
	
		
			
			|  |  |  | Object.defineProperty(this, propName, { | 
		
	
		
			
			|  |  |  | value: propValue, | 
		
	
		
			
			|  |  |  | writable: true, | 
		
	
		
			
			|  |  |  | configurable : true, | 
		
	
		
			
			|  |  |  | enumerable : true | 
		
	
		
			
			|  |  |  | }); | 
		
	
		
			
			|  |  |  | return propValue | 
		
	
		
			
			|  |  |  | return cli.prompt( promptable.choices, promptable.label, promptable.defaultchoice, promptable.selectedchoice ).then(propValue => { | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | var asyncprop = Promise.resolve(propValue) | 
		
	
		
			
			|  |  |  | if(promptable.interpret){ | 
		
	
		
			
			|  |  |  | asyncprop = promptable.interpret(propValue) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | ) | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | return asyncprop.then( | 
		
	
		
			
			|  |  |  | ()=>{ | 
		
	
		
			
			|  |  |  | Object.defineProperty(this, propName, { | 
		
	
		
			
			|  |  |  | value: propValue, | 
		
	
		
			
			|  |  |  | writable: true, | 
		
	
		
			
			|  |  |  | configurable : true, | 
		
	
		
			
			|  |  |  | enumerable : true | 
		
	
		
			
			|  |  |  | }); | 
		
	
		
			
			|  |  |  | return propValue | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | ) | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | } ) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | // , set (propValue){ | 
		
	
		
			
			|  |  |  | //   Object.defineProperty(this, propName, { | 
		
	
	
		
			
			|  |  | @@ -3521,8 +3561,9 @@ var getPromptableAsyncPropDescriptor = function(propName, promptable){ | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function acquirelocalinstances(selected){ | 
		
	
		
			
			|  |  |  | // utils.assign is used to cleanup duplicates... | 
		
	
		
			
			|  |  |  | var chessinstances = utils.assign(require(path.normalize(selected.root + '/chessinstances.js'))); | 
		
	
		
			
			|  |  |  | // utils.assign is used to cleanup duplicates... assuming chessinstances.js is probably not clean. | 
		
	
		
			
			|  |  |  | var chessinstances = utils.assign_core( { arraymergetype : utils.assign_core.DISTINCT_UNION } | 
		
	
		
			
			|  |  |  | , require(path.normalize(selected.root + '/chessinstances.js'))); | 
		
	
		
			
			|  |  |  | return chessinstances | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
			|  |  | @@ -3558,6 +3599,8 @@ function findlocalinstances(chessinstances, instanceoptions){ | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // function updateselection(selected) { selectedinstance = utils.assign(selectedinstance, selected) } | 
		
	
		
			
			|  |  |  | var selectedinstance = { root : process.env.wd }; | 
		
	
		
			
			|  |  |  | var runconfig = null; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var chessinstances = { current_run : {} }; | 
		
	
		
			
			|  |  |  | var promptkeys = { | 
		
	
		
			
			|  |  |  | cmd : processedArgs._[0] || 'pull' | 
		
	
	
		
			
			|  |  | @@ -3577,9 +3620,11 @@ function createLocalChessInstance( cfg ){ | 
		
	
		
			
			|  |  |  | inst[cfg.node_env] = __new; return inst; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var choices = { | 
		
	
		
			
			|  |  |  | 'instanceName' : [] | 
		
	
		
			
			|  |  |  | , 'reposerver' : [] | 
		
	
		
			
			|  |  |  | , 'upstream-remote' : [] | 
		
	
		
			
			|  |  |  | , 'instanceType' : [] | 
		
	
		
			
			|  |  |  | , username : ['guest', 'chessdemo', 'demo'] | 
		
	
		
			
			|  |  |  | } | 
		
	
	
		
			
			|  |  | @@ -3588,6 +3633,7 @@ var getInteractionPoints = function(detectedinstanceoptions, possiblePrompts, pr | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var instances = [] | 
		
	
		
			
			|  |  |  | var reposervers = []; | 
		
	
		
			
			|  |  |  | var remotes = []; | 
		
	
		
			
			|  |  |  | var instanceNames = [] | 
		
	
		
			
			|  |  |  | var instanceTypes = ['development', 'production']; | 
		
	
		
			
			|  |  |  | Object.keys( chessinstances).forEach(instanceName => { | 
		
	
	
		
			
			|  |  | @@ -3599,6 +3645,7 @@ var getInteractionPoints = function(detectedinstanceoptions, possiblePrompts, pr | 
		
	
		
			
			|  |  |  | instances.push(instance) | 
		
	
		
			
			|  |  |  | instanceTypes.push(instance.node_env) | 
		
	
		
			
			|  |  |  | instanceNames.push(instance.instanceName) | 
		
	
		
			
			|  |  |  | Array.prototype.push.apply(remotes, Object.keys(instance.reposerverinstances[instance.reposerver].remotes)) | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | instances = instances.concat(detectedinstanceoptions) | 
		
	
	
		
			
			|  |  | @@ -3609,6 +3656,7 @@ var getInteractionPoints = function(detectedinstanceoptions, possiblePrompts, pr | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | choices['instanceName'] =  Array.from( new Set(instanceNames.concat(choices['instanceName'])) ) | 
		
	
		
			
			|  |  |  | choices['reposerver'] =  Array.from( new Set(reposervers.concat(choices['reposerver'])) ) | 
		
	
		
			
			|  |  |  | // choices['upstream-remote'] =  Array.from( new Set(remotes.concat(choices['upstream-remote'])) ) | 
		
	
		
			
			|  |  |  | choices['instanceType'] =  Array.from( new Set(instanceTypes.concat(choices['instanceType'])) ) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | return __interactive_prompts(selectedinstance, choices, promptsfilter) | 
		
	
	
		
			
			|  |  | @@ -3621,6 +3669,7 @@ var detection_state = { | 
		
	
		
			
			|  |  |  | const https = require('https') | 
		
	
		
			
			|  |  |  | const http = require('http'); | 
		
	
		
			
			|  |  |  | const { resolve } = require('path'); | 
		
	
		
			
			|  |  |  | const { Console } = require('console'); | 
		
	
		
			
			|  |  |  | const RESTAPI = (function(){ | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // Singleton | 
		
	
	
		
			
			|  |  | @@ -3958,10 +4007,12 @@ function initinstances(selected_overrides) { | 
		
	
		
			
			|  |  |  | // __default, chessinstances[current_run], instanceName-config-development, cliargs, interactve_promts | 
		
	
		
			
			|  |  |  | // PB : TODO -- Undefined keys are overriding and deleting values. We should not allow that. | 
		
	
		
			
			|  |  |  | // This is ordinary utils.assign behavior. The key should not exist as undefined in the override. | 
		
	
		
			
			|  |  |  | // 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 | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | selectedinstance = utils.assign( | 
		
	
		
			
			|  |  |  | chessinstances[instanceName][node_env] | 
		
	
		
			
			|  |  |  | selectedinstance = utils.assign_core( { arraymergetype : utils.assign_core.DISTINCT_UNION } | 
		
	
		
			
			|  |  |  | , __default | 
		
	
		
			
			|  |  |  | , chessinstances[instanceName][node_env] | 
		
	
		
			
			|  |  |  | , clioverrides | 
		
	
		
			
			|  |  |  | , selected_overrides | 
		
	
		
			
			|  |  |  | // , __interactive_prompts -- Cant just override. Also need selectedinstance to be ready... | 
		
	
	
		
			
			|  |  | @@ -4169,7 +4220,8 @@ var startElxr = function() { | 
		
	
		
			
			|  |  |  | var cmdprompts =  cmdinstance.getPossiblePrompts() | 
		
	
		
			
			|  |  |  | 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 !!! | 
		
	
		
			
			|  |  |  | selectedinstance = utils.assign( ...detectedinstanceoptions.slice(-2), promptkeys ) | 
		
	
		
			
			|  |  |  | selectedinstance = utils.assign_core( { arraymergetype : utils.assign_core.DISTINCT_UNION } | 
		
	
		
			
			|  |  |  | , ...detectedinstanceoptions.slice(-2), promptkeys ) | 
		
	
		
			
			|  |  |  | // promptkeys = utils.assign(promptkeys, clioverrides) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if(cmdprompts.instanceName) { | 
		
	
	
		
			
			|  |  | @@ -4223,7 +4275,8 @@ var startElxr = function() { | 
		
	
		
			
			|  |  |  | else return Promise.resolve(true) | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | .then(()=>{ | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | runconfig = { NODE_ENV: selectedinstance.node_env } | 
		
	
		
			
			|  |  |  | try { runconfig = Object.assign(runconfig, require(instanceroot + '/run.js')) } catch (e) { } | 
		
	
		
			
			|  |  |  | generateDependencies(); | 
		
	
		
			
			|  |  |  | if(noprerequisites[processedArgs._[0]] | 
		
	
		
			
			|  |  |  | || skipprereqs[processedArgs._[0]] | 
		
	
	
		
			
			|  |  | @@ -4272,10 +4325,50 @@ var startElxr = function() { | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var __default = null; // PB : TODO -- Use initialized instance instead of default everywhere. | 
		
	
		
			
			|  |  |  | // PB : TODO -- In windows if we are run from an elevated shell we never move forward and simply exits !?. | 
		
	
		
			
			|  |  |  | // -- Currently workaround in windows is to always run from a non-elevated shell. | 
		
	
		
			
			|  |  |  | shell_verse.acquireElevationState().then((elevationstate) => { | 
		
	
		
			
			|  |  |  | return detectInstanceRoot.then(()=>{ | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // PB : TODO -- Embed this in the build instead of inlining it. | 
		
	
		
			
			|  |  |  | // Also attepmt to load from ../chess-config/... | 
		
	
		
			
			|  |  |  | var __repo_manifest = (require(path.normalize(instanceroot + '/elxr/repo-manifest.js')))( | 
		
	
		
			
			|  |  |  | '__default' // name | 
		
	
		
			
			|  |  |  | , { utils, username : 'guest', instanceName : 'chess', node_env : 'development', reposerver : 'https://git.bbh.org.in' } // options | 
		
	
		
			
			|  |  |  | ) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | __default = Object.assign(__repo_manifest, { | 
		
	
		
			
			|  |  |  | // Common baseline repos for all chess instances. | 
		
	
		
			
			|  |  |  | repos : (()=> { | 
		
	
		
			
			|  |  |  | var __repos = [ | 
		
	
		
			
			|  |  |  | { repo : 'ember-masonry-grid' /*, branch : master*/ } // Default need not be specified. | 
		
	
		
			
			|  |  |  | , { repo : 'bbhverse' } | 
		
	
		
			
			|  |  |  | , { repo : 'clientverse' } | 
		
	
		
			
			|  |  |  | , { repo : 'serververse' } | 
		
	
		
			
			|  |  |  | , { repo : 'elxr' } | 
		
	
		
			
			|  |  |  | , { repo : 'ember-searchable-select' } | 
		
	
		
			
			|  |  |  | , { repo : 'loopback-component-jsonapi' } | 
		
	
		
			
			|  |  |  | , { repo : 'loopback-jsonapi-model-serializer' } | 
		
	
		
			
			|  |  |  | , { repo : 'loopback-connector-mysql' } | 
		
	
		
			
			|  |  |  | , { repo : 'loopback-connector-ds' } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | , { repo : 'ember-service-worker' } | 
		
	
		
			
			|  |  |  | , { repo : 'ember-service-worker-asset-cache' } | 
		
	
		
			
			|  |  |  | , { repo : 'ember-service-worker-cache-fallback' } | 
		
	
		
			
			|  |  |  | , { repo : 'ember-service-worker-index' } | 
		
	
		
			
			|  |  |  | , { repo : 'ember-sw-client-route' } | 
		
	
		
			
			|  |  |  | , { repo : 'global-this' } | 
		
	
		
			
			|  |  |  | ] | 
		
	
		
			
			|  |  |  | Array.prototype.push.apply( __repos, __repo_manifest.repos) | 
		
	
		
			
			|  |  |  | return __repos; | 
		
	
		
			
			|  |  |  | })() | 
		
	
		
			
			|  |  |  | // Requires elevation only in windows | 
		
	
		
			
			|  |  |  | , elevated : [ { repo : 'chess-server-lib', requiresElevation : true  } ] | 
		
	
		
			
			|  |  |  | , exludeMergeRepos : { } | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var cmdobj = cmds[clioverrides.cmd] | 
		
	
		
			
			|  |  |  | return Promise.all((cmdobj.requires || []).map( (r) => utils.promisify(null, r) )  ).then(()=>{ | 
		
	
		
			
			|  |  |  | if(cmdobj.independentcmd) { |