var child_process = require('child_process'),
fs = require('fs'),
temp = require('temp').track(),
source = fs.realpathSync(require.resolve('../'));
function execute(cmd) {
child_process.execSync(cmd, { stdio: 'inherit' });
}
function copy_file(source, target) {
fs.writeFileSync(target, fs.readFileSync(source));
}
function workaroundRecastTest() {
var filename = 'test/es6tests.js', lines, i, line;
console.log();
console.log('Applying a workaround...');
lines = fs.readFileSync(filename, 'utf-8').split('\n');
for (i = 0; i < lines.length; ++i) {
line = lines[i];
if (line.indexOf('const variables must have an initializer') > 0) {
console.log('-- Patching', filename);
lines.splice(i, 5);
fs.writeFileSync(filename, lines.join('\n'));
break;
}
}
execute('git diff');
}
function test_project(project, repo) {
console.log();
console.log('==========', project);
console.log();
console.log('Cloning', repo, '...');
execute('git clone --depth 1 ' + repo + ' ' + project);
process.chdir(project);
console.log();
console.log('HEAD is');
execute('git log -n1 > commit.top');
console.log(fs.readFileSync('commit.top', 'utf-8'));
if (project === 'recast') {
workaroundRecastTest();
}
console.log();
execute('npm install');
console.log();
console.log('Replacing esprima.js with a fresh one...');
copy_file(source, './node_modules/esprima/esprima.js');
console.log();
try {
execute('npm test');
} catch (e) {
console.log('Failing: ', e.toString());
process.exit(1);
}
process.chdir('..');
}
function test_downstream(projects) {
var downstream_path = temp.mkdirSync('downstream');
console.log('Running the tests in', downstream_path);
if (!fs.existsSync(downstream_path)) {
fs.mkdirSync(downstream_path, 0766);
}
process.chdir(downstream_path);
Object.keys(projects).forEach(function (project) {
test_project(project, projects[project]);
});
}
if (typeof child_process.execSync !== 'function') {
console.error('This only works with Node.js that support execSync');
process.exit(0);
}
var projects = {
'envify': 'https://github.com/hughsk/envify.git',
'esmangle': 'https://github.com/estools/esmangle.git',
'escomplex-js': 'https://github.com/philbooth/escomplex-js.git',
'redeyed': 'https://github.com/thlorenz/redeyed.git',
'jsfmt': 'https://github.com/rdio/jsfmt.git',
'rocambole': 'https://github.com/millermedeiros/rocambole.git'
};
if (process.env['GITLAB_CI'] === 'true') {
projects.istanbul = 'https://github.com/gotwarlost/istanbul.git';
}
test_downstream(projects);