The Swift Package Index logo.Swift Package Index

Build Information

Successful build of SwiftSheets, reference main (1148d9), with Swift 6.3 for Linux on 29 Sep 2026 07:57:36 UTC.

Swift 6 data race errors: 0

Build Command

bash -c docker run --pull=always --rm -v "checkouts-54344845-0":/host -w "$PWD" -e JAVA_HOME="/root/.sdkman/candidates/java/current" -e SPI_BUILD="1" -e SPI_PROCESSING="1" registry.gitlab.com/saguaro1/spi-images:basic-6.3-latest swift build --triple x86_64-unknown-linux-gnu 2>&1

Build Log

========================================
RunAll
========================================
Builder version: 5.1.0
Interrupt handler set up.
========================================
Checkout
========================================
Clone URL: https://github.com/nanbu/SwiftSheets.git
Reference: main
Initialized empty Git repository in /host/spi-builder-workspace/.git/
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint: 	git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: 	git branch -m <name>
From https://github.com/nanbu/SwiftSheets
 * branch            main       -> FETCH_HEAD
 * [new branch]      main       -> origin/main
HEAD is now at 1148d95 fix: preserve table filters and local names in 1.1.1
Cloned https://github.com/nanbu/SwiftSheets.git
Revision (git rev-parse @):
1148d95ab09be268bff1d382be467cf14d1ac395
SPI manifest file found: $PWD/.spi.yml
SUCCESS checkout https://github.com/nanbu/SwiftSheets.git at main
========================================
Build
========================================
Selected platform:         linux
Swift version:             6.3
Building package at path:  $PWD
https://github.com/nanbu/SwiftSheets.git
Running build ...
bash -c docker run --pull=always --rm -v "checkouts-54344845-0":/host -w "$PWD" -e JAVA_HOME="/root/.sdkman/candidates/java/current" -e SPI_BUILD="1" -e SPI_PROCESSING="1" registry.gitlab.com/saguaro1/spi-images:basic-6.3-latest swift build --triple x86_64-unknown-linux-gnu 2>&1
basic-6.3-latest: Pulling from saguaro1/spi-images
Digest: sha256:c577f8f8f4df4f423827bf5e7d96027716bb7030ef75b2fd4a15f7fb0043ce6d
Status: Image is up to date for registry.gitlab.com/saguaro1/spi-images:basic-6.3-latest
Building for debugging...
[0/15] Copying registry.json
[1/15] Copying functions.json
[2/15] Copying fonts.json
[3/15] Copying empty.numbers
[3/15] Copying constants.json
[5/15] Copying schema.json
[6/15] Write sources
[14/15] Write swift-version-24593BA9C3E375BF.txt
[16/65] Emitting module SheetCore
[17/72] Compiling SheetCore AtomicFileTarget.swift
/host/spi-builder-workspace/Sources/SheetCore/Utils/XMLScanner.swift:58:13: warning: variable 'keepFrom' was written to, but never read
 56 |         var textHasSpecial = false            // the run holds an entity or a carriage return
 57 |         /// Where the next piece has to start: the earliest byte still needed.
 58 |         var keepFrom = -1
    |             `- warning: variable 'keepFrom' was written to, but never read
 59 |         func stopHere(_ at: Int) -> Int {
 60 |             keepFrom = at
[18/72] Compiling SheetCore CivilDate.swift
/host/spi-builder-workspace/Sources/SheetCore/Utils/XMLScanner.swift:58:13: warning: variable 'keepFrom' was written to, but never read
 56 |         var textHasSpecial = false            // the run holds an entity or a carriage return
 57 |         /// Where the next piece has to start: the earliest byte still needed.
 58 |         var keepFrom = -1
    |             `- warning: variable 'keepFrom' was written to, but never read
 59 |         func stopHere(_ at: Int) -> Int {
 60 |             keepFrom = at
[19/72] Compiling SheetCore SHA512.swift
/host/spi-builder-workspace/Sources/SheetCore/Utils/XMLScanner.swift:58:13: warning: variable 'keepFrom' was written to, but never read
 56 |         var textHasSpecial = false            // the run holds an entity or a carriage return
 57 |         /// Where the next piece has to start: the earliest byte still needed.
 58 |         var keepFrom = -1
    |             `- warning: variable 'keepFrom' was written to, but never read
 59 |         func stopHere(_ at: Int) -> Int {
 60 |             keepFrom = at
[20/72] Compiling SheetCore TextSpill.swift
/host/spi-builder-workspace/Sources/SheetCore/Utils/XMLScanner.swift:58:13: warning: variable 'keepFrom' was written to, but never read
 56 |         var textHasSpecial = false            // the run holds an entity or a carriage return
 57 |         /// Where the next piece has to start: the earliest byte still needed.
 58 |         var keepFrom = -1
    |             `- warning: variable 'keepFrom' was written to, but never read
 59 |         func stopHere(_ at: Int) -> Int {
 60 |             keepFrom = at
[21/72] Compiling SheetCore Units.swift
/host/spi-builder-workspace/Sources/SheetCore/Utils/XMLScanner.swift:58:13: warning: variable 'keepFrom' was written to, but never read
 56 |         var textHasSpecial = false            // the run holds an entity or a carriage return
 57 |         /// Where the next piece has to start: the earliest byte still needed.
 58 |         var keepFrom = -1
    |             `- warning: variable 'keepFrom' was written to, but never read
 59 |         func stopHere(_ at: Int) -> Int {
 60 |             keepFrom = at
[22/72] Compiling SheetCore XML.swift
/host/spi-builder-workspace/Sources/SheetCore/Utils/XMLScanner.swift:58:13: warning: variable 'keepFrom' was written to, but never read
 56 |         var textHasSpecial = false            // the run holds an entity or a carriage return
 57 |         /// Where the next piece has to start: the earliest byte still needed.
 58 |         var keepFrom = -1
    |             `- warning: variable 'keepFrom' was written to, but never read
 59 |         func stopHere(_ at: Int) -> Int {
 60 |             keepFrom = at
[23/72] Compiling SheetCore XMLScanner.swift
/host/spi-builder-workspace/Sources/SheetCore/Utils/XMLScanner.swift:58:13: warning: variable 'keepFrom' was written to, but never read
 56 |         var textHasSpecial = false            // the run holds an entity or a carriage return
 57 |         /// Where the next piece has to start: the earliest byte still needed.
 58 |         var keepFrom = -1
    |             `- warning: variable 'keepFrom' was written to, but never read
 59 |         func stopHere(_ at: Int) -> Int {
 60 |             keepFrom = at
[24/72] Compiling SheetCore FormulaFunctionNames.swift
[25/72] Compiling SheetCore FormulaParser.swift
[26/72] Compiling SheetCore Autofit.swift
[27/72] Compiling SheetCore Cell.swift
[28/72] Compiling SheetCore CellRef.swift
[29/72] Compiling SheetCore CellValue.swift
[30/72] Compiling SheetCore Chart.swift
[31/72] Compiling SheetCore CRC32.swift
/host/spi-builder-workspace/Sources/SheetCore/Container/ZipWriter.swift:26:29: warning: result of call to 'createFile(atPath:contents:attributes:)' is unused [#no-usage]
 24 |     private(set) var count = 0
 25 |     init(url: URL) throws {
 26 |         FileManager.default.createFile(atPath: url.path, contents: nil)
    |                             `- warning: result of call to 'createFile(atPath:contents:attributes:)' is unused [#no-usage]
 27 |         guard let h = FileHandle(forWritingAtPath: url.path) else {
 28 |             throw SheetError.ioFailure(detail: "cannot open \(url.lastPathComponent) for writing")
[32/72] Compiling SheetCore Deflate.swift
/host/spi-builder-workspace/Sources/SheetCore/Container/ZipWriter.swift:26:29: warning: result of call to 'createFile(atPath:contents:attributes:)' is unused [#no-usage]
 24 |     private(set) var count = 0
 25 |     init(url: URL) throws {
 26 |         FileManager.default.createFile(atPath: url.path, contents: nil)
    |                             `- warning: result of call to 'createFile(atPath:contents:attributes:)' is unused [#no-usage]
 27 |         guard let h = FileHandle(forWritingAtPath: url.path) else {
 28 |             throw SheetError.ioFailure(detail: "cannot open \(url.lastPathComponent) for writing")
[33/72] Compiling SheetCore Zip.swift
/host/spi-builder-workspace/Sources/SheetCore/Container/ZipWriter.swift:26:29: warning: result of call to 'createFile(atPath:contents:attributes:)' is unused [#no-usage]
 24 |     private(set) var count = 0
 25 |     init(url: URL) throws {
 26 |         FileManager.default.createFile(atPath: url.path, contents: nil)
    |                             `- warning: result of call to 'createFile(atPath:contents:attributes:)' is unused [#no-usage]
 27 |         guard let h = FileHandle(forWritingAtPath: url.path) else {
 28 |             throw SheetError.ioFailure(detail: "cannot open \(url.lastPathComponent) for writing")
[34/72] Compiling SheetCore ZipInspection.swift
/host/spi-builder-workspace/Sources/SheetCore/Container/ZipWriter.swift:26:29: warning: result of call to 'createFile(atPath:contents:attributes:)' is unused [#no-usage]
 24 |     private(set) var count = 0
 25 |     init(url: URL) throws {
 26 |         FileManager.default.createFile(atPath: url.path, contents: nil)
    |                             `- warning: result of call to 'createFile(atPath:contents:attributes:)' is unused [#no-usage]
 27 |         guard let h = FileHandle(forWritingAtPath: url.path) else {
 28 |             throw SheetError.ioFailure(detail: "cannot open \(url.lastPathComponent) for writing")
[35/72] Compiling SheetCore ZipWriter.swift
/host/spi-builder-workspace/Sources/SheetCore/Container/ZipWriter.swift:26:29: warning: result of call to 'createFile(atPath:contents:attributes:)' is unused [#no-usage]
 24 |     private(set) var count = 0
 25 |     init(url: URL) throws {
 26 |         FileManager.default.createFile(atPath: url.path, contents: nil)
    |                             `- warning: result of call to 'createFile(atPath:contents:attributes:)' is unused [#no-usage]
 27 |         guard let h = FileHandle(forWritingAtPath: url.path) else {
 28 |             throw SheetError.ioFailure(detail: "cannot open \(url.lastPathComponent) for writing")
[36/72] Compiling SheetCore Primitives.swift
/host/spi-builder-workspace/Sources/SheetCore/Container/ZipWriter.swift:26:29: warning: result of call to 'createFile(atPath:contents:attributes:)' is unused [#no-usage]
 24 |     private(set) var count = 0
 25 |     init(url: URL) throws {
 26 |         FileManager.default.createFile(atPath: url.path, contents: nil)
    |                             `- warning: result of call to 'createFile(atPath:contents:attributes:)' is unused [#no-usage]
 27 |         guard let h = FileHandle(forWritingAtPath: url.path) else {
 28 |             throw SheetError.ioFailure(detail: "cannot open \(url.lastPathComponent) for writing")
[37/72] Compiling SheetCore FormulaExpr.swift
/host/spi-builder-workspace/Sources/SheetCore/Container/ZipWriter.swift:26:29: warning: result of call to 'createFile(atPath:contents:attributes:)' is unused [#no-usage]
 24 |     private(set) var count = 0
 25 |     init(url: URL) throws {
 26 |         FileManager.default.createFile(atPath: url.path, contents: nil)
    |                             `- warning: result of call to 'createFile(atPath:contents:attributes:)' is unused [#no-usage]
 27 |         guard let h = FileHandle(forWritingAtPath: url.path) else {
 28 |             throw SheetError.ioFailure(detail: "cannot open \(url.lastPathComponent) for writing")
[38/72] Compiling SheetCore Table.swift
[39/72] Compiling SheetCore Workbook.swift
[40/72] Compiling SheetCore DifferentialStyle.swift
[41/72] Compiling SheetCore Fill.swift
[42/72] Compiling SheetCore Styles.swift
[43/72] Compiling SheetCore Theme.swift
[44/72] Compiling SheetCore SwiftSheetsInfo.swift
[45/72] Compiling SheetCore PreservationSummary.swift
[46/72] Compiling SheetCore SheetError.swift
[47/72] Compiling SheetCore SheetFormat.swift
[48/72] Compiling SheetCore StreamingReader.swift
[49/72] Compiling SheetCore StreamingRows.swift
[50/72] Compiling SheetCore StreamingWriter.swift
[51/72] Compiling SheetCore ByteSource.swift
[52/72] Compiling SheetCore RangeView.swift
[53/72] Compiling SheetCore Shape.swift
[54/72] Compiling SheetCore Sheet.swift
[55/72] Compiling SheetCore SheetContentState.swift
[56/72] Compiling SheetCore SheetImage.swift
[57/72] Compiling SheetCore Sparkline.swift
[58/72] Compiling SheetCore StructuredTable.swift
[59/72] Compiling SheetCore CSVOptions.swift
/host/spi-builder-workspace/Sources/SheetCore/Codec/PreservationStore.swift:132:42: warning: 'where' only applies to the second pattern match in this 'case'
130 |             case _ where path.hasPrefix("xl/theme/"): return themeRead ? nil : .theme
131 |             case _ where path.hasPrefix("xl/slicers/") || path.hasPrefix("xl/slicerCaches/"): return .slicer
132 |             case "xl/connections.xml", _ where path.hasPrefix("xl/queryTables/") || path.hasPrefix("xl/model/"): return .dataConnection
    |                  |                     | `- warning: 'where' only applies to the second pattern match in this 'case'
    |                  |                     `- note: disambiguate by adding a line break between them if this is desired
    |                  `- note: duplicate the 'where' on both patterns to check both patterns
133 |             case _ where path.hasPrefix("xl/threadedComments/") || path.hasPrefix("xl/persons/"): return nil   // the threads are the model's (B.80)
134 |             case _ where path.hasPrefix("xl/comments"): return nil                          // the notes are the model's
[60/72] Compiling SheetCore CellBudget.swift
/host/spi-builder-workspace/Sources/SheetCore/Codec/PreservationStore.swift:132:42: warning: 'where' only applies to the second pattern match in this 'case'
130 |             case _ where path.hasPrefix("xl/theme/"): return themeRead ? nil : .theme
131 |             case _ where path.hasPrefix("xl/slicers/") || path.hasPrefix("xl/slicerCaches/"): return .slicer
132 |             case "xl/connections.xml", _ where path.hasPrefix("xl/queryTables/") || path.hasPrefix("xl/model/"): return .dataConnection
    |                  |                     | `- warning: 'where' only applies to the second pattern match in this 'case'
    |                  |                     `- note: disambiguate by adding a line break between them if this is desired
    |                  `- note: duplicate the 'where' on both patterns to check both patterns
133 |             case _ where path.hasPrefix("xl/threadedComments/") || path.hasPrefix("xl/persons/"): return nil   // the threads are the model's (B.80)
134 |             case _ where path.hasPrefix("xl/comments"): return nil                          // the notes are the model's
[61/72] Compiling SheetCore Codec.swift
/host/spi-builder-workspace/Sources/SheetCore/Codec/PreservationStore.swift:132:42: warning: 'where' only applies to the second pattern match in this 'case'
130 |             case _ where path.hasPrefix("xl/theme/"): return themeRead ? nil : .theme
131 |             case _ where path.hasPrefix("xl/slicers/") || path.hasPrefix("xl/slicerCaches/"): return .slicer
132 |             case "xl/connections.xml", _ where path.hasPrefix("xl/queryTables/") || path.hasPrefix("xl/model/"): return .dataConnection
    |                  |                     | `- warning: 'where' only applies to the second pattern match in this 'case'
    |                  |                     `- note: disambiguate by adding a line break between them if this is desired
    |                  `- note: duplicate the 'where' on both patterns to check both patterns
133 |             case _ where path.hasPrefix("xl/threadedComments/") || path.hasPrefix("xl/persons/"): return nil   // the threads are the model's (B.80)
134 |             case _ where path.hasPrefix("xl/comments"): return nil                          // the notes are the model's
[62/72] Compiling SheetCore CodecSet.swift
/host/spi-builder-workspace/Sources/SheetCore/Codec/PreservationStore.swift:132:42: warning: 'where' only applies to the second pattern match in this 'case'
130 |             case _ where path.hasPrefix("xl/theme/"): return themeRead ? nil : .theme
131 |             case _ where path.hasPrefix("xl/slicers/") || path.hasPrefix("xl/slicerCaches/"): return .slicer
132 |             case "xl/connections.xml", _ where path.hasPrefix("xl/queryTables/") || path.hasPrefix("xl/model/"): return .dataConnection
    |                  |                     | `- warning: 'where' only applies to the second pattern match in this 'case'
    |                  |                     `- note: disambiguate by adding a line break between them if this is desired
    |                  `- note: duplicate the 'where' on both patterns to check both patterns
133 |             case _ where path.hasPrefix("xl/threadedComments/") || path.hasPrefix("xl/persons/"): return nil   // the threads are the model's (B.80)
134 |             case _ where path.hasPrefix("xl/comments"): return nil                          // the notes are the model's
[63/72] Compiling SheetCore EncryptedInput.swift
/host/spi-builder-workspace/Sources/SheetCore/Codec/PreservationStore.swift:132:42: warning: 'where' only applies to the second pattern match in this 'case'
130 |             case _ where path.hasPrefix("xl/theme/"): return themeRead ? nil : .theme
131 |             case _ where path.hasPrefix("xl/slicers/") || path.hasPrefix("xl/slicerCaches/"): return .slicer
132 |             case "xl/connections.xml", _ where path.hasPrefix("xl/queryTables/") || path.hasPrefix("xl/model/"): return .dataConnection
    |                  |                     | `- warning: 'where' only applies to the second pattern match in this 'case'
    |                  |                     `- note: disambiguate by adding a line break between them if this is desired
    |                  `- note: duplicate the 'where' on both patterns to check both patterns
133 |             case _ where path.hasPrefix("xl/threadedComments/") || path.hasPrefix("xl/persons/"): return nil   // the threads are the model's (B.80)
134 |             case _ where path.hasPrefix("xl/comments"): return nil                          // the notes are the model's
[64/72] Compiling SheetCore Inspection.swift
/host/spi-builder-workspace/Sources/SheetCore/Codec/PreservationStore.swift:132:42: warning: 'where' only applies to the second pattern match in this 'case'
130 |             case _ where path.hasPrefix("xl/theme/"): return themeRead ? nil : .theme
131 |             case _ where path.hasPrefix("xl/slicers/") || path.hasPrefix("xl/slicerCaches/"): return .slicer
132 |             case "xl/connections.xml", _ where path.hasPrefix("xl/queryTables/") || path.hasPrefix("xl/model/"): return .dataConnection
    |                  |                     | `- warning: 'where' only applies to the second pattern match in this 'case'
    |                  |                     `- note: disambiguate by adding a line break between them if this is desired
    |                  `- note: duplicate the 'where' on both patterns to check both patterns
133 |             case _ where path.hasPrefix("xl/threadedComments/") || path.hasPrefix("xl/persons/"): return nil   // the threads are the model's (B.80)
134 |             case _ where path.hasPrefix("xl/comments"): return nil                          // the notes are the model's
[65/72] Compiling SheetCore PreservationStore.swift
/host/spi-builder-workspace/Sources/SheetCore/Codec/PreservationStore.swift:132:42: warning: 'where' only applies to the second pattern match in this 'case'
130 |             case _ where path.hasPrefix("xl/theme/"): return themeRead ? nil : .theme
131 |             case _ where path.hasPrefix("xl/slicers/") || path.hasPrefix("xl/slicerCaches/"): return .slicer
132 |             case "xl/connections.xml", _ where path.hasPrefix("xl/queryTables/") || path.hasPrefix("xl/model/"): return .dataConnection
    |                  |                     | `- warning: 'where' only applies to the second pattern match in this 'case'
    |                  |                     `- note: disambiguate by adding a line break between them if this is desired
    |                  `- note: duplicate the 'where' on both patterns to check both patterns
133 |             case _ where path.hasPrefix("xl/threadedComments/") || path.hasPrefix("xl/persons/"): return nil   // the threads are the model's (B.80)
134 |             case _ where path.hasPrefix("xl/comments"): return nil                          // the notes are the model's
[66/72] Compiling SheetCore ConditionalFormatting.swift
[67/72] Compiling SheetCore CustomProperties.swift
[68/72] Compiling SheetCore DataValidation.swift
[69/72] Compiling SheetCore ExternalLink.swift
[70/72] Compiling SheetCore ODFFeatures.swift
[71/72] Compiling SheetCore PivotTable.swift
[72/72] Compiling SheetCore Protection.swift
[74/134] Emitting module SheetODS
[75/136] Compiling SheetXLSX ChartParts.swift
[76/136] Compiling SheetXLSX Codec+XLSX.swift
[77/136] Compiling SheetXLSX CommentParts.swift
[78/138] Emitting module SheetNumbers
[82/141] Compiling SheetCSV Codec+CSV.swift
[83/141] Compiling SheetCSV CSVStreaming.swift
/host/spi-builder-workspace/Sources/SheetCSV/CSVStreaming.swift:259:29: warning: result of call to 'createFile(atPath:contents:attributes:)' is unused [#no-usage]
257 |
258 |     package init(url: URL, options: CSVWriteOptions = CSVWriteOptions()) throws {
259 |         FileManager.default.createFile(atPath: url.path, contents: nil)
    |                             `- warning: result of call to 'createFile(atPath:contents:attributes:)' is unused [#no-usage]
260 |         guard let h = FileHandle(forWritingAtPath: url.path) else { throw SheetError.ioFailure(detail: "cannot open \(url.lastPathComponent) for writing") }
261 |         handle = h
[84/141] Emitting module SheetCSV
[85/141] Compiling SheetCSV CSVCodec.swift
[87/142] Compiling SheetNumbers NumbersRichText.swift
[88/142] Compiling SheetNumbers NumbersStreaming.swift
[89/142] Compiling SheetXLSX X14ConditionalParts.swift
[90/142] Compiling SheetXLSX XLSXCodec.swift
[91/142] Compiling SheetXLSX ThreadedCommentParts.swift
[92/142] Compiling SheetNumbers NumbersConditional.swift
[93/142] Compiling SheetNumbers NumbersUUID.swift
/host/spi-builder-workspace/Sources/SheetODS/ODSStyles.swift:263:29: warning: immutable value 'raw' was never used; consider replacing with '_' or removing it [#no-usage]
261 |     /// A named style as a *difference*: only what the style itself states, which is what a conditional format paints.
262 |     func differentialStyle(named name: String?) -> DifferentialStyle? {
263 |         guard let name, let raw = styles[name] else { return nil }
    |                             `- warning: immutable value 'raw' was never used; consider replacing with '_' or removing it [#no-usage]
264 |         var d = DifferentialStyle()
265 |         var font = DifferentialFont()
[94/142] Compiling SheetNumbers NumbersWriter.swift
/host/spi-builder-workspace/Sources/SheetODS/ODSStyles.swift:263:29: warning: immutable value 'raw' was never used; consider replacing with '_' or removing it [#no-usage]
261 |     /// A named style as a *difference*: only what the style itself states, which is what a conditional format paints.
262 |     func differentialStyle(named name: String?) -> DifferentialStyle? {
263 |         guard let name, let raw = styles[name] else { return nil }
    |                             `- warning: immutable value 'raw' was never used; consider replacing with '_' or removing it [#no-usage]
264 |         var d = DifferentialStyle()
265 |         var font = DifferentialFont()
[97/142] Compiling SheetNumbers NumbersCells.swift
/host/spi-builder-workspace/Sources/SheetNumbers/NumbersChart.swift:219:38: warning: left side of nil coalescing operator '??' has non-optional type 'String', so the right side is never used
217 |             let categoryTexts = categoryCells.map { ref -> String in
218 |                 guard let v = categories?.table.cells[ref]?.value else { return "" }
219 |                 return v.stringValue ?? String(describing: v)
    |                                      `- warning: left side of nil coalescing operator '??' has non-optional type 'String', so the right side is never used
220 |             }
221 |
[98/142] Compiling SheetNumbers NumbersChart.swift
/host/spi-builder-workspace/Sources/SheetNumbers/NumbersChart.swift:219:38: warning: left side of nil coalescing operator '??' has non-optional type 'String', so the right side is never used
217 |             let categoryTexts = categoryCells.map { ref -> String in
218 |                 guard let v = categories?.table.cells[ref]?.value else { return "" }
219 |                 return v.stringValue ?? String(describing: v)
    |                                      `- warning: left side of nil coalescing operator '??' has non-optional type 'String', so the right side is never used
220 |             }
221 |
[99/142] Compiling SheetNumbers NumbersCodec.swift
/host/spi-builder-workspace/Sources/SheetNumbers/NumbersChart.swift:219:38: warning: left side of nil coalescing operator '??' has non-optional type 'String', so the right side is never used
217 |             let categoryTexts = categoryCells.map { ref -> String in
218 |                 guard let v = categories?.table.cells[ref]?.value else { return "" }
219 |                 return v.stringValue ?? String(describing: v)
    |                                      `- warning: left side of nil coalescing operator '??' has non-optional type 'String', so the right side is never used
220 |             }
221 |
[100/142] Compiling SheetNumbers NumbersInspector.swift
[101/142] Compiling SheetNumbers NumbersObjectStore.swift
[102/142] Compiling SheetNumbers NumbersPivot.swift
[103/142] Emitting module SheetXLSX
[106/142] Compiling SheetNumbers NumbersResources.swift
[109/142] Compiling SheetNumbers NumbersStreamingWriter.swift
/host/spi-builder-workspace/Sources/SheetNumbers/NumbersDocument.swift:324:13: warning: variable 'zip' was never mutated; consider changing to 'let' constant
322 |
323 |     func encoded() -> Data {
324 |         var zip = ZipWriter()
    |             `- warning: variable 'zip' was never mutated; consider changing to 'let' constant
325 |         for name in order {
326 |             switch files[name] {
[111/142] Compiling SheetNumbers NumbersDocument.swift
/host/spi-builder-workspace/Sources/SheetNumbers/NumbersDocument.swift:324:13: warning: variable 'zip' was never mutated; consider changing to 'let' constant
322 |
323 |     func encoded() -> Data {
324 |         var zip = ZipWriter()
    |             `- warning: variable 'zip' was never mutated; consider changing to 'let' constant
325 |         for name in order {
326 |             switch files[name] {
[112/142] Compiling SheetNumbers NumbersFormula.swift
/host/spi-builder-workspace/Sources/SheetNumbers/NumbersDocument.swift:324:13: warning: variable 'zip' was never mutated; consider changing to 'let' constant
322 |
323 |     func encoded() -> Data {
324 |         var zip = ZipWriter()
    |             `- warning: variable 'zip' was never mutated; consider changing to 'let' constant
325 |         for name in order {
326 |             switch files[name] {
[116/142] Compiling SheetNumbers Protobuf.swift
[117/142] Compiling SheetNumbers Snappy.swift
[118/142] Compiling SheetNumbers resource_bundle_accessor.swift
[126/142] Compiling SheetNumbers NumbersStyles.swift
/host/spi-builder-workspace/Sources/SheetXLSX/Reader/Parsers.swift:475:59: warning: 'where' only applies to the second pattern match in this 'case'
 473 |         case "left", "right", "top", "bottom", "diagonal": side = ""
 474 |         case "border" where section == "borders" && depth == 2: borders.append(border)
 475 |         case "left", "right", "top", "bottom", "diagonal" where section == "dxfs": side = ""
     |                                      |         |          `- warning: 'where' only applies to the second pattern match in this 'case'
     |                                      |         `- note: disambiguate by adding a line break between them if this is desired
     |                                      `- note: duplicate the 'where' on both patterns to check both patterns
 476 |         case "xf" where section == "cellXfs": if let xf { cellXfs.append(xf) }; xf = nil
 477 |         case "font" where section == "dxfs": dxf?.font = dxfFont; dxfFont = nil
/host/spi-builder-workspace/Sources/SheetXLSX/Reader/Parsers.swift:475:14: warning: literal value is already handled by previous pattern; consider removing it
 471 |         case "patternFill": inPatternFill = false
 472 |         case "stop": gradientStop = nil
 473 |         case "left", "right", "top", "bottom", "diagonal": side = ""
     |              `- note: first occurrence of identical literal pattern is here
 474 |         case "border" where section == "borders" && depth == 2: borders.append(border)
 475 |         case "left", "right", "top", "bottom", "diagonal" where section == "dxfs": side = ""
     |              `- warning: literal value is already handled by previous pattern; consider removing it
 476 |         case "xf" where section == "cellXfs": if let xf { cellXfs.append(xf) }; xf = nil
 477 |         case "font" where section == "dxfs": dxf?.font = dxfFont; dxfFont = nil
/host/spi-builder-workspace/Sources/SheetXLSX/Reader/Parsers.swift:475:22: warning: literal value is already handled by previous pattern; consider removing it
 471 |         case "patternFill": inPatternFill = false
 472 |         case "stop": gradientStop = nil
 473 |         case "left", "right", "top", "bottom", "diagonal": side = ""
     |                      `- note: first occurrence of identical literal pattern is here
 474 |         case "border" where section == "borders" && depth == 2: borders.append(border)
 475 |         case "left", "right", "top", "bottom", "diagonal" where section == "dxfs": side = ""
     |                      `- warning: literal value is already handled by previous pattern; consider removing it
 476 |         case "xf" where section == "cellXfs": if let xf { cellXfs.append(xf) }; xf = nil
 477 |         case "font" where section == "dxfs": dxf?.font = dxfFont; dxfFont = nil
/host/spi-builder-workspace/Sources/SheetXLSX/Reader/Parsers.swift:475:31: warning: literal value is already handled by previous pattern; consider removing it
 471 |         case "patternFill": inPatternFill = false
 472 |         case "stop": gradientStop = nil
 473 |         case "left", "right", "top", "bottom", "diagonal": side = ""
     |                               `- note: first occurrence of identical literal pattern is here
 474 |         case "border" where section == "borders" && depth == 2: borders.append(border)
 475 |         case "left", "right", "top", "bottom", "diagonal" where section == "dxfs": side = ""
     |                               `- warning: literal value is already handled by previous pattern; consider removing it
 476 |         case "xf" where section == "cellXfs": if let xf { cellXfs.append(xf) }; xf = nil
 477 |         case "font" where section == "dxfs": dxf?.font = dxfFont; dxfFont = nil
/host/spi-builder-workspace/Sources/SheetXLSX/Reader/Parsers.swift:475:38: warning: literal value is already handled by previous pattern; consider removing it
 471 |         case "patternFill": inPatternFill = false
 472 |         case "stop": gradientStop = nil
 473 |         case "left", "right", "top", "bottom", "diagonal": side = ""
     |                                      `- note: first occurrence of identical literal pattern is here
 474 |         case "border" where section == "borders" && depth == 2: borders.append(border)
 475 |         case "left", "right", "top", "bottom", "diagonal" where section == "dxfs": side = ""
     |                                      `- warning: literal value is already handled by previous pattern; consider removing it
 476 |         case "xf" where section == "cellXfs": if let xf { cellXfs.append(xf) }; xf = nil
 477 |         case "font" where section == "dxfs": dxf?.font = dxfFont; dxfFont = nil
/host/spi-builder-workspace/Sources/SheetXLSX/Reader/Parsers.swift:475:59: warning: 'where' only applies to the second pattern match in this 'case'
 473 |         case "left", "right", "top", "bottom", "diagonal": side = ""
 474 |         case "border" where section == "borders" && depth == 2: borders.append(border)
 475 |         case "left", "right", "top", "bottom", "diagonal" where section == "dxfs": side = ""
     |                                      |         |          `- warning: 'where' only applies to the second pattern match in this 'case'
     |                                      |         `- note: disambiguate by adding a line break between them if this is desired
     |                                      `- note: duplicate the 'where' on both patterns to check both patterns
 476 |         case "xf" where section == "cellXfs": if let xf { cellXfs.append(xf) }; xf = nil
 477 |         case "font" where section == "dxfs": dxf?.font = dxfFont; dxfFont = nil
/host/spi-builder-workspace/Sources/SheetXLSX/Reader/Parsers.swift:475:14: warning: literal value is already handled by previous pattern; consider removing it
 471 |         case "patternFill": inPatternFill = false
 472 |         case "stop": gradientStop = nil
 473 |         case "left", "right", "top", "bottom", "diagonal": side = ""
     |              `- note: first occurrence of identical literal pattern is here
 474 |         case "border" where section == "borders" && depth == 2: borders.append(border)
 475 |         case "left", "right", "top", "bottom", "diagonal" where section == "dxfs": side = ""
     |              `- warning: literal value is already handled by previous pattern; consider removing it
 476 |         case "xf" where section == "cellXfs": if let xf { cellXfs.append(xf) }; xf = nil
 477 |         case "font" where section == "dxfs": dxf?.font = dxfFont; dxfFont = nil
/host/spi-builder-workspace/Sources/SheetXLSX/Reader/Parsers.swift:475:22: warning: literal value is already handled by previous pattern; consider removing it
 471 |         case "patternFill": inPatternFill = false
 472 |         case "stop": gradientStop = nil
 473 |         case "left", "right", "top", "bottom", "diagonal": side = ""
     |                      `- note: first occurrence of identical literal pattern is here
 474 |         case "border" where section == "borders" && depth == 2: borders.append(border)
 475 |         case "left", "right", "top", "bottom", "diagonal" where section == "dxfs": side = ""
     |                      `- warning: literal value is already handled by previous pattern; consider removing it
 476 |         case "xf" where section == "cellXfs": if let xf { cellXfs.append(xf) }; xf = nil
 477 |         case "font" where section == "dxfs": dxf?.font = dxfFont; dxfFont = nil
/host/spi-builder-workspace/Sources/SheetXLSX/Reader/Parsers.swift:475:31: warning: literal value is already handled by previous pattern; consider removing it
 471 |         case "patternFill": inPatternFill = false
 472 |         case "stop": gradientStop = nil
 473 |         case "left", "right", "top", "bottom", "diagonal": side = ""
     |                               `- note: first occurrence of identical literal pattern is here
 474 |         case "border" where section == "borders" && depth == 2: borders.append(border)
 475 |         case "left", "right", "top", "bottom", "diagonal" where section == "dxfs": side = ""
     |                               `- warning: literal value is already handled by previous pattern; consider removing it
 476 |         case "xf" where section == "cellXfs": if let xf { cellXfs.append(xf) }; xf = nil
 477 |         case "font" where section == "dxfs": dxf?.font = dxfFont; dxfFont = nil
/host/spi-builder-workspace/Sources/SheetXLSX/Reader/Parsers.swift:475:38: warning: literal value is already handled by previous pattern; consider removing it
 471 |         case "patternFill": inPatternFill = false
 472 |         case "stop": gradientStop = nil
 473 |         case "left", "right", "top", "bottom", "diagonal": side = ""
     |                                      `- note: first occurrence of identical literal pattern is here
 474 |         case "border" where section == "borders" && depth == 2: borders.append(border)
 475 |         case "left", "right", "top", "bottom", "diagonal" where section == "dxfs": side = ""
     |                                      `- warning: literal value is already handled by previous pattern; consider removing it
 476 |         case "xf" where section == "cellXfs": if let xf { cellXfs.append(xf) }; xf = nil
 477 |         case "font" where section == "dxfs": dxf?.font = dxfFont; dxfFont = nil
/host/spi-builder-workspace/Sources/SheetXLSX/Writer/WorkbookWriter.swift:81:13: warning: variable 'archive' was never mutated; consider changing to 'let' constant
  79 |         guard !wb.sheets.isEmpty else { throw SheetError.invalidWorkbook("a workbook needs at least one sheet") }
  80 |         let sink = WarningSink()
  81 |         var archive = ZipWriter()
     |             `- warning: variable 'archive' was never mutated; consider changing to 'let' constant
  82 |         let preserved = wb.preserved
  83 |         let sameFamily = preserved.sourceFormat == .xlsx || preserved.sourceFormat == .xlsm
/host/spi-builder-workspace/Sources/SheetXLSX/Writer/WorkbookWriter.swift:81:13: warning: variable 'archive' was never mutated; consider changing to 'let' constant
  79 |         guard !wb.sheets.isEmpty else { throw SheetError.invalidWorkbook("a workbook needs at least one sheet") }
  80 |         let sink = WarningSink()
  81 |         var archive = ZipWriter()
     |             `- warning: variable 'archive' was never mutated; consider changing to 'let' constant
  82 |         let preserved = wb.preserved
  83 |         let sameFamily = preserved.sourceFormat == .xlsx || preserved.sourceFormat == .xlsm
[146/149] Compiling SwiftSheets StreamingWriter.swift
[147/149] Compiling SwiftSheets Streaming.swift
[148/149] Emitting module SwiftSheets
[149/149] Compiling SwiftSheets Facade.swift
[151/156] Compiling SheetDecrypt Decrypt.swift
[152/156] Compiling SheetDecrypt CompoundFile.swift
[153/156] Compiling SheetDecrypt OOXMLEncryption.swift
[154/156] Compiling SheetDecrypt ODSEncryption.swift
[155/156] Compiling SheetDecrypt AES.swift
[156/156] Emitting module SheetDecrypt
[158/163] Compiling SheetEncrypt ODSEncryption+Encrypt.swift
[159/163] Compiling SheetEncrypt Encrypt.swift
[160/163] Compiling SheetEncrypt OOXMLEncryption+Encrypt.swift
[161/163] Compiling SheetEncrypt CompoundFile+Write.swift
[162/163] Emitting module SheetEncrypt
[163/163] Compiling SheetEncrypt AES+Encrypt.swift
Build complete! (12.36s)
Build complete.
{
  "dependencies" : [
  ],
  "manifest_display_name" : "SwiftSheets",
  "name" : "SwiftSheets",
  "path" : "/host/spi-builder-workspace",
  "platforms" : [
    {
      "name" : "macos",
      "version" : "14.0"
    },
    {
      "name" : "ios",
      "version" : "17.0"
    }
  ],
  "products" : [
    {
      "name" : "SheetCore",
      "targets" : [
        "SheetCore"
      ],
      "type" : {
        "library" : [
          "automatic"
        ]
      }
    },
    {
      "name" : "SheetXLSX",
      "targets" : [
        "SheetXLSX"
      ],
      "type" : {
        "library" : [
          "automatic"
        ]
      }
    },
    {
      "name" : "SheetCSV",
      "targets" : [
        "SheetCSV"
      ],
      "type" : {
        "library" : [
          "automatic"
        ]
      }
    },
    {
      "name" : "SheetODS",
      "targets" : [
        "SheetODS"
      ],
      "type" : {
        "library" : [
          "automatic"
        ]
      }
    },
    {
      "name" : "SheetNumbers",
      "targets" : [
        "SheetNumbers"
      ],
      "type" : {
        "library" : [
          "automatic"
        ]
      }
    },
    {
      "name" : "SwiftSheets",
      "targets" : [
        "SwiftSheets"
      ],
      "type" : {
        "library" : [
          "automatic"
        ]
      }
    },
    {
      "name" : "SheetDecrypt",
      "targets" : [
        "SheetDecrypt"
      ],
      "type" : {
        "library" : [
          "automatic"
        ]
      }
    },
    {
      "name" : "SheetEncrypt",
      "targets" : [
        "SheetEncrypt"
      ],
      "type" : {
        "library" : [
          "automatic"
        ]
      }
    }
  ],
  "targets" : [
    {
      "c99name" : "SwiftSheetsTests",
      "module_type" : "SwiftTarget",
      "name" : "SwiftSheetsTests",
      "path" : "Tests/SwiftSheetsTests",
      "resources" : [
        {
          "path" : "/host/spi-builder-workspace/Tests/SwiftSheetsTests/Fixtures",
          "rule" : {
            "copy" : {
            }
          }
        }
      ],
      "sources" : [
        "APIContractTests.swift",
        "AutofitTests.swift",
        "CSVCodecTests.swift",
        "CellLimitTests.swift",
        "ChartSheetTests.swift",
        "ChartTests.swift",
        "CivilDateSerialTests.swift",
        "CodecSetTests.swift",
        "CommentTests.swift",
        "CompressionTests.swift",
        "ConditionalExtensionTests.swift",
        "ConditionalFormattingTests.swift",
        "CoordinateStringTests.swift",
        "CrossFormatConversionTests.swift",
        "CryptoTests.swift",
        "DataValidationChoicesTests.swift",
        "DetectionTests.swift",
        "DrawingReadTests.swift",
        "EncryptedInputTests.swift",
        "ErrorClassificationTests.swift",
        "ExcelGroundTruthTests.swift",
        "ExternalLinkTests.swift",
        "FacadeTests.swift",
        "FormatSupportTests.swift",
        "FormulaCellReadingTests.swift",
        "FormulaTests.swift",
        "FuriganaTests.swift",
        "FuzzTests.swift",
        "HotPathEquivalenceTests.swift",
        "ImageTests.swift",
        "InspectionTests.swift",
        "KitchenSinkRepairTests.swift",
        "MalformedInputTests.swift",
        "ModelTests.swift",
        "NamedStyleTests.swift",
        "NumberFormatVocabularyTests.swift",
        "NumbersArrayFormulaTests.swift",
        "NumbersCanvasTests.swift",
        "NumbersCategoryFilterTests.swift",
        "NumbersChartTests.swift",
        "NumbersConditionalTests.swift",
        "NumbersControlTests.swift",
        "NumbersCrossingTests.swift",
        "NumbersFormTests.swift",
        "NumbersIWATests.swift",
        "NumbersLayoutTests.swift",
        "NumbersPivotShapeTests.swift",
        "NumbersPopUpMenuTests.swift",
        "NumbersPrintTests.swift",
        "NumbersProbeTests.swift",
        "NumbersReaderTests.swift",
        "NumbersRichTextTests.swift",
        "NumbersSilentLossTests.swift",
        "NumbersStockTests.swift",
        "NumbersValuelessCellTests.swift",
        "NumbersWriterTests.swift",
        "ODFOnlyFeatureTests.swift",
        "ODSCodecTests.swift",
        "ODSDrawingTests.swift",
        "ODSImageTests.swift",
        "OpenpyxlInteropTests.swift",
        "ParallelReadTests.swift",
        "Parity/CellParityTests.swift",
        "Parity/OpenpyxlLetters.swift",
        "Parity/ReaderParityTests.swift",
        "Parity/StylesParityTests.swift",
        "Parity/UtilsParityTests.swift",
        "Parity/WorkbookParityTests.swift",
        "Parity/WorksheetParityTests.swift",
        "Parity/WorksheetPartsParityTests.swift",
        "Parity/WriterParityTests.swift",
        "PivotSpikeTests.swift",
        "PivotTableTests.swift",
        "PreservationAPITests.swift",
        "PreservationInventoryTests.swift",
        "PreservationTests.swift",
        "PropertyTests.swift",
        "ProtectionTests.swift",
        "ReaderTests.swift",
        "ReservedEnumTests.swift",
        "RunHyperlinkTests.swift",
        "SchemaClosedValuesTests.swift",
        "ShapeTests.swift",
        "SharedSpecGapsTests.swift",
        "SheetViewTests.swift",
        "SnappyFuzzTests.swift",
        "SparklineTests.swift",
        "StreamingAPITests.swift",
        "StreamingFileFormatTests.swift",
        "StreamingFormatsTests.swift",
        "StreamingSaveTests.swift",
        "StreamingTests.swift",
        "StreamingWriteFormatsTests.swift",
        "StructuredTableTests.swift",
        "SurfaceReviewTests.swift",
        "TextSpillTests.swift",
        "ThemeTests.swift",
        "ThreadedCommentTests.swift",
        "VerificationSamplesTests.swift",
        "WorksheetPartsTests.swift",
        "WriterTests.swift",
        "XMLScannerTests.swift",
        "ZeroCoordinateReadTests.swift",
        "ZipTests.swift"
      ],
      "target_dependencies" : [
        "SwiftSheets"
      ],
      "type" : "test"
    },
    {
      "c99name" : "SwiftSheets",
      "module_type" : "SwiftTarget",
      "name" : "SwiftSheets",
      "path" : "Sources/SwiftSheets",
      "product_memberships" : [
        "SwiftSheets",
        "SheetDecrypt",
        "SheetEncrypt"
      ],
      "sources" : [
        "Facade.swift",
        "Streaming.swift",
        "StreamingWriter.swift"
      ],
      "target_dependencies" : [
        "SheetCore",
        "SheetXLSX",
        "SheetCSV",
        "SheetODS",
        "SheetNumbers"
      ],
      "type" : "library"
    },
    {
      "c99name" : "SheetXLSX",
      "module_type" : "SwiftTarget",
      "name" : "SheetXLSX",
      "path" : "Sources/SheetXLSX",
      "product_memberships" : [
        "SheetXLSX",
        "SwiftSheets",
        "SheetDecrypt",
        "SheetEncrypt"
      ],
      "sources" : [
        "ChartParts.swift",
        "Codec+XLSX.swift",
        "CommentParts.swift",
        "DrawingParts.swift",
        "ExtensionList.swift",
        "PivotParts.swift",
        "Reader/DrawingReader.swift",
        "Reader/Parsers.swift",
        "Reader/WorkbookReader.swift",
        "Reader/XLSXInspector.swift",
        "SparklineParts.swift",
        "Streaming.swift",
        "ThreadedCommentParts.swift",
        "Writer/StylesWriter.swift",
        "Writer/Theme.swift",
        "Writer/WorkbookWriter.swift",
        "X14ConditionalParts.swift",
        "XLSXCodec.swift"
      ],
      "target_dependencies" : [
        "SheetCore"
      ],
      "type" : "library"
    },
    {
      "c99name" : "SheetODS",
      "module_type" : "SwiftTarget",
      "name" : "SheetODS",
      "path" : "Sources/SheetODS",
      "product_memberships" : [
        "SheetODS",
        "SwiftSheets",
        "SheetDecrypt",
        "SheetEncrypt"
      ],
      "sources" : [
        "Codec+ODS.swift",
        "ODSCellText.swift",
        "ODSCodec.swift",
        "ODSConditionalFormat.swift",
        "ODSDataStyle.swift",
        "ODSDrawing.swift",
        "ODSFeatures.swift",
        "ODSInspector.swift",
        "ODSLength.swift",
        "ODSPageStyles.swift",
        "ODSPicture.swift",
        "ODSPivot.swift",
        "ODSReader.swift",
        "ODSStreaming.swift",
        "ODSStreamingWriter.swift",
        "ODSStyles.swift",
        "ODSValidation.swift",
        "ODSWriter.swift"
      ],
      "target_dependencies" : [
        "SheetCore"
      ],
      "type" : "library"
    },
    {
      "c99name" : "SheetNumbers",
      "module_type" : "SwiftTarget",
      "name" : "SheetNumbers",
      "path" : "Sources/SheetNumbers",
      "product_memberships" : [
        "SheetNumbers",
        "SwiftSheets",
        "SheetDecrypt",
        "SheetEncrypt"
      ],
      "resources" : [
        {
          "path" : "/host/spi-builder-workspace/Sources/SheetNumbers/Resources/constants.json",
          "rule" : {
            "process" : {
            }
          }
        },
        {
          "path" : "/host/spi-builder-workspace/Sources/SheetNumbers/Resources/empty.numbers",
          "rule" : {
            "process" : {
            }
          }
        },
        {
          "path" : "/host/spi-builder-workspace/Sources/SheetNumbers/Resources/fonts.json",
          "rule" : {
            "process" : {
            }
          }
        },
        {
          "path" : "/host/spi-builder-workspace/Sources/SheetNumbers/Resources/functions.json",
          "rule" : {
            "process" : {
            }
          }
        },
        {
          "path" : "/host/spi-builder-workspace/Sources/SheetNumbers/Resources/registry.json",
          "rule" : {
            "process" : {
            }
          }
        },
        {
          "path" : "/host/spi-builder-workspace/Sources/SheetNumbers/Resources/schema.json",
          "rule" : {
            "process" : {
            }
          }
        }
      ],
      "sources" : [
        "CellStorage.swift",
        "Codec+Numbers.swift",
        "IWA.swift",
        "NumbersCanvas.swift",
        "NumbersCells.swift",
        "NumbersChart.swift",
        "NumbersCodec.swift",
        "NumbersConditional.swift",
        "NumbersDocument.swift",
        "NumbersFormula.swift",
        "NumbersInspector.swift",
        "NumbersObjectStore.swift",
        "NumbersPivot.swift",
        "NumbersPrint.swift",
        "NumbersReader.swift",
        "NumbersResources.swift",
        "NumbersRichText.swift",
        "NumbersStreaming.swift",
        "NumbersStreamingWriter.swift",
        "NumbersStyles.swift",
        "NumbersUUID.swift",
        "NumbersWriter.swift",
        "Protobuf.swift",
        "Snappy.swift"
      ],
      "target_dependencies" : [
        "SheetCore"
      ],
      "type" : "library"
    },
    {
      "c99name" : "SheetEncryptTests",
      "module_type" : "SwiftTarget",
      "name" : "SheetEncryptTests",
      "path" : "Tests/SheetEncryptTests",
      "sources" : [
        "AESTests.swift",
        "EncryptionTests.swift"
      ],
      "target_dependencies" : [
        "SheetEncrypt"
      ],
      "type" : "test"
    },
    {
      "c99name" : "SheetEncrypt",
      "module_type" : "SwiftTarget",
      "name" : "SheetEncrypt",
      "path" : "Sources/SheetEncrypt",
      "product_memberships" : [
        "SheetEncrypt"
      ],
      "sources" : [
        "AES+Encrypt.swift",
        "CompoundFile+Write.swift",
        "Encrypt.swift",
        "ODSEncryption+Encrypt.swift",
        "OOXMLEncryption+Encrypt.swift"
      ],
      "target_dependencies" : [
        "SheetDecrypt"
      ],
      "type" : "library"
    },
    {
      "c99name" : "SheetDecryptTests",
      "module_type" : "SwiftTarget",
      "name" : "SheetDecryptTests",
      "path" : "Tests/SheetDecryptTests",
      "sources" : [
        "DecryptTests.swift"
      ],
      "target_dependencies" : [
        "SheetDecrypt"
      ],
      "type" : "test"
    },
    {
      "c99name" : "SheetDecrypt",
      "module_type" : "SwiftTarget",
      "name" : "SheetDecrypt",
      "path" : "Sources/SheetDecrypt",
      "product_memberships" : [
        "SheetDecrypt",
        "SheetEncrypt"
      ],
      "sources" : [
        "AES.swift",
        "CompoundFile.swift",
        "Decrypt.swift",
        "ODSEncryption.swift",
        "OOXMLEncryption.swift"
      ],
      "target_dependencies" : [
        "SwiftSheets"
      ],
      "type" : "library"
    },
    {
      "c99name" : "SheetCore",
      "module_type" : "SwiftTarget",
      "name" : "SheetCore",
      "path" : "Sources/SheetCore",
      "product_memberships" : [
        "SheetCore",
        "SheetXLSX",
        "SheetCSV",
        "SheetODS",
        "SheetNumbers",
        "SwiftSheets",
        "SheetDecrypt",
        "SheetEncrypt"
      ],
      "sources" : [
        "Codec/CSVOptions.swift",
        "Codec/CellBudget.swift",
        "Codec/Codec.swift",
        "Codec/CodecSet.swift",
        "Codec/EncryptedInput.swift",
        "Codec/Inspection.swift",
        "Codec/PreservationStore.swift",
        "Codec/PreservationSummary.swift",
        "Codec/SheetError.swift",
        "Codec/SheetFormat.swift",
        "Codec/StreamingReader.swift",
        "Codec/StreamingRows.swift",
        "Codec/StreamingWriter.swift",
        "Container/ByteSource.swift",
        "Container/CRC32.swift",
        "Container/Deflate.swift",
        "Container/Zip.swift",
        "Container/ZipInspection.swift",
        "Container/ZipWriter.swift",
        "Crypto/Primitives.swift",
        "Formula/FormulaExpr.swift",
        "Formula/FormulaFunctionNames.swift",
        "Formula/FormulaParser.swift",
        "Model/Autofit.swift",
        "Model/Cell.swift",
        "Model/CellRef.swift",
        "Model/CellValue.swift",
        "Model/Chart.swift",
        "Model/ConditionalFormatting.swift",
        "Model/CustomProperties.swift",
        "Model/DataValidation.swift",
        "Model/ExternalLink.swift",
        "Model/ODFFeatures.swift",
        "Model/PivotTable.swift",
        "Model/Protection.swift",
        "Model/RangeView.swift",
        "Model/Shape.swift",
        "Model/Sheet.swift",
        "Model/SheetContentState.swift",
        "Model/SheetImage.swift",
        "Model/Sparkline.swift",
        "Model/StructuredTable.swift",
        "Model/Table.swift",
        "Model/Workbook.swift",
        "Styles/DifferentialStyle.swift",
        "Styles/Fill.swift",
        "Styles/Styles.swift",
        "Styles/Theme.swift",
        "SwiftSheetsInfo.swift",
        "Utils/AtomicFileTarget.swift",
        "Utils/CivilDate.swift",
        "Utils/SHA512.swift",
        "Utils/TextSpill.swift",
        "Utils/Units.swift",
        "Utils/XML.swift",
        "Utils/XMLScanner.swift"
      ],
      "target_dependencies" : [
        "CZlib"
      ],
      "type" : "library"
    },
    {
      "c99name" : "SheetCSV",
      "module_type" : "SwiftTarget",
      "name" : "SheetCSV",
      "path" : "Sources/SheetCSV",
      "product_memberships" : [
        "SheetCSV",
        "SwiftSheets",
        "SheetDecrypt",
        "SheetEncrypt"
      ],
      "sources" : [
        "CSVCodec.swift",
        "CSVStreaming.swift",
        "Codec+CSV.swift"
      ],
      "target_dependencies" : [
        "SheetCore"
      ],
      "type" : "library"
    },
    {
      "c99name" : "PartialLinkTests",
      "module_type" : "SwiftTarget",
      "name" : "PartialLinkTests",
      "path" : "Tests/PartialLinkTests",
      "sources" : [
        "PartialLinkTests.swift"
      ],
      "target_dependencies" : [
        "SheetCore",
        "SheetXLSX",
        "SheetODS",
        "SheetNumbers"
      ],
      "type" : "test"
    },
    {
      "c99name" : "CZlib",
      "module_type" : "SystemLibraryTarget",
      "name" : "CZlib",
      "path" : "Sources/CZlib",
      "product_memberships" : [
        "SheetCore",
        "SheetXLSX",
        "SheetCSV",
        "SheetODS",
        "SheetNumbers",
        "SwiftSheets",
        "SheetDecrypt",
        "SheetEncrypt"
      ],
      "sources" : [
      ],
      "type" : "system-target"
    }
  ],
  "tools_version" : "6.2"
}
basic-6.3-latest: Pulling from saguaro1/spi-images
Digest: sha256:c577f8f8f4df4f423827bf5e7d96027716bb7030ef75b2fd4a15f7fb0043ce6d
Status: Image is up to date for registry.gitlab.com/saguaro1/spi-images:basic-6.3-latest
Done.