Skip to content

Commit

Permalink
Replace fs.accessSync call to fs.statSync
Browse files Browse the repository at this point in the history
fs.accessSync does not exist in Node 0.10.x.

PR-URL: #955
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
  • Loading branch information
richardlau authored and bnoordhuis committed Jun 17, 2016
1 parent 0dba4bd commit 77383dd
Show file tree
Hide file tree
Showing 3 changed files with 123 additions and 12 deletions.
46 changes: 35 additions & 11 deletions lib/configure.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
module.exports = exports = configure
module.exports.test = { findPython: findPython }
module.exports.test = { findAccessibleSync: findAccessibleSync,
findPython: findPython }

/**
* Module dependencies.
Expand All @@ -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'

Expand Down Expand Up @@ -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))
}
}

Expand Down Expand Up @@ -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()

Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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-*"
Expand Down
86 changes: 86 additions & 0 deletions test/test-find-accessible-sync.js
Original file line number Diff line number Diff line change
@@ -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))
})

0 comments on commit 77383dd

Please sign in to comment.