Skip to content

Commit 3570f6e

Browse files
authored
protect ~/.swiftpm from concurrent access (#3952)
1 parent 2aae882 commit 3570f6e

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
@@ -61,8 +61,11 @@ extension FileSystem {
6161
try self.createDirectory(self.dotSwiftPM, recursive: true)
6262
}
6363
// Create ~/.swiftpm/cache symlink if necessary
64-
if !self.exists(self.dotSwiftPMCachesDirectory, followSymlink: false) {
65-
try self.createSymbolicLink(dotSwiftPMCachesDirectory, pointingAt: idiomaticCacheDirectory, relative: false)
64+
// locking ~/.swiftpm to protect from concurrent access
65+
try self.withLock(on: self.dotSwiftPM, type: .exclusive) {
66+
if !self.exists(self.dotSwiftPMCachesDirectory, followSymlink: false) {
67+
try self.createSymbolicLink(dotSwiftPMCachesDirectory, pointingAt: idiomaticCacheDirectory, relative: false)
68+
}
6669
}
6770
return idiomaticCacheDirectory
6871
}
@@ -140,8 +143,11 @@ extension FileSystem {
140143
try self.createDirectory(self.dotSwiftPM, recursive: true)
141144
}
142145
// Create ~/.swiftpm/configuration symlink if necessary
143-
if !self.exists(self.dotSwiftPMConfigurationDirectory, followSymlink: false) {
144-
try self.createSymbolicLink(dotSwiftPMConfigurationDirectory, pointingAt: idiomaticConfigurationDirectory, relative: false)
146+
// locking ~/.swiftpm to protect from concurrent access
147+
try self.withLock(on: self.dotSwiftPM, type: .exclusive) {
148+
if !self.exists(self.dotSwiftPMConfigurationDirectory, followSymlink: false) {
149+
try self.createSymbolicLink(dotSwiftPMConfigurationDirectory, pointingAt: idiomaticConfigurationDirectory, relative: false)
150+
}
145151
}
146152

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

0 commit comments

Comments
 (0)