Build Information
Successful build of M3UKit, reference main (b1bcb6
), with Swift 6.1 for macOS (SPM) on 27 Apr 2025 10:23:15 UTC.
Swift 6 data race errors: 3
Build Command
env DEVELOPER_DIR=/Applications/Xcode-16.3.0.app xcrun swift build --arch arm64 -Xswiftc -Xfrontend -Xswiftc -stats-output-dir -Xswiftc -Xfrontend -Xswiftc .stats -Xswiftc -strict-concurrency=complete -Xswiftc -enable-upcoming-feature -Xswiftc StrictConcurrency -Xswiftc -enable-upcoming-feature -Xswiftc DisableOutwardActorInference -Xswiftc -enable-upcoming-feature -Xswiftc GlobalActorIsolatedTypesUsability -Xswiftc -enable-upcoming-feature -Xswiftc InferSendableFromCaptures
Build Log
========================================
RunAll
========================================
Builder version: 4.61.0
Interrupt handler set up.
========================================
Checkout
========================================
Clone URL: https://github.com/omaralbeik/M3UKit.git
Reference: main
Initialized empty Git repository in /Users/admin/builder/spi-builder-workspace/.git/
From https://github.com/omaralbeik/M3UKit
* branch main -> FETCH_HEAD
* [new branch] main -> origin/main
HEAD is now at b1bcb66 Update seasonEpisodeRegex to support different kinds of season&episode matching (#24)
Cloned https://github.com/omaralbeik/M3UKit.git
Revision (git rev-parse @):
b1bcb665c0f06d81ed40493955fa867fd1c730c5
SUCCESS checkout https://github.com/omaralbeik/M3UKit.git at main
========================================
ResolveProductDependencies
========================================
Resolving dependencies ...
{
"identity": ".resolve-product-dependencies",
"name": "resolve-dependencies",
"url": "/Users/admin/builder/spi-builder-workspace/.resolve-product-dependencies",
"version": "unspecified",
"path": "/Users/admin/builder/spi-builder-workspace/.resolve-product-dependencies",
"dependencies": [
{
"identity": "m3ukit",
"name": "M3UKit",
"url": "https://github.com/omaralbeik/M3UKit.git",
"version": "unspecified",
"path": "/Users/admin/builder/spi-builder-workspace/.resolve-product-dependencies/.build/checkouts/M3UKit",
"dependencies": [
]
}
]
}
Fetching https://github.com/omaralbeik/M3UKit.git
[1/323] Fetching m3ukit
Fetched https://github.com/omaralbeik/M3UKit.git from cache (0.70s)
Creating working copy for https://github.com/omaralbeik/M3UKit.git
Working copy of https://github.com/omaralbeik/M3UKit.git resolved at main (b1bcb66)
warning: '.resolve-product-dependencies': dependency 'm3ukit' is not used by any target
Found 0 product dependencies
========================================
Build
========================================
Selected platform: macosSpm
Swift version: 6.1
Building package at path: $PWD
https://github.com/omaralbeik/M3UKit.git
https://github.com/omaralbeik/M3UKit.git
{
"dependencies" : [
],
"manifest_display_name" : "M3UKit",
"name" : "M3UKit",
"path" : "/Users/admin/builder/spi-builder-workspace",
"platforms" : [
],
"products" : [
{
"name" : "M3UKit",
"targets" : [
"M3UKit"
],
"type" : {
"library" : [
"automatic"
]
}
}
],
"targets" : [
{
"c99name" : "M3UKitTests",
"module_type" : "SwiftTarget",
"name" : "M3UKitTests",
"path" : "Tests/M3UKitTests",
"resources" : [
{
"path" : "/Users/admin/builder/spi-builder-workspace/Tests/M3UKitTests/Resources/invalid.m3u",
"rule" : {
"process" : {
}
}
},
{
"path" : "/Users/admin/builder/spi-builder-workspace/Tests/M3UKitTests/Resources/text.txt",
"rule" : {
"process" : {
}
}
},
{
"path" : "/Users/admin/builder/spi-builder-workspace/Tests/M3UKitTests/Resources/valid.m3u",
"rule" : {
"process" : {
}
}
}
],
"sources" : [
"PlaylistParserTests.swift",
"PlaylistTests.swift"
],
"target_dependencies" : [
"M3UKit"
],
"type" : "test"
},
{
"c99name" : "M3UKit",
"module_type" : "SwiftTarget",
"name" : "M3UKit",
"path" : "Sources/M3UKit",
"product_memberships" : [
"M3UKit"
],
"sources" : [
"Playlist.swift",
"PlaylistParser.swift",
"PlaylistSource.swift",
"RegularExpression.swift"
],
"type" : "library"
}
],
"tools_version" : "5.5"
}
Running build ...
env DEVELOPER_DIR=/Applications/Xcode-16.3.0.app xcrun swift build --arch arm64 -Xswiftc -Xfrontend -Xswiftc -stats-output-dir -Xswiftc -Xfrontend -Xswiftc .stats -Xswiftc -strict-concurrency=complete -Xswiftc -enable-upcoming-feature -Xswiftc StrictConcurrency -Xswiftc -enable-upcoming-feature -Xswiftc DisableOutwardActorInference -Xswiftc -enable-upcoming-feature -Xswiftc GlobalActorIsolatedTypesUsability -Xswiftc -enable-upcoming-feature -Xswiftc InferSendableFromCaptures
Building for debugging...
[0/2] Write sources
[1/2] Write swift-version-2F0A5646E1D333AE.txt
[3/7] Compiling M3UKit RegularExpression.swift
[4/7] Compiling M3UKit PlaylistSource.swift
[5/7] Compiling M3UKit Playlist.swift
[6/7] Emitting module M3UKit
/Users/admin/builder/spi-builder-workspace/Sources/M3UKit/PlaylistParser.swift:38:23: warning: static property 'removeSeriesInfoFromText' is not concurrency-safe because non-'Sendable' type 'PlaylistParser.Options' may have shared mutable state; this is an error in the Swift 6 language mode
28 |
29 | /// Playlist parser options
30 | public struct Options: OptionSet {
| `- note: consider making struct 'Options' conform to the 'Sendable' protocol
31 | public let rawValue: Int
32 |
:
36 |
37 | /// Remove season number and episode number "S--E--" from the name of media.
38 | public static let removeSeriesInfoFromText = Options(rawValue: 1 << 0)
| |- warning: static property 'removeSeriesInfoFromText' is not concurrency-safe because non-'Sendable' type 'PlaylistParser.Options' may have shared mutable state; this is an error in the Swift 6 language mode
| |- note: add '@MainActor' to make static property 'removeSeriesInfoFromText' part of global actor 'MainActor'
| `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
39 |
40 | /// Extract id from the URL (usually last path component removing the extension)
/Users/admin/builder/spi-builder-workspace/Sources/M3UKit/PlaylistParser.swift:41:23: warning: static property 'extractIdFromURL' is not concurrency-safe because non-'Sendable' type 'PlaylistParser.Options' may have shared mutable state; this is an error in the Swift 6 language mode
28 |
29 | /// Playlist parser options
30 | public struct Options: OptionSet {
| `- note: consider making struct 'Options' conform to the 'Sendable' protocol
31 | public let rawValue: Int
32 |
:
39 |
40 | /// Extract id from the URL (usually last path component removing the extension)
41 | public static let extractIdFromURL = Options(rawValue: 1 << 1)
| |- warning: static property 'extractIdFromURL' is not concurrency-safe because non-'Sendable' type 'PlaylistParser.Options' may have shared mutable state; this is an error in the Swift 6 language mode
| |- note: add '@MainActor' to make static property 'extractIdFromURL' part of global actor 'MainActor'
| `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
42 |
43 | /// All available options.
/Users/admin/builder/spi-builder-workspace/Sources/M3UKit/PlaylistParser.swift:44:23: warning: static property 'all' is not concurrency-safe because non-'Sendable' type 'PlaylistParser.Options' may have shared mutable state; this is an error in the Swift 6 language mode
28 |
29 | /// Playlist parser options
30 | public struct Options: OptionSet {
| `- note: consider making struct 'Options' conform to the 'Sendable' protocol
31 | public let rawValue: Int
32 |
:
42 |
43 | /// All available options.
44 | public static let all: Options = [
| |- warning: static property 'all' is not concurrency-safe because non-'Sendable' type 'PlaylistParser.Options' may have shared mutable state; this is an error in the Swift 6 language mode
| |- note: add '@MainActor' to make static property 'all' part of global actor 'MainActor'
| `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
45 | .removeSeriesInfoFromText,
46 | .extractIdFromURL,
[7/7] Compiling M3UKit PlaylistParser.swift
/Users/admin/builder/spi-builder-workspace/Sources/M3UKit/PlaylistParser.swift:38:23: warning: static property 'removeSeriesInfoFromText' is not concurrency-safe because non-'Sendable' type 'PlaylistParser.Options' may have shared mutable state; this is an error in the Swift 6 language mode
28 |
29 | /// Playlist parser options
30 | public struct Options: OptionSet {
| `- note: consider making struct 'Options' conform to the 'Sendable' protocol
31 | public let rawValue: Int
32 |
:
36 |
37 | /// Remove season number and episode number "S--E--" from the name of media.
38 | public static let removeSeriesInfoFromText = Options(rawValue: 1 << 0)
| |- warning: static property 'removeSeriesInfoFromText' is not concurrency-safe because non-'Sendable' type 'PlaylistParser.Options' may have shared mutable state; this is an error in the Swift 6 language mode
| |- note: add '@MainActor' to make static property 'removeSeriesInfoFromText' part of global actor 'MainActor'
| `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
39 |
40 | /// Extract id from the URL (usually last path component removing the extension)
/Users/admin/builder/spi-builder-workspace/Sources/M3UKit/PlaylistParser.swift:41:23: warning: static property 'extractIdFromURL' is not concurrency-safe because non-'Sendable' type 'PlaylistParser.Options' may have shared mutable state; this is an error in the Swift 6 language mode
28 |
29 | /// Playlist parser options
30 | public struct Options: OptionSet {
| `- note: consider making struct 'Options' conform to the 'Sendable' protocol
31 | public let rawValue: Int
32 |
:
39 |
40 | /// Extract id from the URL (usually last path component removing the extension)
41 | public static let extractIdFromURL = Options(rawValue: 1 << 1)
| |- warning: static property 'extractIdFromURL' is not concurrency-safe because non-'Sendable' type 'PlaylistParser.Options' may have shared mutable state; this is an error in the Swift 6 language mode
| |- note: add '@MainActor' to make static property 'extractIdFromURL' part of global actor 'MainActor'
| `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
42 |
43 | /// All available options.
/Users/admin/builder/spi-builder-workspace/Sources/M3UKit/PlaylistParser.swift:44:23: warning: static property 'all' is not concurrency-safe because non-'Sendable' type 'PlaylistParser.Options' may have shared mutable state; this is an error in the Swift 6 language mode
28 |
29 | /// Playlist parser options
30 | public struct Options: OptionSet {
| `- note: consider making struct 'Options' conform to the 'Sendable' protocol
31 | public let rawValue: Int
32 |
:
42 |
43 | /// All available options.
44 | public static let all: Options = [
| |- warning: static property 'all' is not concurrency-safe because non-'Sendable' type 'PlaylistParser.Options' may have shared mutable state; this is an error in the Swift 6 language mode
| |- note: add '@MainActor' to make static property 'all' part of global actor 'MainActor'
| `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
45 | .removeSeriesInfoFromText,
46 | .extractIdFromURL,
/Users/admin/builder/spi-builder-workspace/Sources/M3UKit/PlaylistParser.swift:172:28: warning: capture of 'self' with non-sendable type 'PlaylistParser' in a '@Sendable' closure
25 |
26 | /// A class to parse `Playlist` objects from a `PlaylistSource`.
27 | public final class PlaylistParser {
| `- note: class 'PlaylistParser' does not conform to the 'Sendable' protocol
28 |
29 | /// Playlist parser options
:
170 | processingQueue.async {
171 | do {
172 | let playlist = try self.parse(input)
| `- warning: capture of 'self' with non-sendable type 'PlaylistParser' in a '@Sendable' closure
173 | callbackQueue.async {
174 | completion(.success(playlist))
/Users/admin/builder/spi-builder-workspace/Sources/M3UKit/PlaylistParser.swift:172:39: warning: capture of 'input' with non-sendable type 'any PlaylistSource' in a '@Sendable' closure
170 | processingQueue.async {
171 | do {
172 | let playlist = try self.parse(input)
| `- warning: capture of 'input' with non-sendable type 'any PlaylistSource' in a '@Sendable' closure
173 | callbackQueue.async {
174 | completion(.success(playlist))
/Users/admin/builder/spi-builder-workspace/Sources/M3UKit/PlaylistSource.swift:27:17: note: protocol 'PlaylistSource' does not conform to the 'Sendable' protocol
25 |
26 | /// Playlist source.
27 | public protocol PlaylistSource {
| `- note: protocol 'PlaylistSource' does not conform to the 'Sendable' protocol
28 | /// Playlist contents raw string.
29 | var rawString: String? { get }
/Users/admin/builder/spi-builder-workspace/Sources/M3UKit/PlaylistParser.swift:174:11: warning: capture of 'completion' with non-sendable type '(Result<Playlist, any Error>) -> Void' in a '@Sendable' closure
172 | let playlist = try self.parse(input)
173 | callbackQueue.async {
174 | completion(.success(playlist))
| |- warning: capture of 'completion' with non-sendable type '(Result<Playlist, any Error>) -> Void' in a '@Sendable' closure
| `- note: a function type must be marked '@Sendable' to conform to 'Sendable'
175 | }
176 | } catch {
/Users/admin/builder/spi-builder-workspace/Sources/M3UKit/PlaylistParser.swift:174:11: warning: capture of 'completion' with non-sendable type '(Result<Playlist, any Error>) -> Void' in a '@Sendable' closure
172 | let playlist = try self.parse(input)
173 | callbackQueue.async {
174 | completion(.success(playlist))
| |- warning: capture of 'completion' with non-sendable type '(Result<Playlist, any Error>) -> Void' in a '@Sendable' closure
| `- note: a function type must be marked '@Sendable' to conform to 'Sendable'
175 | }
176 | } catch {
/Users/admin/builder/spi-builder-workspace/Sources/M3UKit/PlaylistParser.swift:174:31: warning: capture of 'playlist' with non-sendable type 'Playlist' in a '@Sendable' closure
172 | let playlist = try self.parse(input)
173 | callbackQueue.async {
174 | completion(.success(playlist))
| `- warning: capture of 'playlist' with non-sendable type 'Playlist' in a '@Sendable' closure
175 | }
176 | } catch {
/Users/admin/builder/spi-builder-workspace/Sources/M3UKit/Playlist.swift:27:15: note: consider making struct 'Playlist' conform to the 'Sendable' protocol
25 |
26 | /// Object representing a playlist containing media items.
27 | public struct Playlist: Equatable, Hashable, Codable {
| `- note: consider making struct 'Playlist' conform to the 'Sendable' protocol
28 |
29 | /// Object representing a media.
/Users/admin/builder/spi-builder-workspace/Sources/M3UKit/PlaylistParser.swift:178:11: warning: capture of 'completion' with non-sendable type '(Result<Playlist, any Error>) -> Void' in a '@Sendable' closure
176 | } catch {
177 | callbackQueue.async {
178 | completion(.failure(error))
| |- warning: capture of 'completion' with non-sendable type '(Result<Playlist, any Error>) -> Void' in a '@Sendable' closure
| `- note: a function type must be marked '@Sendable' to conform to 'Sendable'
179 | }
180 | }
/Users/admin/builder/spi-builder-workspace/Sources/M3UKit/PlaylistParser.swift:193:26: warning: type 'Playlist' does not conform to the 'Sendable' protocol; this is an error in the Swift 6 language mode
191 | priority: TaskPriority = .background
192 | ) async throws -> Playlist {
193 | let processingTask = Task(priority: priority) {
| `- warning: type 'Playlist' does not conform to the 'Sendable' protocol; this is an error in the Swift 6 language mode
194 | try self.parse(input)
195 | }
/Users/admin/builder/spi-builder-workspace/Sources/M3UKit/Playlist.swift:27:15: note: consider making struct 'Playlist' conform to the 'Sendable' protocol
25 |
26 | /// Object representing a playlist containing media items.
27 | public struct Playlist: Equatable, Hashable, Codable {
| `- note: consider making struct 'Playlist' conform to the 'Sendable' protocol
28 |
29 | /// Object representing a media.
/Users/admin/builder/spi-builder-workspace/Sources/M3UKit/PlaylistParser.swift:193:26: warning: type 'Playlist' does not conform to the 'Sendable' protocol; this is an error in the Swift 6 language mode
191 | priority: TaskPriority = .background
192 | ) async throws -> Playlist {
193 | let processingTask = Task(priority: priority) {
| `- warning: type 'Playlist' does not conform to the 'Sendable' protocol; this is an error in the Swift 6 language mode
194 | try self.parse(input)
195 | }
/Users/admin/builder/spi-builder-workspace/Sources/M3UKit/Playlist.swift:27:15: note: consider making struct 'Playlist' conform to the 'Sendable' protocol
25 |
26 | /// Object representing a playlist containing media items.
27 | public struct Playlist: Equatable, Hashable, Codable {
| `- note: consider making struct 'Playlist' conform to the 'Sendable' protocol
28 |
29 | /// Object representing a media.
/Users/admin/builder/spi-builder-workspace/Sources/M3UKit/PlaylistParser.swift:193:9: warning: type 'Playlist' does not conform to the 'Sendable' protocol; this is an error in the Swift 6 language mode
191 | priority: TaskPriority = .background
192 | ) async throws -> Playlist {
193 | let processingTask = Task(priority: priority) {
| `- warning: type 'Playlist' does not conform to the 'Sendable' protocol; this is an error in the Swift 6 language mode
194 | try self.parse(input)
195 | }
/Users/admin/builder/spi-builder-workspace/Sources/M3UKit/Playlist.swift:27:15: note: consider making struct 'Playlist' conform to the 'Sendable' protocol
25 |
26 | /// Object representing a playlist containing media items.
27 | public struct Playlist: Equatable, Hashable, Codable {
| `- note: consider making struct 'Playlist' conform to the 'Sendable' protocol
28 |
29 | /// Object representing a media.
/Users/admin/builder/spi-builder-workspace/Sources/M3UKit/PlaylistParser.swift:196:37: warning: type 'Playlist' does not conform to the 'Sendable' protocol; this is an error in the Swift 6 language mode
194 | try self.parse(input)
195 | }
196 | return try await processingTask.value
| `- warning: type 'Playlist' does not conform to the 'Sendable' protocol; this is an error in the Swift 6 language mode
197 | }
198 |
/Users/admin/builder/spi-builder-workspace/Sources/M3UKit/Playlist.swift:27:15: note: consider making struct 'Playlist' conform to the 'Sendable' protocol
25 |
26 | /// Object representing a playlist containing media items.
27 | public struct Playlist: Equatable, Hashable, Codable {
| `- note: consider making struct 'Playlist' conform to the 'Sendable' protocol
28 |
29 | /// Object representing a media.
/Users/admin/builder/spi-builder-workspace/Sources/M3UKit/PlaylistParser.swift:193:51: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
191 | priority: TaskPriority = .background
192 | ) async throws -> Playlist {
193 | let processingTask = Task(priority: priority) {
| `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
194 | try self.parse(input)
| `- note: closure captures 'self' which is accessible to code in the current task
195 | }
196 | return try await processingTask.value
Build complete! (4.21s)
Build complete.
{
"dependencies" : [
],
"manifest_display_name" : "M3UKit",
"name" : "M3UKit",
"path" : "/Users/admin/builder/spi-builder-workspace",
"platforms" : [
],
"products" : [
{
"name" : "M3UKit",
"targets" : [
"M3UKit"
],
"type" : {
"library" : [
"automatic"
]
}
}
],
"targets" : [
{
"c99name" : "M3UKitTests",
"module_type" : "SwiftTarget",
"name" : "M3UKitTests",
"path" : "Tests/M3UKitTests",
"resources" : [
{
"path" : "/Users/admin/builder/spi-builder-workspace/Tests/M3UKitTests/Resources/invalid.m3u",
"rule" : {
"process" : {
}
}
},
{
"path" : "/Users/admin/builder/spi-builder-workspace/Tests/M3UKitTests/Resources/text.txt",
"rule" : {
"process" : {
}
}
},
{
"path" : "/Users/admin/builder/spi-builder-workspace/Tests/M3UKitTests/Resources/valid.m3u",
"rule" : {
"process" : {
}
}
}
],
"sources" : [
"PlaylistParserTests.swift",
"PlaylistTests.swift"
],
"target_dependencies" : [
"M3UKit"
],
"type" : "test"
},
{
"c99name" : "M3UKit",
"module_type" : "SwiftTarget",
"name" : "M3UKit",
"path" : "Sources/M3UKit",
"product_memberships" : [
"M3UKit"
],
"sources" : [
"Playlist.swift",
"PlaylistParser.swift",
"PlaylistSource.swift",
"RegularExpression.swift"
],
"type" : "library"
}
],
"tools_version" : "5.5"
}
Done.