diff --git a/prelude/bootstrap.js b/prelude/bootstrap.js index f6c5f190e..af4f6579a 100644 --- a/prelude/bootstrap.js +++ b/prelude/bootstrap.js @@ -93,6 +93,10 @@ EXECSTAT.birthtimeMs = EXECSTAT.birthtime.getTime(); var mountpoints = []; +function isRegExp(val) { + return require('util').types.isRegExp(val); +} + function insideMountpoint(f) { if (!insideSnapshot(f)) return null; var file = normalizePath(f); @@ -100,6 +104,8 @@ function insideMountpoint(f) { .map((mountpoint) => { var { interior } = mountpoint; var { exterior } = mountpoint; + if (isRegExp(interior) && interior.test(file)) + return file.replace(interior, exterior); if (interior === file) return exterior; var left = interior + require('path').sep; if (file.slice(0, left.length) !== left) return null; @@ -113,9 +119,14 @@ function insideMountpoint(f) { function readdirMountpoints(path) { return mountpoints - .map((mountpoint) => mountpoint.interior) - .filter((interior) => require('path').dirname(interior) === path) - .map((interior) => require('path').basename(interior)); + .filter(({ interior }) => { + if (isRegExp(interior)) return interior.test(path); + return require('path').dirname(interior) === path; + }) + .map(({ interior, exterior }) => { + if (isRegExp(interior)) return path.replace(interior, exterior); + return require('path').basename(interior); + }); } function translate(f) { diff --git a/test/test-1121-regexp-mountpoints/main.js b/test/test-1121-regexp-mountpoints/main.js new file mode 100644 index 000000000..db0907f52 --- /dev/null +++ b/test/test-1121-regexp-mountpoints/main.js @@ -0,0 +1,34 @@ +#!/usr/bin/env node + +'use strict'; + +const fs = require('fs'); +const path = require('path'); +const assert = require('assert'); +const utils = require('../utils.js'); + +assert(!module.parent); +assert(__dirname === process.cwd()); + +const target = process.argv[2] || 'host'; +const input = './test-x-index.js'; +const output = './run-time/test-output.exe'; + +let right; +utils.mkdirp.sync(path.dirname(output)); +utils.mkdirp.sync(path.join(path.dirname(output), 'plugins-D-ext')); + +fs.writeFileSync( + path.join(path.dirname(output), 'plugins-D-ext/test-y-require-D.js'), + fs.readFileSync('./plugins-D-ext/test-y-require-D.js') +); + +utils.pkg.sync(['--target', target, '--output', output, input]); + +right = utils.spawn.sync('./' + path.basename(output), [], { + cwd: path.dirname(output), +}); + +assert.strictEqual(right, 'I am D\ntest-x-index.js\n'); + +utils.vacuum.sync(path.dirname(output)); diff --git a/test/test-1121-regexp-mountpoints/plugins-D-ext/test-y-require-D.js b/test/test-1121-regexp-mountpoints/plugins-D-ext/test-y-require-D.js new file mode 100644 index 000000000..57f2e7f42 --- /dev/null +++ b/test/test-1121-regexp-mountpoints/plugins-D-ext/test-y-require-D.js @@ -0,0 +1,10 @@ +'use strict'; + +var assert = require('assert'); + +if (__dirname.indexOf('snapshot') < 0) { + console.log(__dirname); + assert(false); +} + +console.log('I am D'); diff --git a/test/test-1121-regexp-mountpoints/test-x-index.js b/test/test-1121-regexp-mountpoints/test-x-index.js new file mode 100644 index 000000000..dd33481fc --- /dev/null +++ b/test/test-1121-regexp-mountpoints/test-x-index.js @@ -0,0 +1,17 @@ +'use strict'; + +var fs = require('fs'); +var path = require('path'); + +var myDirectory = path.dirname(process.execPath); + +process.pkg.mount( + /^(.*)regexp_mountpoint_test(.*)$/, + function (match, group1, group2) { + return path.join(myDirectory, 'plugins-D-ext', group2); + } +); + +require('./regexp_mountpoint_test/test-y-require-D.js'.slice()); + +console.log(fs.readdirSync(__dirname).join('\n'));