mirror of https://github.com/lukechilds/node.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.6 KiB
65 lines
1.6 KiB
module.exports = chmodr
|
|
chmodr.sync = chmodrSync
|
|
|
|
var fs = require("fs")
|
|
, path = require("path")
|
|
|
|
function chmodr (p, mode, cb) {
|
|
fs.readdir(p, function (er, children) {
|
|
// any error other than ENOTDIR means it's not readable, or
|
|
// doesn't exist. give up.
|
|
if (er && er.code !== "ENOTDIR")
|
|
return cb(er)
|
|
var isDir = !er
|
|
var m = isDir ? dirMode(mode) : mode
|
|
if (er || !children.length)
|
|
return fs.chmod(p, m, cb)
|
|
|
|
var len = children.length
|
|
var errState = null
|
|
children.forEach(function (child) {
|
|
var pathChild = path.resolve(p, child);
|
|
fs.lstat(pathChild, function(er, stats) {
|
|
if (er)
|
|
return cb(er)
|
|
if (!stats.isSymbolicLink())
|
|
chmodr(pathChild, mode, then)
|
|
else
|
|
then()
|
|
})
|
|
})
|
|
function then (er) {
|
|
if (errState) return
|
|
if (er) return cb(errState = er)
|
|
if (-- len === 0) return fs.chmod(p, dirMode(mode), cb)
|
|
}
|
|
})
|
|
}
|
|
|
|
function chmodrSync (p, mode) {
|
|
var children
|
|
try {
|
|
children = fs.readdirSync(p)
|
|
} catch (er) {
|
|
if (er && er.code === "ENOTDIR") return fs.chmodSync(p, mode)
|
|
throw er
|
|
}
|
|
if (!children.length) return fs.chmodSync(p, dirMode(mode))
|
|
|
|
children.forEach(function (child) {
|
|
var pathChild = path.resolve(p, child)
|
|
var stats = fs.lstatSync(pathChild)
|
|
if (!stats.isSymbolicLink())
|
|
chmodrSync(pathChild, mode)
|
|
})
|
|
return fs.chmodSync(p, dirMode(mode))
|
|
}
|
|
|
|
// If a party has r, add x
|
|
// so that dirs are listable
|
|
function dirMode(mode) {
|
|
if (mode & 0400) mode |= 0100
|
|
if (mode & 040) mode |= 010
|
|
if (mode & 04) mode |= 01
|
|
return mode
|
|
}
|
|
|