From 766c2ddb594037b54b1031f6c763072174f90f9e Mon Sep 17 00:00:00 2001 From: "Liam (GH:rezonant)" Date: Wed, 26 Aug 2015 16:00:06 -0400 Subject: [PATCH] Implements capital X (entry on directories) --- src/chmod.js | 18 ++++++++++++------ test/chmod.js | 11 +++++++++++ test/resources/chmod/xdir/deep/file | 1 + test/resources/chmod/xdir/file | 1 + 4 files changed, 25 insertions(+), 6 deletions(-) create mode 100644 test/resources/chmod/xdir/deep/file create mode 100644 test/resources/chmod/xdir/file diff --git a/src/chmod.js b/src/chmod.js index 30aa904..4bac756 100644 --- a/src/chmod.js +++ b/src/chmod.js @@ -114,7 +114,9 @@ function _chmod(options, mode, filePattern) { return; } - var perms = fs.statSync(file).mode; + var stat = fs.statSync(file); + var isDir = stat.isDirectory(); + var perms = stat.mode; var type = perms & PERMS.TYPE_MASK; var newPerms = perms; @@ -135,11 +137,15 @@ function _chmod(options, mode, filePattern) { var changeGroup = applyTo.indexOf('g') != -1 || applyTo === 'a' || applyTo === ''; var changeOther = applyTo.indexOf('o') != -1 || applyTo === 'a' || applyTo === ''; - var changeRead = change.indexOf('r') != -1; - var changeWrite = change.indexOf('w') != -1; - var changeExec = change.indexOf('x') != -1; - var changeSticky = change.indexOf('t') != -1; - var changeSetuid = change.indexOf('s') != -1; + var changeRead = change.indexOf('r') != -1; + var changeWrite = change.indexOf('w') != -1; + var changeExec = change.indexOf('x') != -1; + var changeExecDir = change.indexOf('X') != -1; + var changeSticky = change.indexOf('t') != -1; + var changeSetuid = change.indexOf('s') != -1; + + if (changeExecDir && isDir) + changeExec = true; var mask = 0; if (changeOwner) { diff --git a/test/chmod.js b/test/chmod.js index cbc1411..61d60fd 100644 --- a/test/chmod.js +++ b/test/chmod.js @@ -125,6 +125,17 @@ shell.chmod('a-rwx,u+rw', 'resources/chmod/file1'); assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('600', 8), parseInt('600', 8)); shell.chmod('644', 'resources/chmod/file1'); +// Support capital X ("entry" permission aka directory-only execute) +shell.chmod('744', 'resources/chmod/xdir'); +shell.chmod('644', 'resources/chmod/xdir/file'); +shell.chmod('744', 'resources/chmod/xdir/deep'); +shell.chmod('644', 'resources/chmod/xdir/deep/file'); +shell.chmod('-R', 'a+X', 'resources/chmod/xdir'); + +assert.equal(fs.statSync('resources/chmod/xdir').mode & parseInt('755', 8), parseInt('755', 8)); +assert.equal(fs.statSync('resources/chmod/xdir/file').mode & parseInt('644', 8), parseInt('644', 8)); +assert.equal(fs.statSync('resources/chmod/xdir/deep').mode & parseInt('755', 8), parseInt('755', 8)); +assert.equal(fs.statSync('resources/chmod/xdir/deep/file').mode & parseInt('644', 8), parseInt('644', 8)); shell.exit(123); diff --git a/test/resources/chmod/xdir/deep/file b/test/resources/chmod/xdir/deep/file new file mode 100644 index 0000000..02f6335 --- /dev/null +++ b/test/resources/chmod/xdir/deep/file @@ -0,0 +1 @@ +a file diff --git a/test/resources/chmod/xdir/file b/test/resources/chmod/xdir/file new file mode 100644 index 0000000..02f6335 --- /dev/null +++ b/test/resources/chmod/xdir/file @@ -0,0 +1 @@ +a file