@@ -25,8 +25,6 @@ import (
2525 "github.com/spf13/afero/mem"
2626)
2727
28- const chmodBits = os .ModePerm | os .ModeSetuid | os .ModeSetgid | os .ModeSticky // Only a subset of bits are allowed to be changed. Documented under os.Chmod()
29-
3028type MemMapFs struct {
3129 mu sync.RWMutex
3230 data map [string ]* mem.FileData
@@ -43,7 +41,7 @@ func (m *MemMapFs) getData() map[string]*mem.FileData {
4341 // Root should always exist, right?
4442 // TODO: what about windows?
4543 root := mem .CreateDir (FilePathSeparator )
46- mem .SetMode (root , os . ModeDir | 0755 )
44+ mem .Chmod (root , 0755 )
4745 m .data [FilePathSeparator ] = root
4846 })
4947 return m .data
@@ -123,15 +121,14 @@ func (m *MemMapFs) lockfreeMkdir(name string, perm os.FileMode) error {
123121 }
124122 } else {
125123 item := mem .CreateDir (name )
126- mem .SetMode (item , os . ModeDir | perm )
124+ mem .Chmod (item , perm )
127125 m .getData ()[name ] = item
128126 m .registerWithParent (item , perm )
129127 }
130128 return nil
131129}
132130
133131func (m * MemMapFs ) Mkdir (name string , perm os.FileMode ) error {
134- perm &= chmodBits
135132 name = normalizePath (name )
136133
137134 m .mu .RLock ()
@@ -143,12 +140,12 @@ func (m *MemMapFs) Mkdir(name string, perm os.FileMode) error {
143140
144141 m .mu .Lock ()
145142 item := mem .CreateDir (name )
146- mem .SetMode (item , os . ModeDir | perm )
143+ mem .Chmod (item , perm )
147144 m .getData ()[name ] = item
148145 m .registerWithParent (item , perm )
149146 m .mu .Unlock ()
150147
151- return m . setFileMode ( name , perm | os . ModeDir )
148+ return nil
152149}
153150
154151func (m * MemMapFs ) MkdirAll (path string , perm os.FileMode ) error {
@@ -215,7 +212,6 @@ func (m *MemMapFs) lockfreeOpen(name string) (*mem.FileData, error) {
215212}
216213
217214func (m * MemMapFs ) OpenFile (name string , flag int , perm os.FileMode ) (File , error ) {
218- perm &= chmodBits
219215 chmod := false
220216 file , err := m .openWrite (name )
221217 if err == nil && (flag & os .O_EXCL > 0 ) {
@@ -246,7 +242,7 @@ func (m *MemMapFs) OpenFile(name string, flag int, perm os.FileMode) (File, erro
246242 }
247243 }
248244 if chmod {
249- return file , m . setFileMode (name , perm )
245+ m . Chmod (name , perm )
250246 }
251247 return file , nil
252248}
@@ -331,45 +327,30 @@ func (m *MemMapFs) Stat(name string) (os.FileInfo, error) {
331327 return fi , nil
332328}
333329
334- func (m * MemMapFs ) Chmod (name string , mode os. FileMode ) error {
335- mode &= chmodBits
330+ func (m * MemMapFs ) getFileData (name string ) * mem. FileData {
331+ name = normalizePath ( name )
336332
337333 m .mu .RLock ()
338- f , ok := m .getData ()[name ]
334+ f := m .getData ()[name ]
339335 m .mu .RUnlock ()
340- if ! ok {
341- return & os.PathError {Op : "chmod" , Path : name , Err : ErrFileNotFound }
342- }
343- prevOtherBits := mem .GetFileInfo (f ).Mode () & ^ chmodBits
344336
345- mode = prevOtherBits | mode
346- return m .setFileMode (name , mode )
337+ return f
347338}
348339
349- func (m * MemMapFs ) setFileMode (name string , mode os.FileMode ) error {
350- name = normalizePath (name )
351-
352- m .mu .RLock ()
353- f , ok := m .getData ()[name ]
354- m .mu .RUnlock ()
355- if ! ok {
340+ func (m * MemMapFs ) Chmod (name string , mode os.FileMode ) error {
341+ f := m .getFileData (name )
342+ if f == nil {
356343 return & os.PathError {Op : "chmod" , Path : name , Err : ErrFileNotFound }
357344 }
358345
359- m .mu .Lock ()
360- mem .SetMode (f , mode )
361- m .mu .Unlock ()
346+ mem .Chmod (f , mode )
362347
363348 return nil
364349}
365350
366351func (m * MemMapFs ) Chown (name string , uid , gid int ) error {
367- name = normalizePath (name )
368-
369- m .mu .RLock ()
370- f , ok := m .getData ()[name ]
371- m .mu .RUnlock ()
372- if ! ok {
352+ f := m .getFileData (name )
353+ if f == nil {
373354 return & os.PathError {Op : "chown" , Path : name , Err : ErrFileNotFound }
374355 }
375356
@@ -380,18 +361,12 @@ func (m *MemMapFs) Chown(name string, uid, gid int) error {
380361}
381362
382363func (m * MemMapFs ) Chtimes (name string , atime time.Time , mtime time.Time ) error {
383- name = normalizePath (name )
384-
385- m .mu .RLock ()
386- f , ok := m .getData ()[name ]
387- m .mu .RUnlock ()
388- if ! ok {
364+ f := m .getFileData (name )
365+ if f == nil {
389366 return & os.PathError {Op : "chtimes" , Path : name , Err : ErrFileNotFound }
390367 }
391368
392- m .mu .Lock ()
393369 mem .SetModTime (f , mtime )
394- m .mu .Unlock ()
395370
396371 return nil
397372}
0 commit comments