|
|
@@ -1,7 +1,63 @@ |
|
|
|
var statuslog = require('./result') |
|
|
|
var path = require('path'); |
|
|
|
var path = require('path'); |
|
|
|
var utils = require('bbhverse'); |
|
|
|
var any = utils.any; |
|
|
|
var Tasq = utils.Tasq |
|
|
|
var statuslog = utils.Traq |
|
|
|
Tasq.addlistener(statuslog.statuslog) |
|
|
|
|
|
|
|
|
|
|
|
function nodeShellExec() { |
|
|
|
|
|
|
|
var args = Array.from(arguments); |
|
|
|
var opts = args[2] = args[2] || {} |
|
|
|
opts.title ? null : opts.title = `${args[0]} ${args[1] }` |
|
|
|
const child = spawn(...arguments); |
|
|
|
|
|
|
|
var p = new Promise(function(resolve, reject){ |
|
|
|
if(!opts.detached) { |
|
|
|
var messages = []; // PB : TODO -- Explore stream for Task level aggregation to prevent interleaved messages from multiple tasks... |
|
|
|
var success = true; |
|
|
|
|
|
|
|
if(opts.stdio !== 'ignore') { |
|
|
|
child.stdout.setEncoding('utf8'); |
|
|
|
child.stderr.setEncoding('utf8'); |
|
|
|
child.stdout.on('data', (chunk) => { chunk.trim() === '' ? null : messages.push(chunk); /* console.log('d: ' + chunk) */ }); |
|
|
|
child.on('error', (chunk) => { success = false; messages.push(chunk); /* console.error('e: ' + chunk) */ } ); |
|
|
|
child.stderr.on('data', (chunk) => { |
|
|
|
if(messages.join('').indexOf('fatal: not a git repository') > -1) opts.haserrors = true; |
|
|
|
messages.push(chunk); |
|
|
|
// console.error('stderr e: ' + chunk) |
|
|
|
}); |
|
|
|
} |
|
|
|
child.on('close', (code) => { |
|
|
|
if(+code !== 0 || opts.haserrors) success = false; |
|
|
|
if(opts.stdio !== 'ignore') { |
|
|
|
var logEntry = { result: `${opts.title} exited with code ${code}`, messages } |
|
|
|
logEntry.success = success; |
|
|
|
|
|
|
|
if(opts.runas){ |
|
|
|
// success ? logEntry.success = true : null; |
|
|
|
fs.writeFileSync('run.log', ', ' + JSON.stringify(logEntry), {'flag':'a+'} ) |
|
|
|
} |
|
|
|
else { |
|
|
|
// console.log( messages.join('') ) |
|
|
|
process.stdout.write( messages.join('') ) |
|
|
|
} |
|
|
|
} |
|
|
|
if(code !== 0 || opts.haserrors) return reject(logEntry) |
|
|
|
resolve(logEntry) |
|
|
|
}); |
|
|
|
} |
|
|
|
else { |
|
|
|
child.unref() |
|
|
|
resolve(true); |
|
|
|
} |
|
|
|
}); |
|
|
|
p.process = child; |
|
|
|
return p; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 'use strict'; |
|
|
|
|
|
|
|
// PB : TODO -- make sure folder context is proper coz we can now run elxr from anywhere. |
|
|
@@ -92,7 +148,68 @@ var brandName = 'elixir'; |
|
|
|
var nodeenv = process.env.NODE_ENV || processedArgs.node_env || 'development' |
|
|
|
if(nodeenv.trim() === 'production') nodeenv = 'production' |
|
|
|
// var repomanifest = require('../'+brandName+'-config-'+ nodeenv +'/repo-manifest')() |
|
|
|
var manifestpath = '../'+brandName+'-config-'+nodeenv+'/repo-manifest'; |
|
|
|
var exludeMergeRepos = []; |
|
|
|
var useGitPull = processedArgs.useGitPull || false; |
|
|
|
var getPullCmd = (repo)=>{ |
|
|
|
// console.log(useGitPull) |
|
|
|
|
|
|
|
var pullCmd = [ gitInstallDir |
|
|
|
, ['-c', 'for i in `git remote`; do git pull $i master; done;'] |
|
|
|
, { cwd : repo, title : 'pull all origins for ' + repo }] |
|
|
|
// var pullCmd = ['pullall', [], { cwd : repo }] |
|
|
|
if(useGitPull) pullCmd = ['git', ['pull'], { |
|
|
|
inherit : true, shell: true, |
|
|
|
cwd : repo |
|
|
|
// , env: process.env |
|
|
|
, runas : processedArgs.runas |
|
|
|
, title : `git pull ${repo}` |
|
|
|
}] |
|
|
|
return pullCmd |
|
|
|
} |
|
|
|
|
|
|
|
var performPull = (repo) => { |
|
|
|
|
|
|
|
if(exludeMergeRepos[repo]) return Promise.resolve({ 'skipped' : true }) |
|
|
|
|
|
|
|
|
|
|
|
if(existsSync(repo)) { |
|
|
|
console.log('pulling ' + repo) |
|
|
|
return nodeShellExec.apply(null, getPullCmd(repo)).catch((e)=>{ console.error(e) }) |
|
|
|
} |
|
|
|
else { |
|
|
|
console.log('cloning ' + repo) |
|
|
|
// PB : TODO -- detect if a clonable repo exists in currentGitAuthUser |
|
|
|
return nodeShellExec('git', ['clone', '-c', 'core.symlinks=true', defaultRepoServer + `/${defaultRepoOwner}/` + repo + '.git'], |
|
|
|
{ |
|
|
|
inherit : true, shell: true, |
|
|
|
env: process.env |
|
|
|
, runas : processedArgs.runas |
|
|
|
}).catch((e)=>{ console.error(e) }).then(()=>{ |
|
|
|
|
|
|
|
return nodeShellExec('git', ['config', '--replace-all' , 'core.symlinks', true], |
|
|
|
{ |
|
|
|
inherit : true, shell: true, |
|
|
|
env: process.env |
|
|
|
, cwd : repo |
|
|
|
, runas : processedArgs.runas |
|
|
|
, title : `git core.symlinks --replace-all true for ${defaultRepoServer + `/${defaultRepoOwner}/` + repo + '.git'}` |
|
|
|
}) |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
var configrepo = brandName+'-config-'+nodeenv |
|
|
|
var configpath = '../' + configrepo; |
|
|
|
var configPromise = null |
|
|
|
|
|
|
|
if(!existsSync(configpath)){ |
|
|
|
configPromise = performPull(configrepo) |
|
|
|
} |
|
|
|
else configPromise = Promise.resolve(true) |
|
|
|
|
|
|
|
configPromise.then(()=>{ |
|
|
|
|
|
|
|
var manifestpath = '../'+brandName+'-config-'+nodeenv+'/repo-manifest'; |
|
|
|
// var manifestpath = '../'+brandName+'-config-'+'production'+'/repo-manifest'; |
|
|
|
console.dir(manifestpath) |
|
|
|
var repomanifest = require(manifestpath)() |
|
|
@@ -104,7 +221,7 @@ var gitRepos = repomanifest.repos |
|
|
|
// |
|
|
|
var elevatedRunasRepos = repomanifest.elevated |
|
|
|
|
|
|
|
var exludeMergeRepos = repomanifest.exludeMergeRepos |
|
|
|
exludeMergeRepos = repomanifest.exludeMergeRepos |
|
|
|
|
|
|
|
// var productionRepos = [ 'elixir-config-production' ] |
|
|
|
// var productionIsAllowed = (nodeenv === 'production'); |
|
|
@@ -568,55 +685,6 @@ var __runcmd = function(label){ |
|
|
|
// env: env |
|
|
|
// }) |
|
|
|
|
|
|
|
var useGitPull = processedArgs.useGitPull || false; |
|
|
|
var getPullCmd = (repo)=>{ |
|
|
|
// console.log(useGitPull) |
|
|
|
|
|
|
|
var pullCmd = [ gitInstallDir |
|
|
|
, ['-c', 'for i in `git remote`; do git pull $i master; done;'] |
|
|
|
, { cwd : repo, title : 'pull all origins for ' + repo }] |
|
|
|
// var pullCmd = ['pullall', [], { cwd : repo }] |
|
|
|
if(useGitPull) pullCmd = ['git', ['pull'], { |
|
|
|
inherit : true, shell: true, |
|
|
|
cwd : repo |
|
|
|
// , env: process.env |
|
|
|
, runas : processedArgs.runas |
|
|
|
, title : `git pull ${repo}` |
|
|
|
}] |
|
|
|
return pullCmd |
|
|
|
} |
|
|
|
|
|
|
|
var performPull = (repo) => { |
|
|
|
|
|
|
|
if(exludeMergeRepos[repo]) return Promise.resolve({ 'skipped' : true }) |
|
|
|
|
|
|
|
|
|
|
|
if(existsSync(repo)) { |
|
|
|
console.log('pulling ' + repo) |
|
|
|
return nodeShellExec.apply(null, getPullCmd(repo)).catch((e)=>{ console.error(e) }) |
|
|
|
} |
|
|
|
else { |
|
|
|
console.log('cloning ' + repo) |
|
|
|
// PB : TODO -- detect if a clonable repo exists in currentGitAuthUser |
|
|
|
return nodeShellExec('git', ['clone', '-c', 'core.symlinks=true', defaultRepoServer + `/${defaultRepoOwner}/` + repo + '.git'], |
|
|
|
{ |
|
|
|
inherit : true, shell: true, |
|
|
|
env: process.env |
|
|
|
, runas : processedArgs.runas |
|
|
|
}).catch((e)=>{ console.error(e) }).then(()=>{ |
|
|
|
|
|
|
|
return nodeShellExec('git', ['config', '--replace-all' , 'core.symlinks', true], |
|
|
|
{ |
|
|
|
inherit : true, shell: true, |
|
|
|
env: process.env |
|
|
|
, cwd : repo |
|
|
|
, runas : processedArgs.runas |
|
|
|
, title : `git core.symlinks --replace-all true for ${defaultRepoServer + `/${defaultRepoOwner}/` + repo + '.git'}` |
|
|
|
}) |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if(!processedArgs.runas) gitRepos.forEach(performPull) |
|
|
|
return isRunningElevated().then( |
|
|
|
(isElevated) => { |
|
|
@@ -752,20 +820,7 @@ var __runcmd = function(label){ |
|
|
|
var pendingpulls = []; |
|
|
|
gitRepos.forEach( (r)=>{ pendingpulls.push(performPull(r)) } ) |
|
|
|
Promise.all(pendingpulls).then(results =>{ |
|
|
|
}).finally(()=>{ |
|
|
|
|
|
|
|
console.log('Total : ' + (statuslog.log.SKIPPED.length + statuslog.log.SUCCESS.length + statuslog.log.FAILURE.length)) |
|
|
|
console.log('Pass : ' + statuslog.log.SUCCESS.length ) |
|
|
|
console.log('Fail : ' + statuslog.log.FAILURE.length) |
|
|
|
console.log('Skipped : ' + statuslog.log.SKIPPED.length) |
|
|
|
|
|
|
|
console.log('FAILURES') |
|
|
|
console.log([JSON.stringify(statuslog.log.FAILURE)]) |
|
|
|
// statuslog.log.FAILURE.forEach(f => { |
|
|
|
// console.error(f); |
|
|
|
// }) |
|
|
|
|
|
|
|
}) |
|
|
|
}).finally(Traq.finally) |
|
|
|
} |
|
|
|
}) |
|
|
|
} |
|
|
@@ -784,57 +839,76 @@ var __runcmd = function(label){ |
|
|
|
var npmbuildrepos = ['loopback-jsonapi-model-serializer'] |
|
|
|
npmbuildrepos.forEach(repo => { |
|
|
|
tasks.push(()=>{ |
|
|
|
var p = nodeShellExec('npm', ['run build'], { |
|
|
|
var p = nodeShellExec('npm', ['i --force'], { |
|
|
|
inherit : true, shell: true |
|
|
|
, cwd : repo |
|
|
|
, env: process.env |
|
|
|
, title : `npm build for ${repo}` |
|
|
|
}).catch((e)=>{ console.error(e) }) |
|
|
|
return p; |
|
|
|
}) |
|
|
|
}) |
|
|
|
bowerRepos.forEach(repo => { |
|
|
|
tasks.push(()=>{ |
|
|
|
var p = nodeShellExec('bower', ['install'], { |
|
|
|
inherit : true, shell: true |
|
|
|
, cwd : repo |
|
|
|
, env: process.env |
|
|
|
, title : `bower i for ${repo}` |
|
|
|
}).catch((e)=>{ console.error(e) }) |
|
|
|
, title : `npm i for ${repo}` |
|
|
|
}).catch((e)=>{ |
|
|
|
console.error('Ignoring Benign Error'); console.error(e) |
|
|
|
}).then(()=>{ |
|
|
|
|
|
|
|
return nodeShellExec('npm', ['run build'], { |
|
|
|
inherit : true, shell: true |
|
|
|
, cwd : repo |
|
|
|
, env: process.env |
|
|
|
, title : `npm run build for ${repo}` |
|
|
|
}).catch(Tasq.catch) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
return p; |
|
|
|
}) |
|
|
|
}) |
|
|
|
gitRepos = gitRepos.concat(elevatedRunasRepos); |
|
|
|
gitRepos.push('client/server'); |
|
|
|
gitRepos.forEach(repo => { |
|
|
|
|
|
|
|
console.log('npm i for ' + repo) |
|
|
|
// nodeShellExec('pwd', [], { |
|
|
|
// // inherit : true, shell: true |
|
|
|
// cwd : repo |
|
|
|
// // , env: process.env |
|
|
|
// , title : `pwd for ${repo}` |
|
|
|
// }).catch((e)=>{ console.error(e) }) |
|
|
|
nodeShellExec('rm', ['package-lock.json'], { |
|
|
|
inherit : true, shell: true |
|
|
|
, cwd : repo |
|
|
|
, env: process.env |
|
|
|
, title : `rm 'package-lock.json' for ${repo}` |
|
|
|
}).catch((e)=>{ console.error(e) }) |
|
|
|
|
|
|
|
any(tasks).then(()=>{ |
|
|
|
|
|
|
|
if( npmbuildrepos.indexOf(repo) < 0) { |
|
|
|
tasks.push(()=>{ |
|
|
|
var p = nodeShellExec('npm', ['i --force'], { |
|
|
|
gitRepos = gitRepos.concat(elevatedRunasRepos); |
|
|
|
gitRepos.push('client/server'); |
|
|
|
|
|
|
|
var repotasks = [] |
|
|
|
gitRepos.forEach(repo => { |
|
|
|
|
|
|
|
console.log('npm i for ' + repo) |
|
|
|
repotasks.push( |
|
|
|
nodeShellExec('rm', ['package-lock.json'], { |
|
|
|
inherit : true, shell: true |
|
|
|
, cwd : repo |
|
|
|
, env: process.env |
|
|
|
, title : `npm i for ${repo}` |
|
|
|
}).catch((e)=>{ console.error(e) }) |
|
|
|
, title : `rm 'package-lock.json' for ${repo}` |
|
|
|
}).catch((e)=>{console.error(e)}) |
|
|
|
.then(()=>{ |
|
|
|
|
|
|
|
if( npmbuildrepos.indexOf(repo) < 0) { |
|
|
|
// tasks.push(()=>{ |
|
|
|
var p = nodeShellExec('npm', ['i --force'], { |
|
|
|
inherit : true, shell: true |
|
|
|
, cwd : repo |
|
|
|
, env: process.env |
|
|
|
, title : `npm i for ${repo}` |
|
|
|
}).catch(Tasq.catch) |
|
|
|
return p; |
|
|
|
// }) |
|
|
|
} |
|
|
|
}) |
|
|
|
) |
|
|
|
}) |
|
|
|
bowerRepos.forEach(repo => { |
|
|
|
repotasks.push(()=>{ |
|
|
|
var p = nodeShellExec('bower', ['install'], { |
|
|
|
inherit : true, shell: true |
|
|
|
, cwd : repo |
|
|
|
, env: process.env |
|
|
|
, title : `bower i for ${repo}` |
|
|
|
}).catch(Tasq.catch) |
|
|
|
return p; |
|
|
|
}) |
|
|
|
} |
|
|
|
}) |
|
|
|
any(tasks); |
|
|
|
}) |
|
|
|
|
|
|
|
return any(repotasks); |
|
|
|
}).catch(e=>{ |
|
|
|
|
|
|
|
}).finally(statuslog.finally) |
|
|
|
|
|
|
|
} |
|
|
|
, 'start' : (label)=>{ |
|
|
@@ -1242,53 +1316,6 @@ if(processedArgs.runas) { |
|
|
|
} |
|
|
|
else __runcmd(processedArgs.label || processedArgs._[0] || 'h'); |
|
|
|
|
|
|
|
function nodeShellExec() { |
|
|
|
|
|
|
|
var args = Array.from(arguments); |
|
|
|
var opts = args[2] = args[2] || {} |
|
|
|
opts.title ? null : opts.title = `${args[0]} ${args[1] }` |
|
|
|
const child = spawn(...arguments); |
|
|
|
}) |
|
|
|
|
|
|
|
var p = new Promise(function(resolve, reject){ |
|
|
|
if(!opts.detached) { |
|
|
|
var messages = []; // PB : TODO -- Explore stream for Task level aggregation to prevent interleaved messages from multiple tasks... |
|
|
|
var success = true; |
|
|
|
|
|
|
|
if(opts.stdio !== 'ignore') { |
|
|
|
child.stdout.setEncoding('utf8'); |
|
|
|
child.stderr.setEncoding('utf8'); |
|
|
|
child.stdout.on('data', (chunk) => { chunk.trim() === '' ? null : messages.push(chunk); /* console.log('d: ' + chunk) */ }); |
|
|
|
child.on('error', (chunk) => { success = false; messages.push(chunk); /* console.error('e: ' + chunk) */ } ); |
|
|
|
child.stderr.on('data', (chunk) => { |
|
|
|
if(messages.join('').indexOf('fatal: not a git repository') > -1) opts.haserrors = true; |
|
|
|
messages.push(chunk); |
|
|
|
// console.error('stderr e: ' + chunk) |
|
|
|
}); |
|
|
|
} |
|
|
|
child.on('close', (code) => { |
|
|
|
if(+code !== 0 || opts.haserrors) success = false; |
|
|
|
if(opts.stdio !== 'ignore') { |
|
|
|
var logEntry = { result: `${opts.title} exited with code ${code}`, messages } |
|
|
|
logEntry.success = success; |
|
|
|
|
|
|
|
if(opts.runas){ |
|
|
|
// success ? logEntry.success = true : null; |
|
|
|
fs.writeFileSync('run.log', ', ' + JSON.stringify(logEntry), {'flag':'a+'} ) |
|
|
|
} |
|
|
|
else { |
|
|
|
// console.log( messages.join('') ) |
|
|
|
process.stdout.write( messages.join('') ) |
|
|
|
} |
|
|
|
} |
|
|
|
if(code !== 0 || opts.haserrors) return reject(logEntry) |
|
|
|
resolve(logEntry) |
|
|
|
}); |
|
|
|
} |
|
|
|
else { |
|
|
|
child.unref() |
|
|
|
resolve(true); |
|
|
|
} |
|
|
|
}); |
|
|
|
p.process = child; |
|
|
|
return p; |
|
|
|
} |