Browse Source

promt enhancements

production
chess 3 years ago
parent
commit
d853b4ee5d
1 changed files with 161 additions and 119 deletions
  1. 161
    119
      index.js

+ 161
- 119
index.js View File

else { else {
console.log('cloning ' + repo) console.log('cloning ' + repo)
// PB : TODO -- detect if a clonable repo exists in currentGitAuthUser // PB : TODO -- detect if a clonable repo exists in currentGitAuthUser
return nodeShellExec('git', ['clone', '-c', 'core.symlinks=true', defaultRepoServer + `/${defaultRepoOwner}/` + repo + '.git'],
return nodeShellExec('git', ['clone', '-c', 'core.symlinks=true', selectedinstance.reposerver + `/${defaultRepoOwner}/` + repo + '.git'],
{ {
inherit: true, shell: true, inherit: true, shell: true,
env: process.env env: process.env
env: process.env env: process.env
, cwd: instanceroot + '/' + repo , cwd: instanceroot + '/' + repo
, runas: processedArgs.runas , runas: processedArgs.runas
, title: `git core.symlinks --replace-all true for ${defaultRepoServer + `/${defaultRepoOwner}/` + repo + '.git'}`
, title: `git core.symlinks --replace-all true for ${selectedinstance.reposerver + `/${defaultRepoOwner}/` + repo + '.git'}`
}) })
.then(() => { .then(() => {
if (__isElevated) { if (__isElevated) {
var defaultRepoOwner = 'chess'; var defaultRepoOwner = 'chess';
var elevatedRunasRepos = null var elevatedRunasRepos = null
var gitRepos = null var gitRepos = null
var defaultRepoServer = null


// grep -qxF 'alias elxr="node elxr/index.js"' ~/.bash_profile || echo 'alias elxr="node elxr/index.js"' >> ~/.bash_profile // grep -qxF 'alias elxr="node elxr/index.js"' ~/.bash_profile || echo 'alias elxr="node elxr/index.js"' >> ~/.bash_profile


var sequentialTaskShellCommands = []; var sequentialTaskShellCommands = [];
if (!existsSync(`Z:/${repo}.git`)) { if (!existsSync(`Z:/${repo}.git`)) {
sequentialTaskShellCommands = [ sequentialTaskShellCommands = [
// ['net', ['use', 'Z:', defaultRepoServer.replace('/','\\')], {
// ['net', ['use', 'Z:', selectedinstance.reposerver.replace('/','\\')], {
// inherit : true, shell: true // inherit : true, shell: true
// , env: process.env // , env: process.env
// }] // }]
, ['git', ['remote', 'rename', 'origin', 'githubclone'], { cwd: `${instanceroot + '/' + repo}` }, (err) => { , ['git', ['remote', 'rename', 'origin', 'githubclone'], { cwd: `${instanceroot + '/' + repo}` }, (err) => {
console.log('Ignoring origin rename error : ' + err); return true; //return true to continue. console.log('Ignoring origin rename error : ' + err); return true; //return true to continue.
}] // PB ; Todo -- new repositories created locally will not have origin. Handle this failure. }] // PB ; Todo -- new repositories created locally will not have origin. Handle this failure.
, ['git', ['remote', 'add', 'origin', `${defaultRepoServer}/${repo}.git`], { cwd: `${instanceroot + '/' + repo}` }]
, ['git', ['remote', 'add', 'origin', `${selectedinstance.reposerver}/${repo}.git`], { cwd: `${instanceroot + '/' + repo}` }]
// PB : TODO -- If threre is a gitbubclone origin // PB : TODO -- If threre is a gitbubclone origin
// Set the master to pull from the local repo. // Set the master to pull from the local repo.
] ]
if (!existsSync(`Z:`)) { if (!existsSync(`Z:`)) {
sequentialTaskShellCommands.splice(0, 0, ['net', ['use', 'Z:', defaultRepoServer.replace(/\//gm, '\\')], {
sequentialTaskShellCommands.splice(0, 0, ['net', ['use', 'Z:', selectedinstance.reposerver.replace(/\//gm, '\\')], {
inherit: true, shell: true inherit: true, shell: true
, env: process.env , env: process.env
}]) }])
var options = { cwd: instanceroot + '/' + repo } var options = { cwd: instanceroot + '/' + repo }
// console.log(repo) // console.log(repo)
return [ return [
['git', ['remote', 'add', 'chess', `${defaultRepoServer}/${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', '--push', 'chess', 'no-pushing'], { cwd: instanceroot + '/' + repo }]
, ['git', ['remote', 'set-url', 'origin', `${defaultRepoServer}/${user}/${repo}.git`], { cwd: instanceroot + '/' + repo }]
, ['git', ['remote', 'set-url', 'origin', `${selectedinstance.reposerver}/${user}/${repo}.git`], { cwd: instanceroot + '/' + repo }]
] ]
} }
var x = (args) => { var x = (args) => {
We will run your choice of default or create your own at the next prompt. We will run your choice of default or create your own at the next prompt.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
`)) `))
var prompt = cli.prompt;
var prompt = cli.prompter;
return prompt.ask(`Choose an option : return prompt.ask(`Choose an option :
d) Install the default chess instance. d) Install the default chess instance.
=> elxr i chess node_env=development --default => elxr i chess node_env=development --default
processedArgs._[0] = 'i' processedArgs._[0] = 'i'
selectedinstance.instanceName = processedArgs._[1] = processedArgs._[1] || 'chess' selectedinstance.instanceName = processedArgs._[1] = processedArgs._[1] || 'chess'
selectedinstance.node_env = processedArgs.node_env = (process.env.NODE_ENV && process.env.NODE_ENV.trim()) || processedArgs.node_env || 'development' selectedinstance.node_env = processedArgs.node_env = (process.env.NODE_ENV && process.env.NODE_ENV.trim()) || processedArgs.node_env || 'development'
defaultRepoServer = 'https://git.bbh.org.in'
selectedinstance.reposerver = 'https://git.bbh.org.in'
getManifest() // PB : TODO -- acquire the manifest directly from http url instead of clone before cloning the config. Since getManifest() // PB : TODO -- acquire the manifest directly from http url instead of clone before cloning the config. Since
// This is because the manifest at any server location can redirect to the preferred server.. // This is because the manifest at any server location can redirect to the preferred server..
} }
console.log(elxr.help()); process.exit() console.log(elxr.help()); process.exit()
} }
else if (choice === 'n' || choice === 'i') { else if (choice === 'n' || choice === 'i') {
var p1 = cli.prompt;
var p1 = cli.prompter;
return p1.ask(`Enter Instance Name ( <= ${selectedinstance.instanceName} ) : `).then(function (instanceName) { return p1.ask(`Enter Instance Name ( <= ${selectedinstance.instanceName} ) : `).then(function (instanceName) {
processedArgs._[0] = 'i' processedArgs._[0] = 'i'
selectedinstance.instanceName = processedArgs._[1] = instanceName || selectedinstance.instanceName; selectedinstance.instanceName = processedArgs._[1] = instanceName || selectedinstance.instanceName;
return p1.ask(`Enter Environment ( <= ${selectedinstance.node_env} ) : `).then(function (node_env) { return p1.ask(`Enter Environment ( <= ${selectedinstance.node_env} ) : `).then(function (node_env) {
selectedinstance.node_env = processedArgs.node_env = node_env || selectedinstance.node_env selectedinstance.node_env = processedArgs.node_env = node_env || selectedinstance.node_env
if (choice === 'n') { if (choice === 'n') {
defaultRepoServer = 'https://git.bbh.org.in'
selectedinstance.reposerver = 'https://git.bbh.org.in'
console.warn( console.warn(
chalk.magenta('No Option Available. Your account may not have privileges. You can request here http://git.bbh.org.in/chess')) chalk.magenta('No Option Available. Your account may not have privileges. You can request here http://git.bbh.org.in/chess'))
process.exit(); process.exit();


return p1.ask(`Enter preferred repo server ( <= ${selectedinstance.reposervers[0]} ) : `).then(function (reposerver) { return p1.ask(`Enter preferred repo server ( <= ${selectedinstance.reposervers[0]} ) : `).then(function (reposerver) {
p1.close() p1.close()
defaultRepoServer = reposerver || selectedinstance.reposervers[0] || 'https://git.bbh.org.in'
selectedinstance.reposerver = reposerver || selectedinstance.reposervers[0] || 'https://git.bbh.org.in'
}) })
}) })
}) })
} else if (choice === 'c') { } else if (choice === 'c') {
var p1 = cli.prompt;
var p1 = cli.prompter;
return p1.ask(`Enter Instance Name ( <= ${selectedinstance.instanceName} ) : `).then(function (instanceName) { return p1.ask(`Enter Instance Name ( <= ${selectedinstance.instanceName} ) : `).then(function (instanceName) {
selectedinstance.instanceName = processedArgs._[1] = instanceName || selectedinstance.instanceName selectedinstance.instanceName = processedArgs._[1] = instanceName || selectedinstance.instanceName
return p1.ask(`Enter Environment ( <= ${selectedinstance.node_env} ) : `).then(function (node_env) { return p1.ask(`Enter Environment ( <= ${selectedinstance.node_env} ) : `).then(function (node_env) {
} }
else processedArgs._[0] = cmd else processedArgs._[0] = cmd
return p1.ask(`Enter preferred repo server ( <= ${selectedinstance.reposervers[0]} ) : `).then(function (reposerver) { return p1.ask(`Enter preferred repo server ( <= ${selectedinstance.reposervers[0]} ) : `).then(function (reposerver) {
defaultRepoServer = reposerver || selectedinstance.reposervers[0] || 'https://git.bbh.org.in'
selectedinstance.reposerver = reposerver || selectedinstance.reposervers[0] || 'https://git.bbh.org.in'
p1.close() p1.close()
}) })
}) })
var acquireConfig = function (selected, chessinstances) { var acquireConfig = function (selected, chessinstances) {


var configrepo = selected.instanceName + '-config-' + selected.node_env; var configrepo = selected.instanceName + '-config-' + selected.node_env;
return performPull(configrepo).then(() => {
var manifestpath = path.normalize(selected.root + '/' + selected.instanceName + '-config-' + selected.node_env + '/repo-manifest');
repomanifest = require(manifestpath)()
chessinstances = chessinstances || {};
chessinstances[selected.instanceName] = chessinstances[selected.instanceName] || {}
chessinstances[selected.instanceName][selected.node_env] = chessinstances[selected.instanceName][selected.node_env] || {}
chessinstances['current_run'] = { instanceName: selected.instanceName, node_env: selected.node_env }
// Config from server always override merges into selection ecept for the current selection.
selectedinstance = utils.assign(chessinstances[selected.instanceName][selected.node_env], selected, repomanifest)
fs.writeFileSync(instanceroot + '/chessinstances.js', 'module.exports = ' + JSON.stringify(chessinstances) + '', { 'flag': 'w' })
// PB : TODO -- We should probably write the new server config also...
defaultRepoServer = selectedinstance.reposervers[0] // PB : TODO -- Attempt first one that is available and online...
ENV.NODE_ENV = selectedinstance.node_env;
})
.catch((e) => {
console.error(e)
console.error('Config acquisition failed.')
return (async ()=>{return await __default.reposerver})().then(()=>{

return performPull(configrepo).then(() => {
var manifestpath = path.normalize(selected.root + '/' + selected.instanceName + '-config-' + selected.node_env + '/repo-manifest');
repomanifest = require(manifestpath)()
chessinstances = chessinstances || {};
chessinstances[selected.instanceName] = chessinstances[selected.instanceName] || {}
chessinstances[selected.instanceName][selected.node_env] = chessinstances[selected.instanceName][selected.node_env] || {}
chessinstances['current_run'] = { instanceName: selected.instanceName, node_env: selected.node_env }
// Config from server always override merges into selection ecept for the current selection.
selectedinstance = utils.assign(chessinstances[selected.instanceName][selected.node_env], selected, repomanifest)
fs.writeFileSync(instanceroot + '/chessinstances.js', 'module.exports = ' + JSON.stringify(chessinstances, null, 2) + '', { 'flag': 'w' })
// PB : TODO -- We should probably write the new server config also...
selectedinstance.reposerver = selectedinstance.reposervers[0] // PB : TODO -- Attempt first one that is available and online...
ENV.NODE_ENV = selectedinstance.node_env;
})
.catch((e) => {
console.error(e)
console.error('Config acquisition failed.')
})
}) })
} }


var launchpath = process.cwd().replace(/\\/, '/') var launchpath = process.cwd().replace(/\\/, '/')
} }
} }
instanceroot = root.replace(/\\/, '/'); instanceroot = root.replace(/\\/, '/');
return Object.assign({ root }, __default);
__default.root = root;
return Promise.resolve(__default);
} }


//
var __default = { var __default = {


// Default is public server only. // Default is public server only.
, node_env: 'development' , node_env: 'development'
} }


var __interactve_promts = {
get reposerver(){
return cli.prompt(this.reposervers, 'git default repo').then(reposerver => {
Object.defineProperty(this, 'reposerver', {
value: reposerver,
writable: false,
configurable : true
});
return reposerver
})
}
, set reposerver(reposerver){
Object.defineProperty(this, 'reposerver', {
value: reposerver,
writable: false,
configurable : true
});
return reposerver
}
}

var downloadsdir = '../Downloads'; var downloadsdir = '../Downloads';
var prerequisites = [ var prerequisites = [
{ {
// , '/MERGETASKS=!runcode' // This is required only for vscode... // , '/MERGETASKS=!runcode' // This is required only for vscode...
]] ]]
, preinstallsteps: function() { , preinstallsteps: function() {
var prompt = cli.prompt;
var prompt = cli.prompter;
var steps = [ var steps = [
() => { () => {
if (!existsSync(downloadsdir + '/' + this.installer)) { if (!existsSync(downloadsdir + '/' + this.installer)) {
} }
] ]
var prompts = [ var prompts = [
() => prompt.ask(`git user name : ( <= ${gitUser} )`).then((user) => { gitUser = user; })
() => prompt.ask(`git user name : ( <= ${gitUser} )`).then((user) => { gitUser = user; })
, () => prompt.ask(`git email : ( <= ${gitEmail} )`).then((email) => { gitEmail = email; }) , () => prompt.ask(`git email : ( <= ${gitEmail} )`).then((email) => { gitEmail = email; })
] ]
return any([any(steps), any(prompts)]).then(() => { prompt.close() }) return any([any(steps), any(prompts)]).then(() => { prompt.close() })
} }
, postinstallsteps: function(){ , postinstallsteps: function(){
var prompt = cli.prompt;
var prompt = cli.prompter;
var gitUser = 'guest'; var gitUser = 'guest';
var gitEmail = 'guest@bbh.org.in'; var gitEmail = 'guest@bbh.org.in';
prompts.push( prompts.push(
()=>{ ()=>{
var choices = { 0 : 'guest', 1 : 'chessdemo' } var choices = { 0 : 'guest', 1 : 'chessdemo' }
return prompt.ask(
`git user name \n ` + Object.keys(choices).map(choice => { return ` ${(+choice) + 1}) ${choices[choice]} `}).join('\n') + `\n default ( <= ${choices[0]} ) : `
).then(choice => {
if(!choice) return gitUser = choices[0];
if(choice && isNaN(+choice)) return gitUser = choice;
return gitUser = choices[choice + 1];
})
return cli.prompt(choices, 'git user name').then(gituser => gitUser = gituser)
} }
) )


prompts.push( prompts.push(
()=>{ ()=>{
var choices = { 0 : 'guest@bbh.org.in', 1 : 'chessdemo@bbh.org.in' } var choices = { 0 : 'guest@bbh.org.in', 1 : 'chessdemo@bbh.org.in' }
return prompt.ask(
`git user email \n ` + Object.keys(choices).map(choice => { return ` ${(+choice) + 1}) ${choices[choice]} `}).join('\n') + `\n default ( <= ${choices[0]} ) : `
).then(choice => {
if(!choice) return gitEmail = choices[0];
if(choice && isNaN(+choice)) return gitEmail = choice;
return gitEmail = choices[choice + 1];
})
return cli.prompt(choices, 'git user email').then(gitemail => gitEmail = gitemail)
} }
) )


return Promise.all(downloadtasks).then(() => { return any(installtasks) }) return Promise.all(downloadtasks).then(() => { return any(installtasks) })
} }


function initinstances(chessinstances, selected) {
chessinstances.current_run.instanceName = processedArgs._[1] = processedArgs._[1] || chessinstances.current_run.instanceName || selected.instanceName;
chessinstances.current_run.node_env = processedArgs.node_env = processedArgs.node_env || chessinstances.current_run.node_env || selected.node_env;
chessinstances[chessinstances.current_run.instanceName] = chessinstances[chessinstances.current_run.instanceName] || {}
selectedinstance = Object.assign(selected, chessinstances[chessinstances.current_run.instanceName][chessinstances.current_run.node_env], clioverrides);
repomanifest = selectedinstance
return chessinstances
}
function acquirelocalinstances(selected){
var chessinstances = utils.assign(require(path.normalize(selected.root + '/chessinstances.js')));
return initinstances(chessinstances, selected)
}


function updateselection(selected) { selectedinstance = utils.assign(selectedinstance, selected) }
var detectedInstance = detectInstance(); // From launch location etc.
var selectedinstance = detectedInstance
var clioverrides = { }
processedArgs._[1] ? clioverrides.instanceName = processedArgs._[1]: null;
processedArgs.node_env ? clioverrides.node_env = (process.env.NODE_ENV && process.env.NODE_ENV.trim()) || processedArgs.node_env
: (process.env.NODE_ENV && process.env.NODE_ENV.trim()) ? clioverrides.node_env = (process.env.NODE_ENV && process.env.NODE_ENV.trim()): null;

selectedinstance = detectedInstance = Object.assign(selectedinstance, clioverrides);
var maintask = () => {
try {
// function updateselection(selected) { selectedinstance = utils.assign(selectedinstance, selected) }
var selectedinstance = null;
var chessinstances = { current_run : {} };
acquireElevationState().then(() => {
var skipprerequisites = false;
var clioverrides = { }
function initinstances(chessinstances, selected) {
chessinstances.current_run.instanceName = processedArgs._[1] = processedArgs._[1] || chessinstances.current_run.instanceName || selected.instanceName;
chessinstances.current_run.node_env = processedArgs.node_env = processedArgs.node_env || chessinstances.current_run.node_env || selected.node_env;
chessinstances[chessinstances.current_run.instanceName] = chessinstances[chessinstances.current_run.instanceName] || {}

// Override sequence.
// __default, chessinstances[current_run], instanceName-config-development, cliargs, interactve_promts
selectedinstance = Object.assign(
selected
, chessinstances[chessinstances.current_run.instanceName][chessinstances.current_run.node_env]
, clioverrides
// , __interactve_promts -- Cant just override. Also need selectedinstance to be ready...
);
repomanifest = selectedinstance
return chessinstances
}
function acquirelocalinstances(selected){
var chessinstances = utils.assign(require(path.normalize(selected.root + '/chessinstances.js')));
return chessinstances
}

var maintask = () => {
// Default cmd to run ! // Default cmd to run !
var chessinstances = acquirelocalinstances(selectedinstance);
processedArgs._[0] === processedArgs._[0] || 'pull'; processedArgs._[0] === processedArgs._[0] || 'pull';
// defaultRepoServer = repomanifest.reposervers[0] // PB : TODO -- Attempt first one that is available and online from all that are available...
return prerequisites.git.verifyAndInstall().then(()=>{
return acquireConfig(selectedinstance, chessinstances).catch((e) => {
console.error('Exisitng config Failed. Fix config and rerun or chose another.')
console.error(e);
// selectedinstance.reposerver = repomanifest.reposervers[0] // PB : TODO -- Attempt first one that is available and online from all that are available...
return prerequisites.git.verifyAndInstall().then(()=>{
var e = { message : 'verifyAndInstall', success : true}
return acquireConfig(selectedinstance, chessinstances).catch((err) => {
e = err;
console.error('Chosen cofiguraton failed or not found. Fix config and rerun or chose another.')
console.error(err)
}).then(() => { return elxrworker(true) }) }).then(() => { return elxrworker(true) })
});
// .finally(()=>{
// fs.writeFileSync('run.log', ', ' + JSON.stringify({ error: e.message }), { 'flag': 'a+' })
// if(!e.success) fs.writeFileSync('run.done', 'error');
// // return process.exit()
// })
})
} }
catch (e) {
console.error(e)
// No local instances config found. We acquire user choices and proceed to reattempt.
chessinstances = {}
chessinstances.current_run = {}
initinstances(chessinstances, selectedinstance)

return detectInstance().then((detectedInstance)=>{

processedArgs._[1] ? clioverrides.instanceName = processedArgs._[1]: null;
processedArgs.node_env ? clioverrides.node_env = (process.env.NODE_ENV && process.env.NODE_ENV.trim()) || processedArgs.node_env
: (process.env.NODE_ENV && process.env.NODE_ENV.trim()) ? clioverrides.node_env = (process.env.NODE_ENV && process.env.NODE_ENV.trim()): null;
selectedinstance = Object.assign(detectedInstance, clioverrides);
var todo = Promise.resolve(true); var todo = Promise.resolve(true);
if(processedArgs._[0] && selectedinstance.node_env && selectedinstance.instanceName){
// Weve been told what to do.
todo = Promise.resolve(true)
try {
chessinstances = acquirelocalinstances(selectedinstance);
initinstances(chessinstances, selectedinstance)
} }
else todo = acquireChoices(selectedinstance)
catch (e) {
console.error(e)
// No local instances config found. We acquire user choices and proceed to reattempt.
initinstances(chessinstances, selectedinstance)


return todo.then(() => {
try {
var chessinstances = acquirelocalinstances(selectedinstance)
}
catch (e) {
console.error(e)
console.error('No local instances config found in current root = ' + selectedinstance.root);
console.log('A config will be createed with the instance and environment chosen...')
}
finally {
return prerequisites.git.verifyAndInstall().then(()=>{
return acquireConfig(selectedinstance, chessinstances).catch((e) => {
console.error('Chosen cofiguraton failed or not found')
console.error(e)
}).then(() => { return elxrworker(true) })
.finally(()=>{
fs.writeFileSync('run.log', ', ' + JSON.stringify({ error: e.message }), { 'flag': 'a+' })
fs.writeFileSync('run.done', 'error');
// return process.exit()
var prompts = [];
Object.keys(__interactve_promts).forEach(k => {
if(!selectedinstance[k]) {
prompts.push(async ()=>{
Object.defineProperty(selectedinstance, k, Object.getOwnPropertyDescriptor(__interactve_promts, k));
return await selectedinstance[k]
}) })
})
}
})
todo = any(prompts).then(()=>{ return selectedinstance })
if(!processedArgs._[0] || !selectedinstance.node_env || !selectedinstance.instanceName){
// Weve been told what to do.
todo = acquireChoices(selectedinstance)
} }
})
}
}
todo = todo.then(() => {
try {
chessinstances = acquirelocalinstances(selectedinstance)
initinstances(chessinstances, selectedinstance)
}
catch (e) {
console.error(e)
console.log('No local instances config found in current root = ' + selectedinstance.root);
console.log('A config will be createed with the instance and environment chosen...')
// return (async ()=>{return await __default.reposerver})().then(()=>{
// // selectedinstance = Object.assign(detectedInstance, clioverrides);
// return selectedinstance = Object.assign(__default, selectedinstance);
// })
return selectedinstance
}
})
}


acquireElevationState().then(() => {
var skipprerequisites = false
if (!skipprerequisites && !__isElevated) mainTasks.push(verifyAndInstallPrerequisites);
mainTasks.push(maintask)
return any(mainTasks);
return todo
}).then(()=>{
if (!skipprerequisites && !__isElevated) mainTasks.push(verifyAndInstallPrerequisites);
mainTasks.push(maintask)
return any(mainTasks);
})
}) })


// detect if alread installed -> Take no action. // detect if alread installed -> Take no action.

Loading…
Cancel
Save