Skip to content

Commit ee689bb

Browse files
committed
protect ~/.swiftpm from concurrent access (#3952)
1 parent 63abfbb commit ee689bb

File tree

1 file changed

+15
-6
lines changed

1 file changed

+15
-6
lines changed

Sources/Basics/FileSystem+Extensions.swift

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,11 @@ extension FileSystem {
6060
try self.createDirectory(self.dotSwiftPM, recursive: true)
6161
}
6262
// Create ~/.swiftpm/cache symlink if necessary
63-
if !self.exists(self.dotSwiftPMCachesDirectory, followSymlink: false) {
64-
try self.createSymbolicLink(dotSwiftPMCachesDirectory, pointingAt: idiomaticCacheDirectory, relative: false)
63+
// locking ~/.swiftpm to protect from concurrent access
64+
try self.withLock(on: self.dotSwiftPM, type: .exclusive) {
65+
if !self.exists(self.dotSwiftPMCachesDirectory, followSymlink: false) {
66+
try self.createSymbolicLink(dotSwiftPMCachesDirectory, pointingAt: idiomaticCacheDirectory, relative: false)
67+
}
6568
}
6669
return idiomaticCacheDirectory
6770
}
@@ -139,8 +142,11 @@ extension FileSystem {
139142
try self.createDirectory(self.dotSwiftPM, recursive: true)
140143
}
141144
// Create ~/.swiftpm/configuration symlink if necessary
142-
if !self.exists(self.dotSwiftPMConfigurationDirectory, followSymlink: false) {
143-
try self.createSymbolicLink(dotSwiftPMConfigurationDirectory, pointingAt: idiomaticConfigurationDirectory, relative: false)
145+
// locking ~/.swiftpm to protect from concurrent access
146+
try self.withLock(on: self.dotSwiftPM, type: .exclusive) {
147+
if !self.exists(self.dotSwiftPMConfigurationDirectory, followSymlink: false) {
148+
try self.createSymbolicLink(dotSwiftPMConfigurationDirectory, pointingAt: idiomaticConfigurationDirectory, relative: false)
149+
}
144150
}
145151

146152
return idiomaticConfigurationDirectory
@@ -185,8 +191,11 @@ extension FileSystem {
185191
try self.createDirectory(self.dotSwiftPM, recursive: true)
186192
}
187193
// Create ~/.swiftpm/security symlink if necessary
188-
if !self.exists(self.dotSwiftPMSecurityDirectory, followSymlink: false) {
189-
try self.createSymbolicLink(dotSwiftPMSecurityDirectory, pointingAt: idiomaticSecurityDirectory, relative: false)
194+
// locking ~/.swiftpm to protect from concurrent access
195+
try self.withLock(on: self.dotSwiftPM, type: .exclusive) {
196+
if !self.exists(self.dotSwiftPMSecurityDirectory, followSymlink: false) {
197+
try self.createSymbolicLink(dotSwiftPMSecurityDirectory, pointingAt: idiomaticSecurityDirectory, relative: false)
198+
}
190199
}
191200
return idiomaticSecurityDirectory
192201
}

0 commit comments

Comments
 (0)