]> gerrit.simantics Code Review - simantics/district.git/blob - org.simantics.maps.server/node/node-v4.8.0-win-x64/node_modules/npm/node_modules/chmodr/chmodr.js
Adding integrated tile server
[simantics/district.git] / org.simantics.maps.server / node / node-v4.8.0-win-x64 / node_modules / npm / node_modules / chmodr / chmodr.js
1 module.exports = chmodr
2 chmodr.sync = chmodrSync
3
4 var fs = require("fs")
5 var path = require("path")
6
7 function chmodr (p, mode, cb) {
8   fs.lstat(p, function (er, stats) {
9     if (er)
10       return cb(er)
11     if (stats.isSymbolicLink())
12       return cb()
13     if (stats.isDirectory())
14       return chmodrDir(p, mode, cb)
15     return fs.chmod(p, mode, cb)
16   })
17 }
18
19 function chmodrDir (p, mode, cb) {
20   fs.readdir(p, function (er, children) {
21     if (er)
22       return cb(er)
23
24     if (!children.length)
25       return fs.chmod(p, dirMode(mode), cb)
26
27     var len = children.length
28     var errState = null
29     children.forEach(function (child) {
30       chmodr(path.resolve(p, child), mode, then)
31     })
32
33     // return first error, but not until all are finished,
34     // so we don't keep performing FS operations after the cb
35     function then (er) {
36       len = len - 1
37       if (er && !errState)
38         errState = er
39       if (len === 0) {
40         if (errState)
41           return cb(errState)
42         else
43           return fs.chmod(p, dirMode(mode), cb)
44       }
45     }
46   })
47 }
48
49 function chmodrSync (p, mode) {
50   var stats = fs.lstatSync(p)
51   if (stats.isSymbolicLink())
52     return
53   if (stats.isDirectory())
54     return chmodrDirSync(p, mode)
55   else
56     return fs.chmodSync(p, mode)
57 }
58
59 function chmodrDirSync (p, mode) {
60   fs.readdirSync(p).forEach(function (child) {
61     chmodrSync(path.resolve(p, child), mode)
62   })
63   return fs.chmodSync(p, dirMode(mode))
64 }
65
66 // If a party has r, add x
67 // so that dirs are listable
68 function dirMode(mode) {
69   if (mode & 0400)
70     mode |= 0100
71   if (mode & 040)
72     mode |= 010
73   if (mode & 04)
74     mode |= 01
75   return mode
76 }