#!/usr/bin/env runjs var Integrity = Packages.me.hatter.tools.commons.security.digest.Integrity; var counter = require('component-counter.js'); var javahomejs = require('component-javahome.js'); var colorprint = require('component-colorprint-ex.js'); var doGetPackage = (name, bin, version) => { var gradleHome = '~/.jssp/builder/' + name + '-' + version; var gradleInfoRFile = __.rfile.from(gradleHome).file('info.json'); if (gradleInfoRFile.exists()) { return gradleInfoRFile.parseJSON(); } if (__.rfile.from(gradleHome).notExists()) { __.rfile.from(gradleHome).file().mkdirs(); } var toolPackageDetail = $$.httpRequest().url('https://hatter.ink/tool/tool_package_detail.jsonp') .param('__auth_token', 'GpsVz8uxoxFW34CFhyGnTwKXQRtL3FoTA') .param('name', name) .param('version', version) .get(); var toolPackageDetailJSON = JSON.parse(toolPackageDetail.toString()); if (toolPackageDetailJSON.status != 200) { return null; } var packageName = toolPackageDetailJSON.data.name; if (packageName.endsWith('.zip')) { packageName = packageName.substring(0, packageName.length - 4); } else if (packageName.endsWith('.tgz')) { packageName = packageName.substring(0, packageName.length - 4); } else if (packageName.endsWith('.tar.gz')) { packageName = packageName.substring(0, packageName.length - 7); } if (packageName.endsWith('-bin')) { packageName = packageName.substring(0, packageName.length - 4); } var gradleInfoJSON = { 'package': toolPackageDetailJSON.data.url, 'sha256': Integrity.parse(toolPackageDetailJSON.data.integrity).getDigest().asHex(), 'path': gradleHome + '/' + packageName, 'bin': bin }; gradleInfoRFile.write(JSON.stringify(gradleInfoJSON)); return gradleInfoJSON; }; var builders = { 'ant': { '1.7': { 'package': 'https://publicbucket-1251781687.coscd.myqcloud.com/ant1.7.tar.gz', //'package': 'https://play.hatter.me/getdoc/1248_A7AA5F48FD4AD6CC21731D6DA7412028/ant1.7.tar.gz', 'sha256': 'fb91927e662d415b6d377434a79b9ba416295d5b27c7cfdee651016e103d933f', 'path': '~/.jssp/builder/ant-1.7/ant1.7', 'bin': 'bin/ant' }, '@system': { 'bin': 'ant' } }, 'gradle': { '1.0': { 'package': 'https://publicbucket-1251781687.coscd.myqcloud.com/gradle-1.0-bin.zip', //'package': 'https://play.hatter.me/getdoc/1319_8CF093FD477F8C991C586A3FF1DDAC53/gradle-1.0-bin.zip', 'sha256': '894bca0360a7e2040815096788f118a2dd106ff6694221b274efb9c32bce0384', 'path': '~/.jssp/builder/gradle-1.0/gradle-1.0', 'bin': 'bin/gradle' }, '3.1': { 'package': 'https://publicbucket-1251781687.coscd.myqcloud.com/gradle-3.1-bin.zip', //'package': 'https://play.hatter.me/getdoc/1250_66CED6B096F6BF7C88F718F2FDFA17DD/gradle-3.1-bin.zip', 'sha256': 'c7de3442432253525902f7e8d7eac8b5fd6ce1623f96d76916af6d0e383010fc', 'path': '~/.jssp/builder/gradle-3.1/gradle-3.1', 'bin': 'bin/gradle' }, '4.4': { 'package': 'https://publicbucket-1251781687.coscd.myqcloud.com/gradle-4.4-bin.zip', //'package': 'https://play.hatter.me/getdoc/1400_ECE7856BD68513DE9BF6E8D66990443F/gradle-4.4-bin.zip', 'sha256': 'fa4873ae2c7f5e8c02ec6948ba95848cedced6134772a0169718eadcb39e0a2f', 'path': '~/.jssp/builder/gradle-4.4/gradle-4.4', 'bin': 'bin/gradle' }, 'getPackage': (version) => { return doGetPackage('gradle', 'bin/gradle', version); }, '@system': { 'bin': 'gradle' } }, 'maven': { '2.2.1': { 'package': 'https://publicbucket-1251781687.coscd.myqcloud.com/apache-maven-2.2.1-bin.zip', //'package': 'https://play.hatter.me/getdoc/1422_ABA87C5E2BD1C06F8DD898CFF67E3BDB/apache-maven-2.2.1-bin.zip', 'sha256': 'a509c03f10ba8c7c503338c0870ae9abbb59cb06279f705d12f69b454c8cf6a1', 'path': '~/.jssp/builder/maven-2.2.1/apache-maven-2.2.1', 'bin': 'bin/mvn' }, '3.5.2': { 'package': 'https://publicbucket-1251781687.coscd.myqcloud.com/apache-maven-3.5.2-bin.zip', //'package': 'https://play.hatter.me/getdoc/1421_182A3E008816352359E0690E14BD2C10/apache-maven-3.5.2-bin.zip', 'sha256': '90e9f0d700743516d1f610fcd63a5d49751d0743db713909f9ef933747a38b8a', 'path': '~/.jssp/builder/maven-3.5.2/apache-maven-3.5.2', 'bin': 'bin/mvn' }, 'getPackage': (version) => { return doGetPackage('maven', 'bin/mvn', version); }, '@system': { 'bin': 'mvn' } } }; var getBuildJSONInParents = (buildJSONFile) => { var f = buildJSONFile.getAbsoluteFile(); while (f.getParentFile() != null) { f = f.getParentFile(); if ($$.file(f, 'build.json').exists()) { return $$.file(f, 'build.json'); } } return null; }; var main = () => { var buildJSONFile = $$.file('build.json'); if (!buildJSONFile.exists()) { xprintln('[WARN] Build config file not found in current dir: build.json'); buildJSONFile = getBuildJSONInParents(buildJSONFile); if (buildJSONFile == null) { xprintln('[ERROR] Build config file not found: build.json'); return; } } var buildJSON = JSON.parse($$.rFile(buildJSONFile).string()); var builderInfo = buildJSON.builder || buildJSON.compiler; var javaVersion = buildJSON.java; if (!javaVersion) { xprintln('[ERROR] Java version is not assigned!'); return; } if (!builderInfo) { xprintln('[ERROR] Builder info is not assigned!'); return; } var builder = builders[builderInfo['name']][builderInfo['version']]; if ((builder == null) && builders[builderInfo['name']].getPackage) { builder = builders[builderInfo['name']].getPackage(builderInfo['version']); } if (!builder) { xprintln('[ERROR] Builder version not found: ' + builderInfo['name'] + '-' + builderInfo['version']); return; } var builderBin = (builderInfo['version'] == '@system') ? builder.bin : (builder.path + '/' + builder.bin); if (builderBin.startsWith('~')) { builderBin = $$.prop('user.home') + builderBin.substring(1); } var javaHome = null; if ($STR(javaVersion) != '@system') { // TODO ... javaHome = javahomejs.getJavaHome(javaVersion); if (javaHome == null) { xprintln('[ERROR] Java version is not found: ' + javaVersion); return; } } var commandArgs = []; var buildCommands = []; buildCommands.push(builderBin); if (buildJSON.args) { buildJSON.args.forEach((a) => { buildCommands.push(a); commandArgs.push(a); }); } var hasXArgsNotMatch = false; var hasXRunsNotMatch = false; $ARR($ARGS).forEach((a) => { if ($STR(a).startsWith('::')) { var aCmd = $STR(a).substring(2); if (buildJSON.xArgs && buildJSON.xArgs[aCmd]) { buildJSON.xArgs[aCmd].forEach((a) => { buildCommands.push(a); commandArgs.push(a); }); return; // process next argument! } else { hasXArgsNotMatch = true; xprintln('[WARN] xArgs "build.json#xArgs#' + aCmd + '" not found!'); } } else if ($STR(a).startsWith('...')) { buildCommands = []; var aCmd = $STR(a).substring(3); if (buildJSON.xRuns && buildJSON.xRuns[aCmd]) { buildJSON.xRuns[aCmd].forEach((a) => { buildCommands.push(a); commandArgs.push(a); }); return; // process next argument! } else { hasXRunsNotMatch = true; xprintln('[ERROR] xRuns "build.json#xRuns#' + aCmd + '" not found!'); } } buildCommands.push(a); commandArgs.push(a); }); if (hasXArgsNotMatch && ($ARRAY($ARGS).length == 1)) { print('xArgs argument not found, do you want to continue(yes/no, default no)? '); var yesNo = java.lang.System.console().readLine(); yesNo = $STR(yesNo || 'no').toLowerCase(); if (!(['yes', 'y'].contains(yesNo))) { xprintln('[INFO] Exited.') return; } } if (hasXRunsNotMatch) { return; } if ((builderInfo['version'] != '@system') && (!($$.file(builderBin).exists()))) { xprintln('[INFO] Builder not exists, downloading...'); var nameAndVersion = builderInfo['name'] + '-' + builderInfo['version']; var fn = builder.package.substring(builder.package.lastIndexOf('/') + 1); if (fn.indexOf('?') > 0) { fn = fn.substring(0, fn.indexOf('?')); } var f = $$.file('~', '.jssp', 'builder', nameAndVersion, fn); if (!(f.exists())) { f.getParentFile().mkdirs(); var fos = new java.io.FileOutputStream(f); $$.httpRequest() .url(builder.package) .addHeader('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36') .get(fos, counter.getCounter2()); fos.close(); println(); var sha256 = $$.rFile(f).digest($$.digests().sha256()).asHex(); if ($STR(sha256) == builder.sha256) { xprintln('[SUCCESS] Check SHA256 success.') } else { xprintln('[ERROR] Check SHA256 failed, actual is: ' + sha256 + ',expected: ' + builder.sha256); f.renameTo($$.file('~', '.jssp', 'builder', nameAndVersion, fn + '.invalid.' + $$.date().millis())); return; } // installBuilderScripts.push('runjs -u https://repo.examp1e.org/app/get.js ' + builder.package); } var installBuilderScripts = []; installBuilderScripts.push('cd ~/.jssp/builder/' + nameAndVersion); if (/.*\.tar\.gz$/.test(fn) || /.*\.tgz$/.test(fn)) { installBuilderScripts.push('tar xzvf ' + fn); } else if (/.*\.zip$/.test(fn)) { installBuilderScripts.push('unzip ' + fn); } else { xprintln('[ERROR] Extract package failed: ' + fn); return; } installBuilderScripts.push(''); var builderIntall = $$.file('.builder_install.sh'); $$.rFile(builderIntall).write(installBuilderScripts.join('\n')); $$.shell().inheritIO().commands('sh', builderIntall.getName()).run(); builderIntall.delete(); } if ((builderInfo['version'] != '@system') && (!($$.file(builderBin).exists()))) { xprintln('[ERROR] Builder bin not found!'); return; } xprintln('[INFO] JAVA_HOME = ' + (javaHome || ($$.env('JAVA_HOME') + colorprint.okgreen.render(' @system')))); xprintln('[INFO] BUILDER = ' + builderBin + ((builderInfo['version'] == '@system') ? colorprint.okgreen.render(' @system') : '')); xprintln('[INFO] ARGUMENTS = ' + $ARR(commandArgs).toJavaList()); println(); var shell = $$.shell(); if (javaHome) { shell.env('JAVA_HOME', javaHome).env('PATH', javaHome + '/bin:' + $$.env('PATH')); } shell.inheritIO().commands(buildCommands).run(); }; main();