|
|
@@ -65,13 +65,36 @@ console.dir(processedArgs) |
|
|
|
// } |
|
|
|
// }) |
|
|
|
|
|
|
|
var clioverrides = { } |
|
|
|
processedArgs._[1] ? clioverrides.instanceName = processedArgs._[1]: null; |
|
|
|
processedArgs.node_env ? clioverrides.node_env = 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; |
|
|
|
var subcommandlabels = { |
|
|
|
remote : (`remote ${processedArgs._[1] || ''}`).trim() |
|
|
|
} |
|
|
|
|
|
|
|
var interpretrun = function(){ |
|
|
|
|
|
|
|
var cmds = { |
|
|
|
'remote' : function() { |
|
|
|
return { cmd : subcommandlabels['remote'], runchoice : 'c' } |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
var cmd = processedArgs._[0]; |
|
|
|
var clioverrides = { cmd } |
|
|
|
processedArgs.node_env ? clioverrides.node_env = 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; |
|
|
|
|
|
|
|
return cmds[cmd] ? cmds[cmd]() : (function(){ |
|
|
|
|
|
|
|
processedArgs._[1] ? clioverrides.instanceName = processedArgs._[1]: null; |
|
|
|
return clioverrides |
|
|
|
})() |
|
|
|
} |
|
|
|
|
|
|
|
Object.keys(clioverrides).forEach( prop => { }) |
|
|
|
|
|
|
|
var clioverrides = interpretrun() |
|
|
|
console.dir(clioverrides) |
|
|
|
|
|
|
|
// Object.keys(clioverrides).forEach( prop => { }) |
|
|
|
|
|
|
|
var globSync = require('glob').sync; |
|
|
|
|
|
|
@@ -81,14 +104,14 @@ const { readdir } = require("fs").promises |
|
|
|
|
|
|
|
// Directory shallow walk and do perform on each dir. |
|
|
|
const dirs = async (perform, path) => { |
|
|
|
for (const dir of await readdir(path || process.cwd(), { withFileTypes: true })) { |
|
|
|
for (const dir of await readdir(path || selectedinstance.root, { withFileTypes: true })) { |
|
|
|
if (dir.isDirectory()) perform(dir) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
var getShellTask = (command, args, options) => { |
|
|
|
options = options || {} |
|
|
|
var callshell = command === 'rm' ? callgitbashtask : callsheltask; |
|
|
|
var callshell = command === 'rm' ? getgitbashtask : getshelltask; |
|
|
|
return () => { |
|
|
|
var p = callshell( [command, args, Object.assign({ |
|
|
|
inherit: true, shell: true, env: ENV, title: `${command} ${args}` |
|
|
@@ -103,9 +126,13 @@ var getShellTask = (command, args, options) => { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
var callsheltask = (args) => { |
|
|
|
return args[0] === 'rm' ? callgitbashtask(args) : () => { return nodeShellExec.apply(null, args) } } |
|
|
|
var callgitbashtask = (args) => { return () => { |
|
|
|
var callshelltask = (args) => { |
|
|
|
console.dir(args) |
|
|
|
return getshelltask(args)() } |
|
|
|
|
|
|
|
var getshelltask = (args) => { |
|
|
|
return args[0] === 'rm' ? getgitbashtask(args) : () => { return nodeShellExec.apply(null, args) } } |
|
|
|
var getgitbashtask = (args) => { return () => { |
|
|
|
return nodeShellExec( `"${gitbash}"`, ['-c', `"${args[0]} ${args[1].join(' ')}"`], args[2]) } |
|
|
|
} |
|
|
|
|
|
|
@@ -163,7 +190,7 @@ var gitops = { |
|
|
|
var parameters = ['-c', 'branch=`git rev-parse --abbrev-ref HEAD`;for i in `git remote`; do git pull $i $branch; done;'] |
|
|
|
var cmd = [gitbash |
|
|
|
, ['-c', 'branch=`git rev-parse --abbrev-ref HEAD`;for i in `git remote`; do git pull $i $branch; done;'] |
|
|
|
, { cwd: instanceroot + '/' + repo, title: 'pull all origins for ' + repo + ' ' + parameters.join(' ') }] |
|
|
|
, { cwd: instanceroot + '/' + repo, title: 'discoverbranch for ' + repo + ' ' + parameters.join(' ') }] |
|
|
|
return cmd |
|
|
|
} |
|
|
|
} |
|
|
@@ -175,7 +202,7 @@ var getPullCmd = (repo, branch) => { |
|
|
|
var pullCmd = [] |
|
|
|
if(!branch) { |
|
|
|
// console.warn('No branch was specified detecting from working client.') |
|
|
|
// First check if working client exits. |
|
|
|
// First check if working client exists. |
|
|
|
// if (existsSync(instanceroot + '/' + repo)) { |
|
|
|
pullCmd= gitops.getdiscoverbranchcmd(repo) |
|
|
|
// } |
|
|
@@ -183,12 +210,12 @@ var getPullCmd = (repo, branch) => { |
|
|
|
} |
|
|
|
// var pullCmd = [gitInstallDir |
|
|
|
// , ['-c', 'branch=`git rev-parse --abbrev-ref HEAD`;for i in `git remote`; do git pull $i $branch; done;'] |
|
|
|
// , { cwd: instanceroot + '/' + repo, title: 'pull all origins for ' + repo }] |
|
|
|
// , { cwd: instanceroot + '/' + repo, title: 'pull all remotes for ' + repo }] |
|
|
|
if(branch) { |
|
|
|
var parameters = ['-c', 'for i in `git remote`; do git pull $i ' + branch + '; done;'] |
|
|
|
var pullCmd = [ gitbash |
|
|
|
, ['-c', 'for i in `git remote`; do git pull $i ' + branch + '; done;'] |
|
|
|
, { cwd: instanceroot + '/' + repo, title : 'pull all origins for ' + branch + ' ' + repo + ' ' + parameters.join(' ') }] |
|
|
|
, { cwd: instanceroot + '/' + repo, title : 'pull all remotes for ' + branch + ' ' + repo + ' ' + parameters.join(' ') }] |
|
|
|
} |
|
|
|
// var pullCmd = ['pullall', [], { cwd : repo }] |
|
|
|
if (useGitPull) pullCmd = ['git', ['pull'], { |
|
|
@@ -579,6 +606,7 @@ var op = { |
|
|
|
, 'remote': (args) => { |
|
|
|
|
|
|
|
// Subcommands! |
|
|
|
// PB : TODO -- we can now pass in hypehnated args... |
|
|
|
if(!processedArgs.v) return false; // Only -v is supported presently.. |
|
|
|
|
|
|
|
var serial_perform = (repo) => { |
|
|
@@ -665,10 +693,11 @@ var op = { |
|
|
|
|
|
|
|
dirs(perform_git_seturl) |
|
|
|
} |
|
|
|
, 'reset' : ()=>{ |
|
|
|
// Reset the whole installation pertaining to this elxr folder. |
|
|
|
// , 'reset' : ()=>{ |
|
|
|
// PB : TODO -- Cant have 2 resets !! |
|
|
|
// // Reset the whole installation pertaining to this elxr folder. |
|
|
|
|
|
|
|
} |
|
|
|
// } |
|
|
|
|
|
|
|
, 'remote exists': (args) => { |
|
|
|
var __args = { |
|
|
@@ -677,9 +706,41 @@ var op = { |
|
|
|
, branch : args.branch || processedArgs._[4] |
|
|
|
} |
|
|
|
|
|
|
|
var command = ['git', ['remote', '-v']] |
|
|
|
return nodeShellExec.apply(null, command).then(result=>{ |
|
|
|
return result.messages.find( (r)=> { return r.includes( __args.remotename ) }) |
|
|
|
var options = args.repo ? { cwd: instanceroot + '/' + args.repo } : {} |
|
|
|
|
|
|
|
// PB : TODO -- We should evaluate a whole list of remotes passed in from args instead of just one. |
|
|
|
var commands = [ |
|
|
|
['git', ['remote', '-v'], utils.assign( { |
|
|
|
evaluateResult : function(err, result){ |
|
|
|
return [ |
|
|
|
result.messages.find( (r)=> { return r.includes( __args.remotename ) }) |
|
|
|
, result |
|
|
|
] |
|
|
|
} |
|
|
|
} , options) ] |
|
|
|
, ['git', ['ls-remote', __args.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) ] |
|
|
|
] |
|
|
|
var mapped = commands.map(callshelltask).map( p => p.catch(e => e)) // Handle errors later. |
|
|
|
return Promise.all(mapped).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.') |
|
|
|
: allresolved[0][0] && !allresolved[1][0] ? console.log('was added as a remote but url is currently inaccessible.') |
|
|
|
: console.log('was not added as a remote but url is currently accessible.') |
|
|
|
|
|
|
|
return !allresolved[0][0] && !allresolved[1][0] ? [0, 0] |
|
|
|
: 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. |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
@@ -692,21 +753,32 @@ var op = { |
|
|
|
|
|
|
|
// use the repo manifest to create missing remotes. |
|
|
|
function perform_remote_refresh(dir){ |
|
|
|
|
|
|
|
var repo = dir.name |
|
|
|
var dscoverbranchcmd = gitops.getdiscoverbranchcmd(repo) |
|
|
|
var remotes = require(`${dir.name}/repo-manifest.js`)( null, { repouser : selectedinstance.repouser }).remotes; |
|
|
|
try { |
|
|
|
var remotes = require(`${selectedinstance.root}/${dir.name}/repo-manifest.js`)( null, selectedinstance).remotes || []; |
|
|
|
} |
|
|
|
catch(e){ |
|
|
|
var remotes = [] |
|
|
|
} |
|
|
|
// console.log(`${dir.name}/repo-manifest.js` + '---------------------------') |
|
|
|
// console.dir(remotes) |
|
|
|
|
|
|
|
return nodeShellExec.apply(null, dscoverbranchcmd(repo)).then(__branch=>{ |
|
|
|
return nodeShellExec.apply(null, dscoverbranchcmd).then(__branch=>{ |
|
|
|
console.log('Processing : ' + dir.name) |
|
|
|
var branch = __branch |
|
|
|
|
|
|
|
__args.repo = repo |
|
|
|
__args.branch = __branch |
|
|
|
var promises = [] |
|
|
|
|
|
|
|
remotes.foreach(remote =>{ |
|
|
|
remotes.forEach(remote =>{ |
|
|
|
Object.keys(remote).forEach(remotename => { |
|
|
|
promises.push( op['remote exists'].then( exists => { |
|
|
|
if(!exits) { |
|
|
|
return op['remote add']( { remotename, |
|
|
|
__args.remotename = remotename |
|
|
|
__args.url = remote[remotename] |
|
|
|
promises.push( op['remote exists']( __args ).then( exists => { |
|
|
|
if(!exists[0]) { |
|
|
|
if(!exists[1]) { console.error( `Skipping inaccessible remote url ${__args.url}` ) } |
|
|
|
else return op['remote add']( { remotename, |
|
|
|
// PB : TODO -- use the most accessible remote instead of the first available. |
|
|
|
url : (utils.js.isArray(remote[remotename]) ? remote[remotename][0] : remote[remotename]), branch |
|
|
|
} ) |
|
|
@@ -718,11 +790,10 @@ var op = { |
|
|
|
|
|
|
|
return Promise.all(promises) |
|
|
|
}) |
|
|
|
.catch((e) => { console.error(e); return { error: true, message: repo } }) |
|
|
|
.catch((e) => { console.log('Processing Error : ' + dir.name); console.error(e); return { error: true, message: repo } }) |
|
|
|
} |
|
|
|
|
|
|
|
dirs(perform_remote_refresh) |
|
|
|
|
|
|
|
return dirs(perform_remote_refresh) |
|
|
|
} |
|
|
|
, 'remote add': (args) => { |
|
|
|
// PB : TODO -- set-upstream-to should be chosen and intentionally switched. Coz we can have multiple upstream remotes. |
|
|
@@ -927,7 +998,7 @@ var op = { |
|
|
|
// , ['git', ['commit', '-a', '-m', `relocate folder ${args.folder} to ${targetrepo}`], sourcerepooptions ] |
|
|
|
] |
|
|
|
|
|
|
|
return any(cmdseq.map(callsheltask)) |
|
|
|
return any(cmdseq.map(getshelltask)) |
|
|
|
}) |
|
|
|
}).catch(e=>{console.error(e)}) |
|
|
|
} |
|
|
@@ -967,7 +1038,7 @@ var op = { |
|
|
|
, ['git', ['clone', `${args.remotebase}${args.targetrepo}`, `relocate-${args.targetrepo}-${args.folder}`], options] |
|
|
|
] |
|
|
|
|
|
|
|
return any(cmdseq.map(callsheltask)).then(() => { |
|
|
|
return any(cmdseq.map(getshelltask)).then(() => { |
|
|
|
// , ['git', ['subtree', 'split', '-P', `${args.folder}`, '-b', `relocate-${args.sourcerepo}-${args.folder}`], sourcerepooptions] |
|
|
|
// split doesnt retain folder structure we need to move and commit ourselves through a branch to retain history... |
|
|
|
// , ['git', [`checkout relocate-${args.sourcerepo}-${args.folder}`], sourcerepooptions] |
|
|
@@ -1010,7 +1081,7 @@ var op = { |
|
|
|
, targetrepooptions ] |
|
|
|
// , ['git', ['push', targetrepooptions ] // manual push for now.. |
|
|
|
] |
|
|
|
return any(cmdseq.map(callsheltask)).catch(e=>{console.error(e)}) |
|
|
|
return any(cmdseq.map(getshelltask)).catch(e=>{console.error(e)}) |
|
|
|
} |
|
|
|
|
|
|
|
, 'filter-repo' : function(args){ |
|
|
@@ -1032,7 +1103,7 @@ var op = { |
|
|
|
// git remote add src-project ../src-project |
|
|
|
['git', ['filter-repo', '--path', `${args.folder}`], targetrepooptions ] |
|
|
|
] |
|
|
|
return any(cmdseq.map(callsheltask)).catch(e=>{console.error(e); throw 'failed' }) |
|
|
|
return any(cmdseq.map(getshelltask)).catch(e=>{console.error(e); throw 'failed' }) |
|
|
|
} |
|
|
|
|
|
|
|
, 'filter-branch' : function(preservefolder, repo){ |
|
|
@@ -1440,7 +1511,7 @@ var op = { |
|
|
|
if (!branch) { |
|
|
|
var dscoverbranchcmd = gitops.getdiscoverbranchcmd(repo) |
|
|
|
|
|
|
|
promise = nodeShellExec.apply(null, dscoverbranchcmd(repo)).then(__branch=>{ branch = __branch}) |
|
|
|
promise = nodeShellExec.apply(null, dscoverbranchcmd).then(__branch=>{ branch = __branch}) |
|
|
|
.catch((e) => { console.error(e); return { error: true, message: repo } }) |
|
|
|
|
|
|
|
} |
|
|
@@ -1491,7 +1562,7 @@ var op = { |
|
|
|
// Checkout is reduced to pull provided the current branch is the targetbranch |
|
|
|
if(branch === mergesource) performCheckout = (def) => { |
|
|
|
var dscoverbranchcmd = gitops.getdiscoverbranchcmd(repo) |
|
|
|
return nodeShellExec.apply(null, dscoverbranchcmd(repo)).then(__branch=>{ |
|
|
|
return nodeShellExec.apply(null, dscoverbranchcmd).then(__branch=>{ |
|
|
|
|
|
|
|
if(branch === __branch) return performCloneAndCheckout(def) |
|
|
|
return performPullOrCloneForBranch(def) |
|
|
@@ -1806,7 +1877,7 @@ var elxr = { |
|
|
|
------------------------------------------------------------------------------- |
|
|
|
`) |
|
|
|
} |
|
|
|
, getpulltask(def){ |
|
|
|
, getpulltask(args){ |
|
|
|
|
|
|
|
// def can be an instance config |
|
|
|
// Or an object with many repos and elevated repos |
|
|
@@ -1839,11 +1910,11 @@ var elxr = { |
|
|
|
// var parameters = ['-c', 'for i in `git remote`; do git pull $i ' + branch + '; done;'] |
|
|
|
// var pullCmd = [ gitbash |
|
|
|
// , ['-c', 'for i in `git remote`; do git pull $i ' + branch + '; done;'] |
|
|
|
// , { cwd: instanceroot + '/' + repo, title : 'pull all origins for ' + branch + ' ' + repo + ' ' + parameters.join(' ') }] |
|
|
|
// , { cwd: instanceroot + '/' + repo, title : 'pull all remotes for ' + branch + ' ' + repo + ' ' + parameters.join(' ') }] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def = def || { |
|
|
|
var def = args || { |
|
|
|
repos : selectedinstance.repos, |
|
|
|
elevated : selectedinstance.elevated |
|
|
|
} |
|
|
@@ -1932,9 +2003,6 @@ function preworkerconfig(){ |
|
|
|
|
|
|
|
// The main elxr cli process |
|
|
|
function elxrworker() { |
|
|
|
var subcommandlabels = { |
|
|
|
remote : (`remote ${processedArgs._[1] || ''}`).trim() |
|
|
|
} |
|
|
|
|
|
|
|
var __runcmd = function (label) { |
|
|
|
var distinquishedlabel = subcommandlabels[label] || label |
|
|
@@ -2265,7 +2333,7 @@ var detectinstances = function () { |
|
|
|
instanceroot = detected.root |
|
|
|
__default.root = root; |
|
|
|
clioverrides.root = clioverrides.root || root; |
|
|
|
|
|
|
|
|
|
|
|
// Resolves empty array when No known instances detected. |
|
|
|
return Promise.resolve(instanceoptions) |
|
|
|
}) |
|
|
@@ -2396,7 +2464,7 @@ var prerequisites = [ |
|
|
|
return any([any(steps), any(prompts)]) |
|
|
|
} |
|
|
|
, installsteps: function () { |
|
|
|
return any([this.installcmd].map(callsheltask)) |
|
|
|
return any([this.installcmd].map(getshelltask)) |
|
|
|
} |
|
|
|
, postinstallsteps: function(){ |
|
|
|
|
|
|
@@ -2424,7 +2492,7 @@ var prerequisites = [ |
|
|
|
['git', ['config', '--global', '--add', 'user.name', `${gitUser}`]] |
|
|
|
, ['git', ['config', '--global', '--add', 'user.email', `${gitEmail}`]] |
|
|
|
] |
|
|
|
return any(steps.map(callsheltask)).then(() => { |
|
|
|
return any(steps.map(getshelltask)).then(() => { |
|
|
|
|
|
|
|
}) |
|
|
|
}); |
|
|
@@ -2435,7 +2503,7 @@ var prerequisites = [ |
|
|
|
, verifyAndInstall : function(){ |
|
|
|
return getTaskCheckExists(this.shellcmd, { ignorefailures: true })().then((exists) => { |
|
|
|
if(exists) { |
|
|
|
// return any(['git', ['config', '--global', '-l']].map(callsheltask)) |
|
|
|
// return any(['git', ['config', '--global', '-l']].map(getshelltask)) |
|
|
|
return this.getUser(null, this.postinstallsteps.bind(this)) |
|
|
|
} |
|
|
|
return this.install(); |
|
|
@@ -2449,7 +2517,7 @@ var prerequisites = [ |
|
|
|
if(!repo) globalOrLocal = '--global'; |
|
|
|
else globalOrLocal = '--local' |
|
|
|
|
|
|
|
return any([['git', ['config', globalOrLocal, '--get-all', 'user.name']]].map(callsheltask)).then((result)=>{ |
|
|
|
return any([['git', ['config', globalOrLocal, '--get-all', 'user.name']]].map(getshelltask)).then((result)=>{ |
|
|
|
// not yet configured. |
|
|
|
if(!result.success) return onNoResult() |
|
|
|
else { |
|
|
@@ -2476,7 +2544,7 @@ var prerequisites = [ |
|
|
|
, installcmd: ['MSIEXEC.exe', ['/i' |
|
|
|
, path.resolve(downloadsdir + '/' + 'node-v14.16.0-x64.msi') |
|
|
|
, 'ACCEPT=YES', '/passive']] |
|
|
|
, install : function() { return any([this.installcmd].map(callsheltask)).then(() => { }) } |
|
|
|
, install : function() { return any([this.installcmd].map(getshelltask)).then(() => { }) } |
|
|
|
} |
|
|
|
] |
|
|
|
|
|
|
@@ -2812,12 +2880,12 @@ acquireElevationState().then(() => { |
|
|
|
const retaincount = 2 |
|
|
|
var min = runtimestamp; |
|
|
|
var collect = [] |
|
|
|
|
|
|
|
if(noprerequisites[processedArgs._[0]] |
|
|
|
|| skipprereqs[processedArgs._[0]] |
|
|
|
) { |
|
|
|
return elxrworker() |
|
|
|
} |
|
|
|
|
|
|
|
// if(noprerequisites[processedArgs._[0]] |
|
|
|
// || skipprereqs[processedArgs._[0]] |
|
|
|
// ) { |
|
|
|
// return elxrworker() |
|
|
|
// } |
|
|
|
|
|
|
|
var getchoices = function(detectedinstanceoptions, promptkeys){ |
|
|
|
|
|
|
@@ -2852,12 +2920,14 @@ acquireElevationState().then(() => { |
|
|
|
} |
|
|
|
|
|
|
|
return detectinstances().then((detectedinstanceoptions)=>{ |
|
|
|
|
|
|
|
detectedinstanceoptions.splice(0,0, __default) |
|
|
|
|
|
|
|
|
|
|
|
// PB : TODO -- Most recent should be at the tip ! at index 0 so utils.reverseassign is required !!! |
|
|
|
selectedinstance = utils.assign( ...detectedinstanceoptions.slice(-2) ) |
|
|
|
// promptkeys = utils.assign(promptkeys, clioverrides) |
|
|
|
console.dir(selectedinstance) |
|
|
|
|
|
|
|
try { |
|
|
|
|