@@ -92,7 +92,7 @@ func ignoreChtimesError(err error) error {
9292 }
9393}
9494
95- func copyDir (fs FS , name string , info fs.FileInfo ) (err error ) {
95+ func copyDir (fsys FS , name string , info fs.FileInfo ) (err error ) {
9696 defer func () {
9797 if err != nil {
9898 err = fmt .Errorf ("%w: %s: %v" , errCopyDirFailed , name , err )
@@ -115,21 +115,21 @@ func copyDir(fs FS, name string, info fs.FileInfo) (err error) {
115115 }
116116
117117 // try to create all dirs as somone might have tempered with the file system
118- targetMode := info .Mode ()
119- err = fs .MkdirAll (name , targetMode . Perm () )
118+ targetMode := info .Mode () & ( fs . ModeSticky | fs . ModePerm )
119+ err = fsys .MkdirAll (name , targetMode )
120120 if err != nil {
121121 return err
122122 }
123123
124- newDirInfo , err := fs .Lstat (name )
124+ newDirInfo , err := fsys .Lstat (name )
125125 if err != nil {
126126 return fmt .Errorf ("%w: %v" , errCopyDirFailed , err )
127127 }
128128
129129 currentMode := newDirInfo .Mode ()
130130
131131 if ! equalMode (currentMode , targetMode ) {
132- err = fs .Chmod (name , targetMode )
132+ err = fsys .Chmod (name , targetMode )
133133 if err != nil {
134134 // TODO: do we want to fail here?
135135 return err
@@ -139,23 +139,23 @@ func copyDir(fs FS, name string, info fs.FileInfo) (err error) {
139139 targetModTime := info .ModTime ()
140140 currentModTime := newDirInfo .ModTime ()
141141 if ! currentModTime .Equal (targetModTime ) {
142- err = ignoreChtimesError (fs .Chtimes (name , targetModTime , targetModTime ))
142+ err = ignoreChtimesError (fsys .Chtimes (name , targetModTime , targetModTime ))
143143 if err != nil {
144144 return err
145145 }
146146 }
147147
148148 // https://pkg.go.dev/os#Chown
149149 // Windows & Plan9 not supported
150- err = ignoreChownError (chown (info , name , fs ))
150+ err = ignoreChownError (chown (info , name , fsys ))
151151 if err != nil {
152152 return err
153153 }
154154
155155 return nil
156156}
157157
158- func copyFile (fs FS , name string , info fs.FileInfo , sourceFile File ) (err error ) {
158+ func copyFile (fsys FS , name string , info fs.FileInfo , sourceFile File ) (err error ) {
159159 defer func () {
160160 if err != nil {
161161 err = fmt .Errorf ("%w: %s: %v" , errCopyFileFailed , name , err )
@@ -168,19 +168,19 @@ func copyFile(fs FS, name string, info fs.FileInfo, sourceFile File) (err error)
168168 //
169169 targetMode := info .Mode ()
170170
171- err = writeFile (fs , name , targetMode .Perm (), sourceFile )
171+ err = writeFile (fsys , name , targetMode .Perm (), sourceFile )
172172 if err != nil {
173173 return err
174174 }
175175
176- newFileInfo , err := fs .Lstat (name )
176+ newFileInfo , err := fsys .Lstat (name )
177177 if err != nil {
178178 return err
179179 }
180180
181181 if ! equalMode (newFileInfo .Mode (), targetMode ) {
182182 // not equal, update it
183- err = fs .Chmod (name , targetMode )
183+ err = fsys .Chmod (name , targetMode )
184184 if err != nil {
185185 return err
186186 }
@@ -190,7 +190,7 @@ func copyFile(fs FS, name string, info fs.FileInfo, sourceFile File) (err error)
190190 currentModTime := newFileInfo .ModTime ()
191191
192192 if ! currentModTime .Equal (targetModTime ) {
193- err = ignoreChtimesError (fs .Chtimes (name , targetModTime , targetModTime ))
193+ err = ignoreChtimesError (fsys .Chtimes (name , targetModTime , targetModTime ))
194194 if err != nil {
195195 return err
196196 }
@@ -199,17 +199,17 @@ func copyFile(fs FS, name string, info fs.FileInfo, sourceFile File) (err error)
199199 // might cause a windows error that this function is not implemented by the OS
200200 // in a unix fassion
201201 // permission and not implemented errors are ignored
202- err = ignoreChownError (chown (info , name , fs ))
202+ err = ignoreChownError (chown (info , name , fsys ))
203203 if err != nil {
204204 return err
205205 }
206206
207207 return nil
208208}
209209
210- func writeFile (fs FS , name string , perm fs.FileMode , content io.Reader ) (err error ) {
210+ func writeFile (fsys FS , name string , perm fs.FileMode , content io.Reader ) (err error ) {
211211 // same as create but with custom permissions
212- file , err := fs .OpenFile (name , os .O_RDWR | os .O_CREATE | os .O_TRUNC , perm .Perm ())
212+ file , err := fsys .OpenFile (name , os .O_RDWR | os .O_CREATE | os .O_TRUNC , perm .Perm ())
213213 if err != nil {
214214 return err
215215 }
@@ -250,9 +250,9 @@ func copySymlink(source, target FS, name string, info fs.FileInfo) (err error) {
250250
251251// Chown is an operating system dependent implementation.
252252// only tries to change owner in cas ethat the owner differs
253- func chown (from fs.FileInfo , toName string , fs FS ) error {
253+ func chown (from fs.FileInfo , toName string , fsys FS ) error {
254254
255- oldOwnerFi , err := fs .Lstat (toName )
255+ oldOwnerFi , err := fsys .Lstat (toName )
256256 if err != nil {
257257 return fmt .Errorf ("lstat for chown failed: %w" , err )
258258 }
@@ -265,7 +265,7 @@ func chown(from fs.FileInfo, toName string, fs FS) error {
265265
266266 // only update when something changed
267267 if oldUid != newUid || oldGid != newGid {
268- err = fs .Chown (toName , toUID (from ), toGID (from ))
268+ err = fsys .Chown (toName , toUID (from ), toGID (from ))
269269 if err != nil {
270270 return err
271271 }
0 commit comments