@@ -249,11 +249,29 @@ struct AWSLambdaPackager: CommandPlugin {
249
249
let resourcesDirectoryName = artifactURL. lastPathComponent
250
250
let relocatedResourcesDirectory = workingDirectory. appending ( path: resourcesDirectoryName)
251
251
if FileManager . default. fileExists ( atPath: artifactURL. path ( ) ) {
252
- try FileManager . default. copyItem (
253
- atPath: artifactURL. path ( ) ,
254
- toPath: relocatedResourcesDirectory. path ( )
255
- )
256
- arguments. append ( resourcesDirectoryName)
252
+ do {
253
+ try FileManager . default. copyItem (
254
+ atPath: artifactURL. path ( ) ,
255
+ toPath: relocatedResourcesDirectory. path ( )
256
+ )
257
+ arguments. append ( resourcesDirectoryName)
258
+ } catch let error as CocoaError {
259
+
260
+ // On Linux, when the build has been done with Docker,
261
+ // the source file are owned by root
262
+ // this causes a permission error **after** the files have been copied
263
+ // see https://github.com/swift-server/swift-aws-lambda-runtime/issues/449
264
+ // see https://forums.swift.org/t/filemanager-copyitem-on-linux-fails-after-copying-the-files/77282
265
+
266
+ // because this error happens after the files have been copied, we can ignore it
267
+ // this code checks if the destination file exists
268
+ // if they do, just ignore error, otherwise throw it up to the caller.
269
+ if !( error. code == CocoaError . Code. fileWriteNoPermission
270
+ && FileManager . default. fileExists ( atPath: relocatedResourcesDirectory. path ( ) ) )
271
+ {
272
+ throw error
273
+ } // else just ignore it
274
+ }
257
275
}
258
276
}
259
277
0 commit comments