chore(m9): toolchain, CI config, and core syntax demotion (Slice 1) #105
@@ -14,13 +14,21 @@ jobs:
|
|||||||
build-and-test:
|
build-and-test:
|
||||||
# Prefer a self-hosted Mac runner if your Gitea has one. If not,
|
# Prefer a self-hosted Mac runner if your Gitea has one. If not,
|
||||||
# macos-14 works for this pipeline.
|
# macos-14 works for this pipeline.
|
||||||
runs-on: macos-14
|
runs-on: macos-12
|
||||||
env:
|
env:
|
||||||
DERIVED: build/DerivedData-test
|
DERIVED: build/DerivedData-test
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Assert Xcode 14 toolchain
|
||||||
|
run: xcodebuild -version | grep -E "Xcode 14." || (echo "Unexpected Xcode version" && exit 1)
|
||||||
|
|
||||||
|
- name: Ensure host tools
|
||||||
|
run: |
|
||||||
|
command -v xcodegen || brew install xcodegen
|
||||||
|
python3 -c "import dmgbuild" 2>/dev/null || pip3 install dmgbuild
|
||||||
|
|
||||||
- name: Generate Xcode project
|
- name: Generate Xcode project
|
||||||
run: xcodegen generate --spec project.yml
|
run: xcodegen generate --spec project.yml
|
||||||
|
|
||||||
@@ -120,7 +128,7 @@ jobs:
|
|||||||
|
|
||||||
package:
|
package:
|
||||||
needs: build-and-test
|
needs: build-and-test
|
||||||
runs-on: macos-14
|
runs-on: macos-12
|
||||||
if: github.ref == 'refs/heads/develop' || startsWith(github.ref, 'refs/tags/v')
|
if: github.ref == 'refs/heads/develop' || startsWith(github.ref, 'refs/tags/v')
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
// swift-tools-version: 6.0
|
// swift-tools-version: 5.7
|
||||||
import PackageDescription
|
import PackageDescription
|
||||||
|
|
||||||
let package = Package(
|
let package = Package(
|
||||||
name: "ICCeryCore",
|
name: "ICCeryCore",
|
||||||
platforms: [.macOS(.v14)],
|
platforms: [.macOS(.v12)],
|
||||||
products: [
|
products: [
|
||||||
.library(name: "ICCeryCore", targets: ["ICCeryCore"]),
|
.library(name: "ICCeryCore", targets: ["ICCeryCore"]),
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -200,7 +200,7 @@ public struct ArgyllRunner: Sendable {
|
|||||||
await processManager.kill(id: id)
|
await processManager.kill(id: id)
|
||||||
var attempts = 0
|
var attempts = 0
|
||||||
while await processManager.isRunning(id), attempts < 30 {
|
while await processManager.isRunning(id), attempts < 30 {
|
||||||
try? await Task.sleep(for: .milliseconds(100))
|
try? await Task.sleep(nanoseconds: 100_000_000)
|
||||||
attempts += 1
|
attempts += 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -243,7 +243,7 @@ public struct ArgyllRunner: Sendable {
|
|||||||
if flushPartialLines {
|
if flushPartialLines {
|
||||||
dotFlushTask = Task { [processManager] in
|
dotFlushTask = Task { [processManager] in
|
||||||
while !Task.isCancelled {
|
while !Task.isCancelled {
|
||||||
try? await Task.sleep(for: .milliseconds(500))
|
try? await Task.sleep(nanoseconds: 500_000_000)
|
||||||
if Task.isCancelled { break }
|
if Task.isCancelled { break }
|
||||||
await processManager.flushPartialLine(id: processId)
|
await processManager.flushPartialLine(id: processId)
|
||||||
}
|
}
|
||||||
@@ -592,7 +592,7 @@ public struct ArgyllRunner: Sendable {
|
|||||||
await processManager.setPreKillHook(id: processId) { [processManager] in
|
await processManager.setPreKillHook(id: processId) { [processManager] in
|
||||||
if isXY {
|
if isXY {
|
||||||
try? await processManager.sendStdin(id: processId, bytes: ChartreadInput.quit.bytes)
|
try? await processManager.sendStdin(id: processId, bytes: ChartreadInput.quit.bytes)
|
||||||
try? await Task.sleep(for: .milliseconds(500))
|
try? await Task.sleep(nanoseconds: 500_000_000)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ public enum CGATSParser {
|
|||||||
public static func parse(
|
public static func parse(
|
||||||
_ contents: String,
|
_ contents: String,
|
||||||
sourceURL: URL? = nil
|
sourceURL: URL? = nil
|
||||||
) throws(CGATSParseError) -> CGATSDataset {
|
) throws -> CGATSDataset {
|
||||||
guard !contents.isEmpty else { throw .emptyFile }
|
guard !contents.isEmpty else { throw .emptyFile }
|
||||||
|
|
||||||
let ext = sourceURL?.pathExtension.lowercased() ?? ""
|
let ext = sourceURL?.pathExtension.lowercased() ?? ""
|
||||||
@@ -213,7 +213,7 @@ public enum CGATSParser {
|
|||||||
private static func preprocess(
|
private static func preprocess(
|
||||||
_ contents: String,
|
_ contents: String,
|
||||||
isCSV: Bool
|
isCSV: Bool
|
||||||
) throws(CGATSParseError) -> (CGATSFormat, [String]) {
|
) throws -> (CGATSFormat, [String]) {
|
||||||
let allLines = contents.components(separatedBy: .newlines)
|
let allLines = contents.components(separatedBy: .newlines)
|
||||||
var lines = [String]()
|
var lines = [String]()
|
||||||
|
|
||||||
|
|||||||
@@ -559,7 +559,7 @@ public actor ProcessManager {
|
|||||||
// Start a watchdog in case the `readabilityHandler` EOFs never
|
// Start a watchdog in case the `readabilityHandler` EOFs never
|
||||||
// arrive after the process exits (e.g. a hung pipe).
|
// arrive after the process exits (e.g. a hung pipe).
|
||||||
child.finalizeTask = Task { [weak self] in
|
child.finalizeTask = Task { [weak self] in
|
||||||
try? await Task.sleep(for: .seconds(2))
|
try? await Task.sleep(nanoseconds: 2_000_000_000)
|
||||||
guard let self else { return }
|
guard let self else { return }
|
||||||
await self.forceKill(id: id)
|
await self.forceKill(id: id)
|
||||||
await self.forceFinalize(id: id)
|
await self.forceFinalize(id: id)
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ final class SettingsViewModel {
|
|||||||
sink.applySettings(settings)
|
sink.applySettings(settings)
|
||||||
savedFlash = true
|
savedFlash = true
|
||||||
Task {
|
Task {
|
||||||
try? await Task.sleep(for: .seconds(1.5))
|
try? await Task.sleep(nanoseconds: 1_500_000_000)
|
||||||
savedFlash = false
|
savedFlash = false
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
|
|||||||
@@ -201,7 +201,7 @@ final class WizardViewModel {
|
|||||||
self.notice = notice
|
self.notice = notice
|
||||||
if let delay = notice.autoHideAfter {
|
if let delay = notice.autoHideAfter {
|
||||||
noticeDismissTask = Task { [weak self] in
|
noticeDismissTask = Task { [weak self] in
|
||||||
try? await Task.sleep(for: .seconds(delay))
|
try? await Task.sleep(nanoseconds: UInt64(delay * 1_000_000_000))
|
||||||
guard !Task.isCancelled else { return }
|
guard !Task.isCancelled else { return }
|
||||||
if self?.notice?.id == notice.id {
|
if self?.notice?.id == notice.id {
|
||||||
self?.notice = nil
|
self?.notice = nil
|
||||||
|
|||||||
+12
-12
@@ -2,7 +2,7 @@ name: ICCery
|
|||||||
options:
|
options:
|
||||||
bundleIdPrefix: com.gronod
|
bundleIdPrefix: com.gronod
|
||||||
deploymentTarget:
|
deploymentTarget:
|
||||||
macOS: "14.0"
|
macOS: "12.0"
|
||||||
groupSortPosition: top
|
groupSortPosition: top
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
@@ -13,7 +13,7 @@ targets:
|
|||||||
ICCery:
|
ICCery:
|
||||||
type: application
|
type: application
|
||||||
platform: macOS
|
platform: macOS
|
||||||
deploymentTarget: "14.0"
|
deploymentTarget: "12.0"
|
||||||
sources:
|
sources:
|
||||||
- path: Sources/ICCery
|
- path: Sources/ICCery
|
||||||
- path: Resources
|
- path: Resources
|
||||||
@@ -46,7 +46,7 @@ targets:
|
|||||||
PRODUCT_BUNDLE_PACKAGE_TYPE: APPL
|
PRODUCT_BUNDLE_PACKAGE_TYPE: APPL
|
||||||
GENERATE_INFOPLIST_FILE: YES
|
GENERATE_INFOPLIST_FILE: YES
|
||||||
INFOPLIST_KEY_CFBundleDisplayName: ICCery
|
INFOPLIST_KEY_CFBundleDisplayName: ICCery
|
||||||
INFOPLIST_KEY_LSMinimumSystemVersion: "14.0"
|
INFOPLIST_KEY_LSMinimumSystemVersion: "12.0"
|
||||||
INFOPLIST_KEY_NSPrincipalClass: NSApplication
|
INFOPLIST_KEY_NSPrincipalClass: NSApplication
|
||||||
INFOPLIST_KEY_NSHumanReadableCopyright: "Copyright © 2026 Gronod. AGPLv3."
|
INFOPLIST_KEY_NSHumanReadableCopyright: "Copyright © 2026 Gronod. AGPLv3."
|
||||||
MARKETING_VERSION: "2.0.0"
|
MARKETING_VERSION: "2.0.0"
|
||||||
@@ -58,15 +58,15 @@ targets:
|
|||||||
ENABLE_APP_SANDBOX: NO
|
ENABLE_APP_SANDBOX: NO
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
|
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
|
||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME: AccentColor
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME: AccentColor
|
||||||
SWIFT_VERSION: "6.0"
|
SWIFT_VERSION: "5.0"
|
||||||
SWIFT_STRICT_CONCURRENCY: complete
|
OTHER_SWIFT_FLAGS: ["$(inherited)", "-strict-concurrency=minimal"]
|
||||||
MACOSX_DEPLOYMENT_TARGET: "14.0"
|
MACOSX_DEPLOYMENT_TARGET: "12.0"
|
||||||
ARCHS: "$(ARCHS_STANDARD)"
|
ARCHS: "$(ARCHS_STANDARD)"
|
||||||
|
|
||||||
ICCeryCoreTests:
|
ICCeryCoreTests:
|
||||||
type: bundle.unit-test
|
type: bundle.unit-test
|
||||||
platform: macOS
|
platform: macOS
|
||||||
deploymentTarget: "14.0"
|
deploymentTarget: "12.0"
|
||||||
sources:
|
sources:
|
||||||
- path: Tests/ICCeryCoreTests
|
- path: Tests/ICCeryCoreTests
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -79,13 +79,13 @@ targets:
|
|||||||
TEST_HOST: "$(BUILT_PRODUCTS_DIR)/ICCery.app/Contents/MacOS/ICCery"
|
TEST_HOST: "$(BUILT_PRODUCTS_DIR)/ICCery.app/Contents/MacOS/ICCery"
|
||||||
GENERATE_INFOPLIST_FILE: YES
|
GENERATE_INFOPLIST_FILE: YES
|
||||||
CODE_SIGN_IDENTITY: "-"
|
CODE_SIGN_IDENTITY: "-"
|
||||||
SWIFT_VERSION: "6.0"
|
SWIFT_VERSION: "5.0"
|
||||||
MACOSX_DEPLOYMENT_TARGET: "14.0"
|
MACOSX_DEPLOYMENT_TARGET: "12.0"
|
||||||
|
|
||||||
ICCeryUITests:
|
ICCeryUITests:
|
||||||
type: bundle.ui-testing
|
type: bundle.ui-testing
|
||||||
platform: macOS
|
platform: macOS
|
||||||
deploymentTarget: "14.0"
|
deploymentTarget: "12.0"
|
||||||
sources:
|
sources:
|
||||||
- path: Tests/ICCeryUITests
|
- path: Tests/ICCeryUITests
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -95,8 +95,8 @@ targets:
|
|||||||
TEST_TARGET_NAME: ICCery
|
TEST_TARGET_NAME: ICCery
|
||||||
GENERATE_INFOPLIST_FILE: YES
|
GENERATE_INFOPLIST_FILE: YES
|
||||||
CODE_SIGN_IDENTITY: "-"
|
CODE_SIGN_IDENTITY: "-"
|
||||||
SWIFT_VERSION: "6.0"
|
SWIFT_VERSION: "5.0"
|
||||||
MACOSX_DEPLOYMENT_TARGET: "14.0"
|
MACOSX_DEPLOYMENT_TARGET: "12.0"
|
||||||
|
|
||||||
schemes:
|
schemes:
|
||||||
ICCery:
|
ICCery:
|
||||||
|
|||||||
Reference in New Issue
Block a user