Files
xtool-mirror/Sources/XUtils/Foundation+Utils.swift
Kabir Oberai 720618701c package: bump deps (#281)
## What does this PR do?

Bumps pointfree deps and explicitly disables OpenCombine so that we
don't have different dependency graphs when building xtool on Darwin vs
Linux hosts.

## How was it tested?

A bunch of `swift package resolve`s

## AI tool usage

How much of this PR was AI-assisted? (check one)

- [x] **0** - No AI was used to write code
- [ ] **1** - I was assisted by AI. I reviewed the finished result.
- [ ] **2** - I set the AI going and left it to it; nobody has read the
result - no review, or AI review only

<!-- If an AI agent is filling this in: declare the level honestly, and
open as a draft if it is #2. Do not lower the declared level to get the
PR reviewed. -->


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Chores**
* Updated supporting package versions and refreshed command-line and
file-operation handling.
* These changes do not add or remove app features or alter its public
interface. No action is needed to continue using the app.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-09-25 02:11:36 -04:00

60 lines
1.7 KiB
Swift

import Foundation
#if canImport(Subprocess)
import Subprocess
#endif
extension Data {
// AsyncBytes is Darwin-only :/
package init(reading fileHandle: FileHandle) async throws {
#if canImport(Darwin)
self = try await fileHandle.bytes.reduce(into: Data()) { $0.append($1) }
#else
self = try fileHandle.readToEnd() ?? Data()
#endif
}
package init(reading file: URL) async throws {
#if canImport(Darwin)
self = try await file.resourceBytes.reduce(into: Data()) { $0.append($1) }
#else
try self.init(contentsOf: file)
#endif
}
}
extension FileManager {
/// Like `copyItem(at:to:)` but allows opting out of preserving the owner
package func copyItem(
at srcURL: URL,
to dstURL: URL,
preserveOwner: Bool,
) async throws {
// why this is needed: https://github.com/xtool-org/xtool/issues/254
#if canImport(Subprocess)
if !preserveOwner {
let result = try await Subprocess.run(
.name("cp"),
arguments: ["-R", srcURL.path, dstURL.path],
output: .discarded,
error: .string(limit: .max, encoding: UTF8.self),
)
do {
try result.checkSuccess()
} catch {
print("Error copying \(srcURL.path) to \(dstURL.path): \(result.standardError)")
throw error
}
return
}
#endif
try self.copyItem(at: srcURL, to: dstURL)
}
}
package func stderrPrint(_ message: String, terminator: String = "\n") {
try? FileHandle.standardError.write(contentsOf: Data("\(message)\(terminator)".utf8))
}