|
|
@@ -1,4 +1,7 @@ |
|
|
|
|
|
|
|
var repolog = require('./repolog') |
|
|
|
var path = require('path'); |
|
|
|
var utils = require('bbhverse'); |
|
|
|
var any = utils.any; |
|
|
|
// 'use strict'; |
|
|
|
|
|
|
|
// PB : TODO -- make sure folder context is proper coz we can now run elxr from anywhere. |
|
|
@@ -18,7 +21,7 @@ |
|
|
|
const { existsSync } = require('fs'); |
|
|
|
const fs = require('fs') |
|
|
|
const { spawn, spawnSync } = require('child_process'); |
|
|
|
const cliargs = require('../elxr/cliargs'); // Use minimist... |
|
|
|
const cliargs = utils.cliargs; |
|
|
|
const processedArgs = cliargs(process.argv.slice(2)); |
|
|
|
console.dir(processedArgs) |
|
|
|
var globSync = require('glob').sync; |
|
|
@@ -28,8 +31,9 @@ const { isMaster } = require('cluster'); |
|
|
|
|
|
|
|
// Default Config... |
|
|
|
var reposervers = [ |
|
|
|
'http://git.bbh' |
|
|
|
, '//172.16.0.27/repos' |
|
|
|
'http://git.bbh' |
|
|
|
, 'https://git.bbh.org.in' |
|
|
|
, '//172.16.0.27/repos' |
|
|
|
] |
|
|
|
var defaultRepoServer = reposervers[0] |
|
|
|
|
|
|
@@ -38,84 +42,6 @@ var defaultRepoOwner = 'chess'; |
|
|
|
|
|
|
|
// PB : TODO -- If we are run from an elevated shell it never moves forward and simply exits. |
|
|
|
// -- Currently workaround is to always run from a non-elevated shell. |
|
|
|
|
|
|
|
// Serialize a set of functions that will execute to return a promises one after the other. |
|
|
|
// Will stop when any one fails unless continueOnFailure is true. |
|
|
|
// All tasks in iterables can be functions or promises. |
|
|
|
// promises as usual can return other promises or resolve to either truthy or falsy values. |
|
|
|
// functions must return a promise |
|
|
|
function any(iterable, continueOnFailure) { |
|
|
|
return iterable.reduce( |
|
|
|
(p, fn, i ,a) => { |
|
|
|
// console.log('accumulator :'); |
|
|
|
// console.log(p); |
|
|
|
if(Promise.resolve(p) === p ) { |
|
|
|
return p.then((pVal) => { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Falsy values are task failure. |
|
|
|
if(!pVal) { |
|
|
|
console.warn('Possible failure for result : ' + pVal) |
|
|
|
console.warn(a[i-1]) |
|
|
|
fn ? console.error("Fn : " + fn.toString()) : null; |
|
|
|
} |
|
|
|
|
|
|
|
// Truthy values are failures if obj has error=true. |
|
|
|
if(pVal && pVal.error) { console.error('Failed : ' + pVal.message + ' ' + pVal) } |
|
|
|
|
|
|
|
if(Promise.resolve(pVal) === pVal) { |
|
|
|
// Passed in function retured a promise. We still need to wait for it. |
|
|
|
pVal.then((pVal)=>{ |
|
|
|
|
|
|
|
// console.log('Then --pVal = ' + pVal + ' bContinue = ' + continueOnFailure ); console.log(p); |
|
|
|
if(!pVal && !continueOnFailure) { |
|
|
|
console.error(`E1 : i = ${i} : pVal :` + pVal); |
|
|
|
console.error('debugData 2 -------------------'); |
|
|
|
|
|
|
|
console.log("Cancelling remaining..."); |
|
|
|
throw 'Failed in reduce 1 ' |
|
|
|
} |
|
|
|
if(!fn && !continueOnFailure) { console.error('Error : No task specified.'); throw false;} |
|
|
|
else if(!fn) return false; |
|
|
|
return (Promise.resolve(fn) === fn ) ? fn : fn() ; |
|
|
|
}) |
|
|
|
} |
|
|
|
else { |
|
|
|
|
|
|
|
// We will stop on null resolved values on any one task unless continueOnFailure is true. |
|
|
|
// console.log('Then --pVal = ' + pVal + ' bContinue = ' + continueOnFailure ); console.log(p); |
|
|
|
if(!pVal && !continueOnFailure) { |
|
|
|
console.error(`E2 : i = ${i} : pVal :` + pVal); |
|
|
|
console.error('debugData 2 -------------------'); |
|
|
|
|
|
|
|
console.log("Cancelling remaining..."); |
|
|
|
throw 'Failed in reduce 2 ' |
|
|
|
} |
|
|
|
if(!fn && !continueOnFailure) { console.error('Error : No task specified.'); throw false;} |
|
|
|
else if(!fn) return false; |
|
|
|
return (Promise.resolve(fn) === fn ) ? fn : fn() ; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}).catch((error) => { |
|
|
|
console.error(`E3 : i = ${i} `); |
|
|
|
fn ? console.error("Fn : " + fn.toString()) : null; |
|
|
|
console.error('debugData 3-------------------------'); |
|
|
|
|
|
|
|
throw 'Failed in reduce 3 ' |
|
|
|
}) |
|
|
|
} |
|
|
|
else if(!p) { |
|
|
|
console.log("Bypass on failure"); |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
, Promise.resolve(true) |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
var __isElevated = null; |
|
|
|
var isRunningElevated = ()=>{ |
|
|
|
if(__isElevated === null) { |
|
|
@@ -173,7 +99,7 @@ var gitRepos = [ |
|
|
|
, 'loopback-jsonapi-model-serializer' |
|
|
|
, 'elixir-config-development' |
|
|
|
, 'elixir-config-test' |
|
|
|
, 'cihsr-config' |
|
|
|
, 'cihsr-config-development' |
|
|
|
, 'cihsr-data' |
|
|
|
, 'elixir-data' |
|
|
|
, 'loopback-connector-ds' |
|
|
@@ -209,7 +135,7 @@ var exludeMergeRepos = { |
|
|
|
var productionRepos = [ |
|
|
|
'elixir-config-production' |
|
|
|
] |
|
|
|
var productionIsAllowed = true; |
|
|
|
var productionIsAllowed = (process.env.NODE_ENV === 'production'); |
|
|
|
if(productionIsAllowed) gitRepos = gitRepos.concat(productionRepos) |
|
|
|
|
|
|
|
var env = Object.assign({}, process.env); // Shallow clone it. |
|
|
@@ -456,6 +382,48 @@ var __runcmd = function(label){ |
|
|
|
, 'is-git-repo' : (dir)=>{ |
|
|
|
return nodeShellExec('git', ['-C', dir.name, 'rev-parse'], { stdio : 'ignore'}) |
|
|
|
} |
|
|
|
, 'set-url' : (remotename, url) => { |
|
|
|
var pushable = processedArgs.pushable || false; |
|
|
|
remotename = remotename || processedArgs._[1] |
|
|
|
url = url || processedArgs._[2] |
|
|
|
var serial_perform_git_seturl = (repo)=>{ |
|
|
|
var options = { cwd : repo } |
|
|
|
// console.log(repo) |
|
|
|
if(pushable) { |
|
|
|
return [ |
|
|
|
['git', ['remote', 'set-url', remotename, url + '/' + repo], { cwd : repo }] |
|
|
|
] |
|
|
|
} |
|
|
|
else { |
|
|
|
console.error('not supported for non-pushable') |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
var x = (args)=>{ |
|
|
|
return ()=>{ |
|
|
|
// console.log(args) |
|
|
|
return nodeShellExec.apply(null, args) |
|
|
|
} |
|
|
|
// return Promise.resolve(true) |
|
|
|
} |
|
|
|
var perform_git_seturl = (dir)=>{ |
|
|
|
op['is-git-repo'](dir).then((code)=>{ |
|
|
|
any( serial_perform_git_seturl(dir.name).map(x) ) |
|
|
|
}).catch((e)=>{ |
|
|
|
// console.log('Failed : ' + dir.name) |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
const { readdir } = require("fs").promises |
|
|
|
|
|
|
|
const dirs = async (perform, path) => { |
|
|
|
for (const dir of await readdir(path || process.cwd(), { withFileTypes: true })) { |
|
|
|
if (dir.isDirectory()) perform(dir) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
dirs( perform_git_seturl) |
|
|
|
} |
|
|
|
, 'add' : (remotename, url, branch) => { |
|
|
|
var pushable = processedArgs.pushable || false; |
|
|
|
remotename = remotename || processedArgs._[1] |
|
|
@@ -566,9 +534,9 @@ var __runcmd = function(label){ |
|
|
|
var options = { cwd : repo } |
|
|
|
// console.log(repo) |
|
|
|
return [ |
|
|
|
['git', ['remote', 'add', 'chess', 'http://git.bbh/chess/elxr.git'], { cwd : repo }] |
|
|
|
['git', ['remote', 'add', 'chess', `${defaultRepoServer}/${user}/${repo}.git`], { cwd : repo }] |
|
|
|
, ['git', ['remote', 'set-url', '--push', 'chess', 'no-pushing'], { cwd : repo }] |
|
|
|
, ['git', ['remote', 'set-url', 'origin', `http://git.bbh/${user}/${repo}.git`], { cwd : repo }] |
|
|
|
, ['git', ['remote', 'set-url', 'origin', `${defaultRepoServer}/${user}/${repo}.git`], { cwd : repo }] |
|
|
|
]} |
|
|
|
var x = (args)=>{ |
|
|
|
return ()=>{ |
|
|
@@ -722,20 +690,24 @@ var __runcmd = function(label){ |
|
|
|
return pullCmd |
|
|
|
} |
|
|
|
|
|
|
|
var errors = []; |
|
|
|
var performPull = (repo) => { |
|
|
|
if(existsSync(repo)) { |
|
|
|
console.log('pulling ' + repo) |
|
|
|
return nodeShellExec.apply(null, getPullCmd(repo)).catch((e)=>{ console.error(e) }) |
|
|
|
return nodeShellExec.apply(null, getPullCmd(repo)).then((srepo)=>{ |
|
|
|
repolog.statuslog(null, srepo)}).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(()=>{ |
|
|
|
}).catch((e)=>{ |
|
|
|
errors.push({ repo , e}) |
|
|
|
console.error(e) |
|
|
|
}).then(()=>{ |
|
|
|
|
|
|
|
return nodeShellExec('git', ['config', '--replace-all' , 'core.symlinks', true], |
|
|
|
{ |
|
|
@@ -749,7 +721,15 @@ var __runcmd = function(label){ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if(!processedArgs.runas) gitRepos.forEach(performPull) |
|
|
|
if(!processedArgs.runas) { |
|
|
|
var pendingpulls = []; |
|
|
|
gitRepos.forEach( (r)=>{ |
|
|
|
pendingpulls.push(performPull(r)) |
|
|
|
} ) |
|
|
|
Promise.all(pendingpulls).then(results =>{ |
|
|
|
console.log(repolog.log.SUCCESS) |
|
|
|
}) |
|
|
|
} |
|
|
|
return isRunningElevated().then( |
|
|
|
(isElevated) => { |
|
|
|
if(isElevated) { |
|
|
@@ -775,6 +755,33 @@ var __runcmd = function(label){ |
|
|
|
} |
|
|
|
, 'npmi' : ()=>{ |
|
|
|
var tasks = []; |
|
|
|
var bowerRepos = ['client'] |
|
|
|
|
|
|
|
var npmbuildrepos = ['loopback-jsonapi-model-serializer'] |
|
|
|
npmbuildrepos.forEach(repo => { |
|
|
|
tasks.push(()=>{ |
|
|
|
var p = nodeShellExec('npm', ['run build'], { |
|
|
|
inherit : true, shell: true |
|
|
|
, cwd : repo |
|
|
|
, env: process.env |
|
|
|
, title : `bower i 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) }) |
|
|
|
return p; |
|
|
|
}) |
|
|
|
}) |
|
|
|
gitRepos = gitRepos.concat(elevatedRunasRepos); |
|
|
|
gitRepos.push('client/server'); |
|
|
|
gitRepos.forEach(repo => { |
|
|
|
|
|
|
|
console.log('npm i for ' + repo) |
|
|
@@ -790,15 +797,18 @@ var __runcmd = function(label){ |
|
|
|
, env: process.env |
|
|
|
, title : `rm 'package-lock.json' for ${repo}` |
|
|
|
}).catch((e)=>{ console.error(e) }) |
|
|
|
tasks.push(()=>{ |
|
|
|
var p = nodeShellExec('npm', ['i'], { |
|
|
|
inherit : true, shell: true |
|
|
|
, cwd : repo |
|
|
|
, env: process.env |
|
|
|
, title : `npm i for ${repo}` |
|
|
|
}).catch((e)=>{ console.error(e) }) |
|
|
|
return p; |
|
|
|
}) |
|
|
|
|
|
|
|
if( npmbuildrepos.indexOf(repo) != -1) { |
|
|
|
tasks.push(()=>{ |
|
|
|
var p = nodeShellExec('npm', ['i --force'], { |
|
|
|
inherit : true, shell: true |
|
|
|
, cwd : repo |
|
|
|
, env: process.env |
|
|
|
, title : `npm i for ${repo}` |
|
|
|
}).catch((e)=>{ console.error(e) }) |
|
|
|
return p; |
|
|
|
}) |
|
|
|
} |
|
|
|
}) |
|
|
|
any(tasks); |
|
|
|
|
|
|
@@ -1116,7 +1126,9 @@ var __runcmd = function(label){ |
|
|
|
if(0){ |
|
|
|
// PB : TODO -- Special google chrome profile for tests etc. |
|
|
|
nodeShellExec('pwd', { inherit : true}); |
|
|
|
//$ "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --profile-directory="Profile 1" http://localhost:4200/tests/index.html?grep=loopback |
|
|
|
// /c/Program\ Files\ \(x86\)/Google/Chrome/Application/chrome.exe --user-data-dir=/c/chess/instances/elixir_01/data/Google/Chrome/User\ Data --profile-directory="chess" |
|
|
|
// "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --user-data-dir="C:\chess\instances\elixir_01\data\Google\Chrome\User Data" --profile-directory="chess" http://localhost:4200/admin/crud/create/item |
|
|
|
// "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --user-data-dir="C:\chess\instances\elixir_01\data\Google\Chrome\User Data" --profile-directory="chess" http://localhost:4200/tests/index.html?grep=loopback |
|
|
|
nodeShellExec("C:/Program Files (x86)/Google/Chrome/Application/chrome.exe", [ |
|
|
|
"--profile-directory=Profile 1" |
|
|
|
, 'http://localhost:4200/tests/index.html?grep=model convert ember to loopback' + '&filter=none' /*+ '&filter=model convert ember to loopback'*/]); |
|
|
@@ -1126,19 +1138,68 @@ var __runcmd = function(label){ |
|
|
|
// nodeShellExec('npm', ['init', '-y'], options); |
|
|
|
// }) |
|
|
|
|
|
|
|
var g = { |
|
|
|
'client' : ()=>{ |
|
|
|
console.info('Creating new ember client named : ' + processedArgs._[2] ) ; |
|
|
|
var step1 = nodeShellExec('cmd', ['/c', 'ember', 'new', processedArgs._[2]], { |
|
|
|
stdio: ['pipe', process.stdout, process.stderr], |
|
|
|
inherit : true, |
|
|
|
shell: true, |
|
|
|
cwd : path.dirname(__dirname), |
|
|
|
env: env |
|
|
|
}) |
|
|
|
} |
|
|
|
var g = { |
|
|
|
'client' : ()=>{ |
|
|
|
console.info('Creating new ember client named : ' + processedArgs._[2] ) ; |
|
|
|
var step1 = nodeShellExec('cmd', ['/c', 'ember', 'new', processedArgs._[2]], { |
|
|
|
stdio: ['pipe', process.stdout, process.stderr], |
|
|
|
inherit : true, |
|
|
|
shell: true, |
|
|
|
cwd : path.dirname(__dirname), |
|
|
|
env: env |
|
|
|
}) |
|
|
|
}, |
|
|
|
|
|
|
|
'modelr' : ()=>{ |
|
|
|
var tasks = [ |
|
|
|
()=>{ |
|
|
|
var p = nodeShellExec('"ember"', [ |
|
|
|
'g' |
|
|
|
, 'modelr' |
|
|
|
, processedArgs._[2]], { |
|
|
|
inherit : true, shell: true, env: process.env |
|
|
|
}).then(()=>{ |
|
|
|
console.log('Blueprint generation complete for : ' + processedArgs._[2]) |
|
|
|
return true; |
|
|
|
}).catch((e)=>{ console.error(e) }) |
|
|
|
return p; |
|
|
|
}, |
|
|
|
()=>{ |
|
|
|
var chromePrefsFile = "C:\\chess\\instances\\elixir_01\\data\\Google\\Chrome\\User Data\\chess\\Preferences"; |
|
|
|
var chromeprefs = fs.readFileSync(chromePrefsFile, { encoding: 'utf8' }) |
|
|
|
chromeprefs = JSON.parse(chromeprefs) |
|
|
|
var previous = chromeprefs.download.default_directory; |
|
|
|
var parentDir = path.dirname(__dirname); |
|
|
|
chromeprefs.download.default_directory = parentDir + "\\client\\app\\templates\\components\\resource"; |
|
|
|
fs.writeFileSync(chromePrefsFile, JSON.stringify(chromeprefs)) |
|
|
|
// PB : TODO -- detect where chrome is installed. |
|
|
|
// PB : TODO -- set the download dir to the place where files are needed. |
|
|
|
var p = nodeShellExec('"C:/Program Files (x86)/Google/Chrome/Application/chrome.exe"', [ |
|
|
|
'--user-data-dir="C:\\chess\\instances\\elixir_01\\data\\Google\\Chrome\\User Data"' |
|
|
|
, '--profile-directory="chess"' |
|
|
|
, 'http://localhost:4200/admin/crud/create/' + processedArgs._[2]], { |
|
|
|
inherit : true, shell: true |
|
|
|
, env: process.env |
|
|
|
}).then(()=>{ |
|
|
|
chromeprefs.download.default_directory = previous; |
|
|
|
fs.writeFileSync(chromePrefsFile, JSON.stringify(chromeprefs)) |
|
|
|
return true; |
|
|
|
}).catch((e)=>{ console.error(e) }) |
|
|
|
return p; |
|
|
|
} |
|
|
|
, |
|
|
|
()=>{ |
|
|
|
console.log('Browser process should have closed here....') |
|
|
|
return true; |
|
|
|
} |
|
|
|
] |
|
|
|
any(tasks) |
|
|
|
|
|
|
|
} |
|
|
|
g[processedArgs._[1]](); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
g[processedArgs._[1]](); |
|
|
|
} |
|
|
|
} |
|
|
|
return op[label] ? op[label]() : null; |
|
|
@@ -1204,4 +1265,3 @@ function nodeShellExec() { |
|
|
|
p.process = child; |
|
|
|
return p; |
|
|
|
} |
|
|
|
|