@@ -11,6 +11,7 @@ var buffer = require('buffer');
11
11
var defaultResolution = require ( 'default-resolution' ) ;
12
12
13
13
var fo = require ( '../lib/file-operations' ) ;
14
+ var constants = require ( '../lib/constants' ) ;
14
15
15
16
var mkdirp = fo . mkdirp ;
16
17
var closeFd = fo . closeFd ;
@@ -22,10 +23,15 @@ var updateMetadata = fo.updateMetadata;
22
23
23
24
var resolution = defaultResolution ( ) ;
24
25
25
- var MASK_MODE = parseInt ( '7777' , 8 ) ;
26
+ var DEFAULT_DIR_MODE = masked ( constants . DEFAULT_DIR_MODE & ~ process . umask ( ) ) . toString ( 8 ) ;
26
27
27
28
function masked ( mode ) {
28
- return mode & MASK_MODE ;
29
+ return mode & constants . MASK_MODE ;
30
+ }
31
+
32
+ function statHuman ( filepath ) {
33
+ var stats = fs . lstatSync ( filepath ) ;
34
+ return masked ( stats . mode ) . toString ( 8 ) ;
29
35
}
30
36
31
37
function noop ( ) { }
@@ -914,10 +920,15 @@ describe('updateMetadata', function() {
914
920
} ) ;
915
921
916
922
describe ( 'mkdirp' , function ( ) {
917
- var DEFAULT_DIR_MODE = parseInt ( '0777' , 8 ) ;
918
- var MODE_MASK = parseInt ( '0777' , 8 ) ;
919
923
920
- var dir = path . join ( __dirname , './fixtures/bar' ) ;
924
+ var fixtures = path . join ( __dirname , './fixtures' ) ;
925
+ var dir = path . join ( fixtures , './bar' ) ;
926
+
927
+ beforeEach ( function ( done ) {
928
+ // Linux inherits the setgid of the directory and it messes up our assertions
929
+ // So we explixitly set the mode to 777 before each test
930
+ fs . chmod ( fixtures , '777' , done ) ;
931
+ } ) ;
921
932
922
933
afterEach ( function ( ) {
923
934
return del ( dir ) ;
@@ -926,49 +937,37 @@ describe('mkdirp', function() {
926
937
it ( 'makes a single directory' , function ( done ) {
927
938
mkdirp ( dir , function ( err ) {
928
939
expect ( err ) . toNotExist ( ) ;
940
+ expect ( statHuman ( dir ) ) . toExist ( ) ;
929
941
930
- fs . stat ( dir , function ( err2 , stats ) {
931
- expect ( err2 ) . toNotExist ( ) ;
932
- expect ( stats ) . toExist ( ) ;
933
-
934
- done ( ) ;
935
- } ) ;
942
+ done ( ) ;
936
943
} ) ;
937
944
} ) ;
938
945
939
- it ( 'makes single directory w/ correct permissions ' , function ( done ) {
946
+ it ( 'makes single directory w/ default mode ' , function ( done ) {
940
947
if ( isWindows ) {
941
948
this . skip ( ) ;
942
949
return ;
943
950
}
944
951
945
952
mkdirp ( dir , function ( err ) {
946
953
expect ( err ) . toNotExist ( ) ;
954
+ expect ( statHuman ( dir ) ) . toEqual ( DEFAULT_DIR_MODE ) ;
947
955
948
- fs . stat ( dir , function ( err2 , stats ) {
949
- expect ( err2 ) . toNotExist ( ) ;
950
- expect ( stats . mode & MODE_MASK ) . toEqual ( DEFAULT_DIR_MODE & ~ process . umask ( ) ) ;
951
-
952
- done ( ) ;
953
- } ) ;
956
+ done ( ) ;
954
957
} ) ;
955
958
} ) ;
956
959
957
960
it ( 'makes multiple directories' , function ( done ) {
958
961
var nestedDir = path . join ( dir , './baz/foo' ) ;
959
962
mkdirp ( nestedDir , function ( err ) {
960
963
expect ( err ) . toNotExist ( ) ;
964
+ expect ( statHuman ( nestedDir ) ) . toExist ( ) ;
961
965
962
- fs . stat ( nestedDir , function ( err2 , stats ) {
963
- expect ( err2 ) . toNotExist ( ) ;
964
- expect ( stats ) . toExist ( ) ;
965
-
966
- done ( ) ;
967
- } ) ;
966
+ done ( ) ;
968
967
} ) ;
969
968
} ) ;
970
969
971
- it ( 'makes multiple directories w/ correct permissions ' , function ( done ) {
970
+ it ( 'makes multiple directories w/ default mode ' , function ( done ) {
972
971
if ( isWindows ) {
973
972
this . skip ( ) ;
974
973
return ;
@@ -977,13 +976,9 @@ describe('mkdirp', function() {
977
976
var nestedDir = path . join ( dir , './baz/foo' ) ;
978
977
mkdirp ( nestedDir , function ( err ) {
979
978
expect ( err ) . toNotExist ( ) ;
979
+ expect ( statHuman ( nestedDir ) ) . toEqual ( DEFAULT_DIR_MODE ) ;
980
980
981
- fs . stat ( nestedDir , function ( err2 , stats ) {
982
- expect ( err2 ) . toNotExist ( ) ;
983
- expect ( stats . mode & MODE_MASK ) . toEqual ( DEFAULT_DIR_MODE & ~ process . umask ( ) ) ;
984
-
985
- done ( ) ;
986
- } ) ;
981
+ done ( ) ;
987
982
} ) ;
988
983
} ) ;
989
984
@@ -996,13 +991,24 @@ describe('mkdirp', function() {
996
991
var mode = parseInt ( '0700' , 8 ) ;
997
992
mkdirp ( dir , mode , function ( err ) {
998
993
expect ( err ) . toNotExist ( ) ;
994
+ expect ( statHuman ( dir ) ) . toEqual ( masked ( mode ) . toString ( 8 ) ) ;
999
995
1000
- fs . stat ( dir , function ( err2 , stats ) {
1001
- expect ( err2 ) . toNotExist ( ) ;
1002
- expect ( stats . mode & MODE_MASK ) . toEqual ( mode & ~ process . umask ( ) ) ;
996
+ done ( ) ;
997
+ } ) ;
998
+ } ) ;
1003
999
1004
- done ( ) ;
1005
- } ) ;
1000
+ it ( 'can create a directory with setgid permission' , function ( done ) {
1001
+ if ( isWindows ) {
1002
+ this . skip ( ) ;
1003
+ return ;
1004
+ }
1005
+
1006
+ var mode = parseInt ( '2700' , 8 ) ;
1007
+ mkdirp ( dir , mode , function ( err ) {
1008
+ expect ( err ) . toNotExist ( ) ;
1009
+ expect ( statHuman ( dir ) ) . toEqual ( masked ( mode ) . toString ( 8 ) ) ;
1010
+
1011
+ done ( ) ;
1006
1012
} ) ;
1007
1013
} ) ;
1008
1014
@@ -1018,13 +1024,9 @@ describe('mkdirp', function() {
1018
1024
1019
1025
mkdirp ( dir , function ( err2 ) {
1020
1026
expect ( err2 ) . toNotExist ( ) ;
1027
+ expect ( statHuman ( dir ) ) . toEqual ( masked ( mode ) . toString ( 8 ) ) ;
1021
1028
1022
- fs . stat ( dir , function ( err3 , stats ) {
1023
- expect ( err3 ) . toNotExist ( ) ;
1024
- expect ( stats . mode & MODE_MASK ) . toEqual ( mode & ~ process . umask ( ) ) ;
1025
-
1026
- done ( ) ;
1027
- } ) ;
1029
+ done ( ) ;
1028
1030
} ) ;
1029
1031
} ) ;
1030
1032
} ) ;
@@ -1039,13 +1041,27 @@ describe('mkdirp', function() {
1039
1041
var mode = parseInt ( '0700' , 8 ) ;
1040
1042
mkdirp ( nestedDir , mode , function ( err ) {
1041
1043
expect ( err ) . toNotExist ( ) ;
1044
+ expect ( statHuman ( nestedDir ) ) . toEqual ( masked ( mode ) . toString ( 8 ) ) ;
1042
1045
1043
- fs . stat ( nestedDir , function ( err2 , stats ) {
1044
- expect ( err2 ) . toNotExist ( ) ;
1045
- expect ( stats . mode & MODE_MASK ) . toEqual ( mode & ~ process . umask ( ) ) ;
1046
+ done ( ) ;
1047
+ } ) ;
1048
+ } ) ;
1046
1049
1047
- done ( ) ;
1048
- } ) ;
1050
+ it ( 'uses default mode on intermediate directories' , function ( done ) {
1051
+ if ( isWindows ) {
1052
+ this . skip ( ) ;
1053
+ return ;
1054
+ }
1055
+
1056
+ var intermediateDir = path . join ( dir , './baz' ) ;
1057
+ var nestedDir = path . join ( intermediateDir , './foo' ) ;
1058
+ var mode = parseInt ( '0700' , 8 ) ;
1059
+ mkdirp ( nestedDir , mode , function ( err ) {
1060
+ expect ( err ) . toNotExist ( ) ;
1061
+ expect ( statHuman ( dir ) ) . toEqual ( DEFAULT_DIR_MODE ) ;
1062
+ expect ( statHuman ( intermediateDir ) ) . toEqual ( DEFAULT_DIR_MODE ) ;
1063
+
1064
+ done ( ) ;
1049
1065
} ) ;
1050
1066
} ) ;
1051
1067
@@ -1058,21 +1074,13 @@ describe('mkdirp', function() {
1058
1074
var mode = parseInt ( '0700' , 8 ) ;
1059
1075
mkdirp ( dir , function ( err ) {
1060
1076
expect ( err ) . toNotExist ( ) ;
1077
+ expect ( statHuman ( dir ) ) . toEqual ( DEFAULT_DIR_MODE ) ;
1061
1078
1062
- fs . stat ( dir , function ( err2 , stats ) {
1079
+ mkdirp ( dir , mode , function ( err2 ) {
1063
1080
expect ( err2 ) . toNotExist ( ) ;
1064
- expect ( stats . mode & MODE_MASK ) . toEqual ( DEFAULT_DIR_MODE & ~ process . umask ( ) ) ;
1065
-
1066
- mkdirp ( dir , mode , function ( err3 ) {
1067
- expect ( err3 ) . toNotExist ( ) ;
1081
+ expect ( statHuman ( dir ) ) . toEqual ( masked ( mode ) . toString ( 8 ) ) ;
1068
1082
1069
- fs . stat ( dir , function ( err4 , stats ) {
1070
- expect ( err2 ) . toNotExist ( ) ;
1071
- expect ( stats . mode & MODE_MASK ) . toEqual ( mode & ~ process . umask ( ) ) ;
1072
-
1073
- done ( ) ;
1074
- } ) ;
1075
- } ) ;
1083
+ done ( ) ;
1076
1084
} ) ;
1077
1085
} ) ;
1078
1086
} ) ;
@@ -1109,14 +1117,11 @@ describe('mkdirp', function() {
1109
1117
fs . writeFile ( file , 'hello world' , function ( err2 ) {
1110
1118
expect ( err2 ) . toNotExist ( ) ;
1111
1119
1112
- var stats = fs . statSync ( file ) ;
1113
- var expectedMode = stats . mode & MODE_MASK ;
1120
+ var expectedMode = statHuman ( file ) ;
1114
1121
1115
1122
mkdirp ( file , mode , function ( err3 ) {
1116
1123
expect ( err3 ) . toExist ( ) ;
1117
-
1118
- var stats = fs . statSync ( file ) ;
1119
- expect ( stats . mode & MODE_MASK ) . toEqual ( expectedMode ) ;
1124
+ expect ( statHuman ( file ) ) . toEqual ( expectedMode ) ;
1120
1125
1121
1126
done ( ) ;
1122
1127
} ) ;
0 commit comments