@@ -6,6 +6,7 @@ import Foundation
66import Git
77import PathKit
88import SelectiveTestLogger
9+ import SelectiveTestShell
910import Workspace
1011import XcodeProj
1112
@@ -200,8 +201,14 @@ extension WorkspaceInfo {
200201 } == nil
201202 }
202203
204+ // SwiftPM6 locks build directory up when parsing multiple packages concurrently
205+ let isSwiftVersion6Plus = try isSwiftVersion6Plus ( )
206+
203207 return Array ( allPackages) . concurrentMap { path in
204- try ? PackageTargetMetadata . parse ( at: path. parent ( ) )
208+ try ? PackageTargetMetadata . parse (
209+ at: path. parent ( ) ,
210+ addingIgnoreLockOption: isSwiftVersion6Plus
211+ )
205212 } . compactMap { $0 } . reduce ( [ PackageTargetMetadata] ( ) ) { partialResult, new in
206213 var result = partialResult
207214 result. append ( contentsOf: new)
@@ -347,4 +354,22 @@ extension WorkspaceInfo {
347354 dependencyStructure: DependencyGraph ( dependsOn: dependsOn) ,
348355 candidateTestPlan: candidateTestPlan)
349356 }
357+
358+ private static func isSwiftVersion6Plus( ) throws -> Bool {
359+ guard let regex = try ? NSRegularExpression ( pattern: #"Apple Swift version (\d+)"# ) else {
360+ return false
361+ }
362+
363+ let versionString = try Shell . execOrFail ( " swift --version " )
364+ let range = NSRange ( versionString. startIndex..< versionString. endIndex, in: versionString)
365+ if let match = regex. firstMatch ( in: versionString, options: [ ] , range: range) ,
366+ let majorVersionRange = Range ( match. range ( at: 1 ) , in: versionString) ,
367+ let majorVersion = Int ( versionString [ majorVersionRange] ) ,
368+ majorVersion > 5
369+ {
370+ return true
371+ } else {
372+ return false
373+ }
374+ }
350375}
0 commit comments