|
|
|
|
|
|
|
|
, { cwd: instanceroot + '/' + repo, title : 'pull all origins for ' + branch + ' ' + repo + ' ' + parameters.join(' ') }] |
|
|
, { cwd: instanceroot + '/' + repo, title : 'pull all origins for ' + branch + ' ' + repo + ' ' + parameters.join(' ') }] |
|
|
} |
|
|
} |
|
|
else { |
|
|
else { |
|
|
console.warn('No branch was specified detecting from working client.') |
|
|
|
|
|
|
|
|
// console.warn('No branch was specified detecting from working client.') |
|
|
// First check if working client exits. |
|
|
// First check if working client exits. |
|
|
// if (existsSync(instanceroot + '/' + repo)) { |
|
|
// if (existsSync(instanceroot + '/' + repo)) { |
|
|
var pullCmd = gitops.getdiscoverbranchcmd(repo) |
|
|
var pullCmd = gitops.getdiscoverbranchcmd(repo) |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var repomanifest = null; |
|
|
|
|
|
var currentGitAuthUser; // nodeShellExec('git', ['config', 'user.email']) ... PB : TODO-- get the current gittea username |
|
|
var currentGitAuthUser; // nodeShellExec('git', ['config', 'user.email']) ... PB : TODO-- get the current gittea username |
|
|
var defaultRepoOwner = 'chess'; |
|
|
var defaultRepoOwner = 'chess'; |
|
|
var elevatedRunasRepos = null |
|
|
var elevatedRunasRepos = null |
|
|
|
|
|
|
|
|
var gitbash = "C:\\Program Files\\Git\\bin\\sh.exe" |
|
|
var gitbash = "C:\\Program Files\\Git\\bin\\sh.exe" |
|
|
// var gitbash = "G:\\Installed\\Git\\bin\\sh.exe" |
|
|
// var gitbash = "G:\\Installed\\Git\\bin\\sh.exe" |
|
|
// Relevant git repos |
|
|
// Relevant git repos |
|
|
// var repomanifest = require('../'+repomanifest.instanceName+'-config-'+ nodeenv +'/repo-manifest')() |
|
|
|
|
|
var exludeMergeRepos = []; |
|
|
var exludeMergeRepos = []; |
|
|
var useGitPull = processedArgs.useGitPull || false; |
|
|
var useGitPull = processedArgs.useGitPull || false; |
|
|
var configPromise = null |
|
|
var configPromise = null |
|
|
|
|
|
|
|
|
4) Iterates all repos and checkout to the ENV specified. 'git', ['checkout', checkoutMap[runconfig.NODE_ENV] || runconfig.NODE_ENV] |
|
|
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], |
|
|
5) Iterates all repos and merge from source configured in mergesource. 'git', ['merge', mergesource], |
|
|
*/ |
|
|
*/ |
|
|
var runconfig = { NODE_ENV: repomanifest.node_env } |
|
|
|
|
|
|
|
|
var runconfig = { NODE_ENV: selectedinstance.node_env } |
|
|
try { runconfig = Object.assign(runconfig, require(instanceroot + '/run.js')) } catch (e) { } |
|
|
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 ? |
|
|
// We no longer need to check ruans.. ??? if we were initiated from self invoked privileged shell ? |
|
|
if (( /*processedArgs.runas && processedArgs.runas !== 'self' &&*/ !processedArgs.force) && |
|
|
if (( /*processedArgs.runas && processedArgs.runas !== 'self' &&*/ !processedArgs.force) && |
|
|
runconfig.NODE_ENV && runconfig.NODE_ENV === (repomanifest.node_env || runconfig.NODE_ENV) && |
|
|
|
|
|
repomanifest.instanceName && runconfig.use === repomanifest.instanceName) { |
|
|
|
|
|
|
|
|
runconfig.NODE_ENV && runconfig.NODE_ENV === (selectedinstance.node_env || runconfig.NODE_ENV) && |
|
|
|
|
|
selectedinstance.instanceName && runconfig.use === selectedinstance.instanceName) { |
|
|
|
|
|
|
|
|
console.log(`No change detected. Already using requested specs : ${runconfig.NODE_ENV} ${runconfig.use}`) |
|
|
console.log(`No change detected. Already using requested specs : ${runconfig.NODE_ENV} ${runconfig.use}`) |
|
|
if (processedArgs.runas) { fs.writeFileSync('run.done', 'success') } |
|
|
if (processedArgs.runas) { fs.writeFileSync('run.done', 'success') } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def = def || { |
|
|
def = def || { |
|
|
repos : repomanifest.repos, |
|
|
|
|
|
elevated : repomanifest.elevated |
|
|
|
|
|
|
|
|
repos : selectedinstance.repos, |
|
|
|
|
|
elevated : selectedinstance.elevated |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
var elevatedpulltasks = null; |
|
|
var elevatedpulltasks = null; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function preworkerconfig(){ |
|
|
function preworkerconfig(){ |
|
|
// Everything runs after this check is completed. Elevation occurs out of process when needed. |
|
|
// Everything runs after this check is completed. Elevation occurs out of process when needed. |
|
|
gitRepos = repomanifest.repos |
|
|
|
|
|
|
|
|
gitRepos = selectedinstance.repos |
|
|
// gitRepos = ['chess-server-lib']; |
|
|
// gitRepos = ['chess-server-lib']; |
|
|
|
|
|
|
|
|
// Repositiories that have symlinks that require elevated priviletes in windows to create symlinks |
|
|
// Repositiories that have symlinks that require elevated priviletes in windows to create symlinks |
|
|
elevatedRunasRepos = repomanifest.elevated |
|
|
|
|
|
|
|
|
elevatedRunasRepos = selectedinstance.elevated |
|
|
// Repos that should excluded from merge for releases... |
|
|
// Repos that should excluded from merge for releases... |
|
|
exludeMergeRepos = repomanifest.exludeMergeRepos |
|
|
|
|
|
|
|
|
exludeMergeRepos = selectedinstance.exludeMergeRepos |
|
|
|
|
|
|
|
|
// mysqldump --add-drop-table --no-data -u root -p db_name | grep 'DROP TABLE' ) > drop_all_tables.sql |
|
|
// mysqldump --add-drop-table --no-data -u root -p db_name | grep 'DROP TABLE' ) > drop_all_tables.sql |
|
|
// mysql -u root -p db_name < drop_all_tables.sql |
|
|
// mysql -u root -p db_name < drop_all_tables.sql |
|
|
|
|
|
|
|
|
else return __runcmd(processedArgs.label || processedArgs._[0] || 'h'); |
|
|
else return __runcmd(processedArgs.label || processedArgs._[0] || 'h'); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
var getManifest = function () { |
|
|
|
|
|
// Once choices are made we need to load config according to those choices. |
|
|
|
|
|
|
|
|
|
|
|
// No trace of a previous run... |
|
|
|
|
|
// Default Config... |
|
|
|
|
|
return repomanifest = selectedinstance; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function acquireChoices(selectedinstance) { |
|
|
function acquireChoices(selectedinstance) { |
|
|
|
|
|
|
|
|
var hasconfig = false; |
|
|
var hasconfig = false; |
|
|
|
|
|
|
|
|
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' |
|
|
selectedinstance.reposerver = '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 |
|
|
|
|
|
// This is because the manifest at any server location can redirect to the preferred server.. |
|
|
|
|
|
} |
|
|
} |
|
|
else if (choice === 'h') { |
|
|
else if (choice === 'h') { |
|
|
processedArgs._[0] = 'h' |
|
|
processedArgs._[0] = 'h' |
|
|
|
|
|
|
|
|
fs.writeFileSync(instanceroot + '/chessinstances.js', 'module.exports = ' + JSON.stringify(chessinstances, null, 2) + '', { 'flag': 'w' }) |
|
|
fs.writeFileSync(instanceroot + '/chessinstances.js', 'module.exports = ' + JSON.stringify(chessinstances, null, 2) + '', { 'flag': 'w' }) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
var acquireConfig = function (selected, chessinstances) { |
|
|
|
|
|
|
|
|
var acquireConfig = function (selected) { |
|
|
|
|
|
|
|
|
var configrepo = selected.instanceName + '-config-' + selected.node_env; |
|
|
var configrepo = selected.instanceName + '-config-' + selected.node_env; |
|
|
|
|
|
|
|
|
return performPull(configrepo).then(() => { |
|
|
return performPull(configrepo).then(() => { |
|
|
var manifestpath = path.normalize(selected.root + '/' + selected.instanceName + '-config-' + selected.node_env + '/repo-manifest'); |
|
|
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 } |
|
|
|
|
|
|
|
|
selectedinstance = require(manifestpath)() |
|
|
// Config from server always override merges into selection ecept for the current selection. |
|
|
// Config from server always override merges into selection ecept for the current selection. |
|
|
// PB : TODO -- utils.assign Array merges are non-distinct... |
|
|
// PB : TODO -- utils.assign Array merges are non-distinct... |
|
|
selectedinstance = utils.assign(chessinstances[selected.instanceName][selected.node_env], selected, repomanifest) |
|
|
|
|
|
// chessinstances[selectedinstance.instanceName][selectedinstance.node_env] = selectedinstance; |
|
|
|
|
|
cacheWriteInstanceConfig(chessinstances) |
|
|
|
|
|
selectedinstance = chessinstances[selected.instanceName][selected.node_env] |
|
|
|
|
|
// PB : TODO -- We should probably write the new server config also... |
|
|
|
|
|
|
|
|
if(!selectedinstance.repos[0].repo) { |
|
|
|
|
|
console.warn('repo manifest has obsolete format. Attempting upgrade.') |
|
|
|
|
|
selectedinstance.repos = selectedinstance.repos.map(function(repo){ return { repo } }) |
|
|
|
|
|
} |
|
|
|
|
|
if(selectedinstance.elevated[0] && !selectedinstance.elevated[0].repo) { |
|
|
|
|
|
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) |
|
|
selectedinstance.reposerver = selectedinstance.reposerver || selectedinstance.reposervers[0] // PB : TODO -- Attempt first one that is available and online... |
|
|
selectedinstance.reposerver = selectedinstance.reposerver || selectedinstance.reposervers[0] // PB : TODO -- Attempt first one that is available and online... |
|
|
|
|
|
cacheWriteInstanceConfig(chessinstances) |
|
|
ENV.NODE_ENV = selectedinstance.node_env; |
|
|
ENV.NODE_ENV = selectedinstance.node_env; |
|
|
}) |
|
|
}) |
|
|
.catch((e) => { |
|
|
.catch((e) => { |
|
|
|
|
|
|
|
|
acquireElevationState().then(() => { |
|
|
acquireElevationState().then(() => { |
|
|
var skipprerequisites = false; |
|
|
var skipprerequisites = false; |
|
|
var clioverrides = { } |
|
|
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] || {} |
|
|
|
|
|
|
|
|
function initinstances(selected) { |
|
|
|
|
|
// PB : TODO -- processedArgs should already be part of selected. |
|
|
|
|
|
var instanceName = processedArgs._[1] = processedArgs._[1] || chessinstances.current_run.instanceName || selected.instanceName; |
|
|
|
|
|
var node_env = processedArgs.node_env = processedArgs.node_env || chessinstances.current_run.node_env || selected.node_env; |
|
|
|
|
|
chessinstances['current_run'] = chessinstances[instanceName][selected.node_env] ? |
|
|
|
|
|
{ instanceName: instanceName, node_env: node_env } : chessinstances['current_run'] |
|
|
|
|
|
// chessinstances[chessinstances.current_run.instanceName] = chessinstances[chessinstances.current_run.instanceName] || {} |
|
|
|
|
|
|
|
|
|
|
|
if(path.normalize(selected.root) !== path.normalize(chessinstances[instanceName][node_env].root)) { |
|
|
|
|
|
throw "Mismatched chessinstances config found " + chessinstances[instanceName][node_env].root + ' does not match ' + selected.root |
|
|
|
|
|
} |
|
|
// Override sequence. |
|
|
// Override sequence. |
|
|
// __default, chessinstances[current_run], instanceName-config-development, cliargs, interactve_promts |
|
|
// __default, chessinstances[current_run], instanceName-config-development, cliargs, interactve_promts |
|
|
selectedinstance = Object.assign( |
|
|
selectedinstance = Object.assign( |
|
|
selected |
|
|
selected |
|
|
, chessinstances[chessinstances.current_run.instanceName][chessinstances.current_run.node_env] |
|
|
|
|
|
|
|
|
, chessinstances[instanceName][node_env] |
|
|
, clioverrides |
|
|
, clioverrides |
|
|
// , __interactve_promts -- Cant just override. Also need selectedinstance to be ready... |
|
|
// , __interactve_promts -- Cant just override. Also need selectedinstance to be ready... |
|
|
); |
|
|
); |
|
|
repomanifest = selectedinstance |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
chessinstances[instanceName] = chessinstances[instanceName] || {} |
|
|
|
|
|
chessinstances[instanceName][node_env] = chessinstances[instanceName][node_env] || {} |
|
|
|
|
|
if(!selectedinstance.repos[0].repo) { |
|
|
|
|
|
console.warn('repo manifest has obsolete format. Attempting upgrade.') |
|
|
|
|
|
selectedinstance.repos = selectedinstance.repos.map(function(repo){ return { repo } }) |
|
|
|
|
|
} |
|
|
|
|
|
if(selectedinstance.elevated[0] && !selectedinstance.elevated[0].repo) { |
|
|
|
|
|
console.warn('elevated repo manifest has obsolete format. Attempting upgrade.') |
|
|
|
|
|
selectedinstance.elevated = selectedinstance.elevated.map(function(repo){ return { repo } }) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Config from server always override merges into selection except for the current selection. |
|
|
|
|
|
// PB : TODO -- utils.assign Array merges are non-distinct... |
|
|
|
|
|
chessinstances[instanceName][node_env] = selectedinstance = utils.assign(selected, selectedinstance) |
|
|
|
|
|
// chessinstances[selectedinstance.instanceName][selectedinstance.node_env] = selectedinstance; |
|
|
|
|
|
cacheWriteInstanceConfig(chessinstances) |
|
|
|
|
|
// PB : TODO -- We should probably write the new server config also... |
|
|
|
|
|
selectedinstance.reposerver = selectedinstance.reposerver || selectedinstance.reposervers[0] // PB : TODO -- Attempt first one that is available and online... |
|
|
|
|
|
|
|
|
return chessinstances |
|
|
return chessinstances |
|
|
} |
|
|
} |
|
|
function acquirelocalinstances(selected){ |
|
|
function acquirelocalinstances(selected){ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Default cmd to run ! |
|
|
// Default cmd to run ! |
|
|
processedArgs._[0] === processedArgs._[0] || 'pull'; |
|
|
processedArgs._[0] === processedArgs._[0] || 'pull'; |
|
|
// selectedinstance.reposerver = repomanifest.reposervers[0] // PB : TODO -- Attempt first one that is available and online from all that are available... |
|
|
|
|
|
|
|
|
// selectedinstance.reposerver = selectedinstance.reposervers[0] // PB : TODO -- Attempt first one that is available and online from all that are available. |
|
|
|
|
|
|
|
|
if(!noprerequisites[processedArgs._[0]] |
|
|
if(!noprerequisites[processedArgs._[0]] |
|
|
&& !skipprereqs[processedArgs._[0]] |
|
|
&& !skipprereqs[processedArgs._[0]] |
|
|
) { |
|
|
) { |
|
|
return prerequisites.git.verifyAndInstall().then(()=>{ |
|
|
return prerequisites.git.verifyAndInstall().then(()=>{ |
|
|
var e = { message : 'verifyAndInstall', success : true} |
|
|
var e = { message : 'verifyAndInstall', success : true} |
|
|
return acquireConfig(selectedinstance, chessinstances).catch((err) => { |
|
|
|
|
|
|
|
|
return acquireConfig(selectedinstance).catch((err) => { |
|
|
e = err; |
|
|
e = err; |
|
|
console.error('Chosen cofiguraton failed or not found. Fix config and rerun or chose another.') |
|
|
console.error('Chosen cofiguraton failed or not found. Fix config and rerun or chose another.') |
|
|
console.error(err) |
|
|
console.error(err) |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
try { |
|
|
try { |
|
|
chessinstances = acquirelocalinstances(selectedinstance); |
|
|
chessinstances = acquirelocalinstances(selectedinstance); |
|
|
initinstances(chessinstances, selectedinstance) |
|
|
|
|
|
|
|
|
initinstances(selectedinstance) |
|
|
|
|
|
|
|
|
var instanceNameChoices = new Set(Object.keys( chessinstances) ) |
|
|
var instanceNameChoices = new Set(Object.keys( chessinstances) ) |
|
|
instanceNameChoices.delete('current_run') |
|
|
instanceNameChoices.delete('current_run') |
|
|
|
|
|
|
|
|
catch (e) { |
|
|
catch (e) { |
|
|
console.error(e) // Missing chessinstances is not an error... |
|
|
console.error(e) // Missing chessinstances is not an error... |
|
|
|
|
|
|
|
|
initinstances(chessinstances, selectedinstance) |
|
|
|
|
|
|
|
|
initinstances(selectedinstance) |
|
|
|
|
|
|
|
|
var instanceNameChoices = new Set(Object.keys( chessinstances) ) |
|
|
var instanceNameChoices = new Set(Object.keys( chessinstances) ) |
|
|
instanceNameChoices.delete('current_run') |
|
|
instanceNameChoices.delete('current_run') |
|
|
|
|
|
|
|
|
todo = todo.then(() => { |
|
|
todo = todo.then(() => { |
|
|
try { |
|
|
try { |
|
|
chessinstances = acquirelocalinstances(selectedinstance) |
|
|
chessinstances = acquirelocalinstances(selectedinstance) |
|
|
initinstances(chessinstances, selectedinstance) |
|
|
|
|
|
|
|
|
initinstances(selectedinstance) |
|
|
} |
|
|
} |
|
|
catch (e) { |
|
|
catch (e) { |
|
|
console.error(e) |
|
|
console.error(e) |