From 77383ddd85744a4408eac2c6d684c30284ca96dd Mon Sep 17 00:00:00 2001 From: Richard Lau Date: Mon, 13 Jun 2016 12:10:32 -0400 Subject: [PATCH] Replace fs.accessSync call to fs.statSync fs.accessSync does not exist in Node 0.10.x. PR-URL: https://github.com/nodejs/node-gyp/pull/955 Reviewed-By: Ben Noordhuis --- lib/configure.js | 46 +++++++++++++---- package.json | 3 +- test/test-find-accessible-sync.js | 86 +++++++++++++++++++++++++++++++ 3 files changed, 123 insertions(+), 12 deletions(-) create mode 100644 test/test-find-accessible-sync.js diff --git a/lib/configure.js b/lib/configure.js index 7bc7f8aa87..2ff476deb1 100644 --- a/lib/configure.js +++ b/lib/configure.js @@ -1,5 +1,6 @@ module.exports = exports = configure -module.exports.test = { findPython: findPython } +module.exports.test = { findAccessibleSync: findAccessibleSync, + findPython: findPython } /** * Module dependencies. @@ -20,6 +21,7 @@ var fs = require('graceful-fs') , execFile = cp.execFile , win = process.platform == 'win32' , findNodeDirectory = require('./find-node-directory') + , msgFormat = require('util').format exports.usage = 'Generates ' + (win ? 'MSVC project files' : 'a Makefile') + ' for the current module' @@ -226,22 +228,21 @@ function configure (gyp, argv, callback) { // - the out/Release directory // - the out/Debug directory // - the root directory - var node_exp_file = '' + var node_exp_file = undefined if (process.platform === 'aix') { var node_root_dir = findNodeDirectory() var candidates = ['include/node/node.exp', 'out/Release/node.exp', 'out/Debug/node.exp', 'node.exp'] - for (var next = 0; next < candidates.length; next++) { - node_exp_file = path.resolve(node_root_dir, candidates[next]) - try { - fs.accessSync(node_exp_file, fs.R_OK) - // exp file found, stop looking - break - } catch (exception) { - // this candidate was not found or not readable, do nothing - } + var logprefix = 'find exports file' + node_exp_file = findAccessibleSync(logprefix, node_root_dir, candidates) + if (node_exp_file !== undefined) { + log.verbose(logprefix, 'Found exports file: %s', node_exp_file) + } else { + var msg = msgFormat('Could not find node.exp file in %s', node_root_dir) + log.error(logprefix, 'Could not find exports file') + return callback(new Error(msg)) } } @@ -310,6 +311,29 @@ function configure (gyp, argv, callback) { } +/** + * Returns the first file or directory from an array of candidates that is + * readable by the current user, or undefined if none of the candidates are + * readable. + */ +function findAccessibleSync (logprefix, dir, candidates) { + for (var next = 0; next < candidates.length; next++) { + var candidate = path.resolve(dir, candidates[next]) + try { + var fd = fs.openSync(candidate, 'r') + } catch (e) { + // this candidate was not found or not readable, do nothing + log.silly(logprefix, 'Could not open %s: %s', candidate, e.message) + continue + } + fs.closeSync(fd) + log.silly(logprefix, 'Found readable %s', candidate) + return candidate + } + + return undefined +} + function findPython (python, callback) { checkPython() diff --git a/package.json b/package.json index 30e55d6ceb..43d637488e 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,8 @@ "devDependencies": { "tape": "~4.2.0", "bindings": "~1.2.1", - "nan": "^2.0.0" + "nan": "^2.0.0", + "require-inject": "~1.3.0" }, "scripts": { "test": "tape test/test-*" diff --git a/test/test-find-accessible-sync.js b/test/test-find-accessible-sync.js new file mode 100644 index 0000000000..d336243dd0 --- /dev/null +++ b/test/test-find-accessible-sync.js @@ -0,0 +1,86 @@ +'use strict' + +var test = require('tape') +var path = require('path') +var requireInject = require('require-inject') +var configure = requireInject('../lib/configure', { + 'graceful-fs': { + 'closeSync': function (fd) { return undefined }, + 'openSync': function (path) { + if (readableFiles.some(function (f) { return f === path} )) { + return 0 + } else { + var error = new Error('ENOENT - not found') + throw error + } + } + } +}) + +var dir = path.sep + 'testdir' +var readableFile = 'readable_file' +var anotherReadableFile = 'another_readable_file' +var readableFileInDir = 'somedir' + path.sep + readableFile +var readableFiles = [ + path.resolve(dir, readableFile), + path.resolve(dir, anotherReadableFile), + path.resolve(dir, readableFileInDir) +] + +test('find accessible - empty array', function (t) { + t.plan(1) + + var candidates = [] + var found = configure.test.findAccessibleSync('test', dir, candidates) + t.strictEqual(found, undefined) +}) + +test('find accessible - single item array, readable', function (t) { + t.plan(1) + + var candidates = [ readableFile ] + var found = configure.test.findAccessibleSync('test', dir, candidates) + t.strictEqual(found, path.resolve(dir, readableFile)) +}) + +test('find accessible - single item array, readable in subdir', function (t) { + t.plan(1) + + var candidates = [ readableFileInDir ] + var found = configure.test.findAccessibleSync('test', dir, candidates) + t.strictEqual(found, path.resolve(dir, readableFileInDir)) +}) + +test('find accessible - single item array, unreadable', function (t) { + t.plan(1) + + var candidates = [ 'unreadable_file' ] + var found = configure.test.findAccessibleSync('test', dir, candidates) + t.strictEqual(found, undefined) +}) + + +test('find accessible - multi item array, no matches', function (t) { + t.plan(1) + + var candidates = [ 'non_existent_file', 'unreadable_file' ] + var found = configure.test.findAccessibleSync('test', dir, candidates) + t.strictEqual(found, undefined) +}) + + +test('find accessible - multi item array, single match', function (t) { + t.plan(1) + + var candidates = [ 'non_existent_file', readableFile ] + var found = configure.test.findAccessibleSync('test', dir, candidates) + t.strictEqual(found, path.resolve(dir, readableFile)) +}) + +test('find accessible - multi item array, return first match', function (t) { + t.plan(1) + + var candidates = [ 'non_existent_file', anotherReadableFile, readableFile ] + var found = configure.test.findAccessibleSync('test', dir, candidates) + t.strictEqual(found, path.resolve(dir, anotherReadableFile)) +})