Build from source
macSCP is a Swift package. You need Swift 6 (swift-tools 6.0) and macOS 15 or newer.
swift build -c releaseThe binary lands at .build/release/macscp-cli — the app’s CLI companion — and scripts/package-app assembles a runnable macSCP.app under dist/.
swift testThe unit suite runs everywhere. Two suites are gated behind environment variables because they need more than a plain checkout:
docker compose -f docker/test-server/compose.yml up -dMACSCP_ITEST=1 swift testThe Docker rig brings up SSH (two servers, for remote-to-remote transfers), MinIO (S3), and an Apache/mod_dav WebDAV server with a Basic, a Digest, and a TLS vhost — the TLS certificate is generated fresh at container start and never committed. A Nextcloud container sits behind a compose profile, since it exists only to produce one real PROPFIND response the WebDAV parser’s test fixture is checked against — it stays out of the normal up -d so that command remains fast:
docker compose -f docker/test-server/compose.yml --profile nextcloud up -d nextcloudThe gated suites
Section titled “The gated suites”| Variable | What it gates |
|---|---|
MACSCP_ITEST=1 | Integration tests against the Docker SSH/S3/WebDAV rig. |
MACSCP_KEYCHAIN=1 | Tests that write to the real macOS Keychain. |
MACSCP_PIPE_TIMING=1 | One gated case that counts pipe chunks from the CLI’s line-buffered stdout. |
MACSCP_SATURATION=1 | One test that parks the whole GCD global queue to prove the subprocess runner’s readers need no thread — run it alone, it cannot share a parallel run. |
Contributing
Section titled “Contributing”Issues and pull requests are welcome at github.com/NoiXdev/macSCP. The project uses Conventional Commits; the commit messages and all code comments are English.