- scripts/fetch-argyll.sh: POSIX sh port of fetch-argyll.mjs; queries
the Gitea release API for the *_macOS_universal_bin.tgz asset,
extracts Argyll_V*/bin, chmod+x, strips quarantine xattr; honors
ARGYLL_SERVER_URL / ARGYLL_REPO / ARGYLL_RELEASE_TAG / GITEA_TOKEN.
Verified end-to-end: 51 universal tools from v3.5.0-ICCery1.8.
- BinaryResolver: settings argyll_binary_dir override (existence-gated)
→ bundled Argyll/<platform>/, macos-universal preferred when instlist
marker present, else macos-arm64/macos-x86_64; constructed path
returned even when absent (spawn surfaces process:error). Mock and
reference-gamut helpers.
- Vendored tracked resources: mocks/{chartread,colprof,profcheck}.mock
+ reference_gamuts/sRGB.gam from ICCery v1, copied as a folder
reference so the Argyll/ subtree structure survives into the bundle.
- Build phase rsyncs Vendor/Argyll/ → Contents/Resources/Argyll/.
- AppDelegate: killAll via terminateLater so children are signaled
before teardown (#147/#149).
- 6 resolver tests + fetch script smoke-verified against real release.
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
84 lines
3.3 KiB
Swift
84 lines
3.3 KiB
Swift
import Testing
|
|
import Foundation
|
|
@testable import ICCeryCore
|
|
|
|
@Suite("BinaryResolver")
|
|
struct BinaryResolverTests {
|
|
|
|
private func makeTree(_ body: (URL) throws -> Void) throws -> URL {
|
|
let root = FileManager.default.temporaryDirectory
|
|
.appendingPathComponent("iccery-resolver-\(UUID().uuidString)")
|
|
try FileManager.default.createDirectory(at: root, withIntermediateDirectories: true)
|
|
try body(root)
|
|
return root
|
|
}
|
|
|
|
private func touch(_ url: URL, executable: Bool = true) throws {
|
|
FileManager.default.createFile(atPath: url.path, contents: Data())
|
|
if executable {
|
|
try FileManager.default.setAttributes(
|
|
[.posixPermissions: 0o755], ofItemAtPath: url.path
|
|
)
|
|
}
|
|
}
|
|
|
|
@Test func overrideDirWinsWhenFileExists() throws {
|
|
let override = try makeTree { root in
|
|
try touch(root.appendingPathComponent("targen"))
|
|
}
|
|
let bundled = try makeTree { _ in }
|
|
let r = BinaryResolver(bundledRoot: bundled, overrideDir: override)
|
|
#expect(r.resolve("targen") == override.appendingPathComponent("targen"))
|
|
}
|
|
|
|
@Test func overrideFallsThroughWhenMissing() throws {
|
|
let override = try makeTree { _ in }
|
|
let bundled = try makeTree { root in
|
|
let dir = root.appendingPathComponent("macos-universal")
|
|
try FileManager.default.createDirectory(at: dir, withIntermediateDirectories: true)
|
|
try touch(dir.appendingPathComponent("instlist"))
|
|
}
|
|
let r = BinaryResolver(bundledRoot: bundled, overrideDir: override)
|
|
#expect(r.resolve("targen").path.contains("macos-universal/targen"))
|
|
}
|
|
|
|
@Test func universalPreferredWhenMarkerPresent() throws {
|
|
let bundled = try makeTree { root in
|
|
for dir in ["macos-universal", "macos-x86_64"] {
|
|
let d = root.appendingPathComponent(dir)
|
|
try FileManager.default.createDirectory(at: d, withIntermediateDirectories: true)
|
|
try touch(d.appendingPathComponent("instlist"))
|
|
}
|
|
}
|
|
let r = BinaryResolver(bundledRoot: bundled)
|
|
#expect(r.platformDir() == "macos-universal")
|
|
}
|
|
|
|
@Test func fallsBackToArchDir() throws {
|
|
let bundled = try makeTree { root in
|
|
let d = root.appendingPathComponent("macos-x86_64")
|
|
try FileManager.default.createDirectory(at: d, withIntermediateDirectories: true)
|
|
try touch(d.appendingPathComponent("instlist"))
|
|
}
|
|
let r = BinaryResolver(
|
|
bundledRoot: bundled,
|
|
archDirs: ["macos-universal", "macos-x86_64"]
|
|
)
|
|
#expect(r.platformDir() == "macos-x86_64")
|
|
}
|
|
|
|
@Test func missingEverythingReturnsConstructedPath() throws {
|
|
let bundled = try makeTree { _ in }
|
|
let r = BinaryResolver(bundledRoot: bundled)
|
|
// v1 semantic: path is returned; spawn surfaces the error.
|
|
#expect(r.resolve("targen").path.hasSuffix("macos-universal/targen"))
|
|
#expect(!r.exists(r.resolve("targen")))
|
|
}
|
|
|
|
@Test func mockAndGamutPaths() throws {
|
|
let r = BinaryResolver(bundledRoot: URL(fileURLWithPath: "/x"))
|
|
#expect(r.mock("chartread").path == "/x/mocks/chartread.mock")
|
|
#expect(r.referenceGamut("sRGB.gam").path == "/x/reference_gamuts/sRGB.gam")
|
|
}
|
|
}
|