261 lines
11 KiB
JavaScript
261 lines
11 KiB
JavaScript
#!/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();
|