@@ -6,6 +6,7 @@ import Foundation
6
6
import Git
7
7
import PathKit
8
8
import SelectiveTestLogger
9
+ import SelectiveTestShell
9
10
import Workspace
10
11
import XcodeProj
11
12
@@ -200,8 +201,14 @@ extension WorkspaceInfo {
200
201
} == nil
201
202
}
202
203
204
+ // SwiftPM6 locks build directory up when parsing multiple packages concurrently
205
+ let isSwiftVersion6Plus = try isSwiftVersion6Plus ( )
206
+
203
207
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
+ )
205
212
} . compactMap { $0 } . reduce ( [ PackageTargetMetadata] ( ) ) { partialResult, new in
206
213
var result = partialResult
207
214
result. append ( contentsOf: new)
@@ -347,4 +354,22 @@ extension WorkspaceInfo {
347
354
dependencyStructure: DependencyGraph ( dependsOn: dependsOn) ,
348
355
candidateTestPlan: candidateTestPlan)
349
356
}
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
+ }
350
375
}
0 commit comments