Fix copy(into:) overwrite mode
Seems like Linux Foundation has a bug I checked, seems fixed in Swift 5. But added a swift version check se we can verify and if not report the bug.
This commit is contained in:
@@ -7,7 +7,7 @@ public extension Path {
|
|||||||
- Parameter to: Destination filename.
|
- Parameter to: Destination filename.
|
||||||
- Parameter overwrite: If true overwrites any file that already exists at `to`.
|
- Parameter overwrite: If true overwrites any file that already exists at `to`.
|
||||||
- Returns: `to` to allow chaining
|
- Returns: `to` to allow chaining
|
||||||
- SeeAlso: copy(into:overwrite:)
|
- SeeAlso: `copy(into:overwrite:)`
|
||||||
*/
|
*/
|
||||||
@discardableResult
|
@discardableResult
|
||||||
public func copy(to: Path, overwrite: Bool = false) throws -> Path {
|
public func copy(to: Path, overwrite: Bool = false) throws -> Path {
|
||||||
@@ -30,16 +30,26 @@ public extension Path {
|
|||||||
- Parameter into: Destination directory
|
- Parameter into: Destination directory
|
||||||
- Parameter overwrite: If true overwrites any file that already exists at `into`.
|
- Parameter overwrite: If true overwrites any file that already exists at `into`.
|
||||||
- Returns: The `Path` of the newly copied file.
|
- Returns: The `Path` of the newly copied file.
|
||||||
- SeeAlso: copy(into:overwrite:)
|
- SeeAlso: `copy(into:overwrite:)`
|
||||||
*/
|
*/
|
||||||
@discardableResult
|
@discardableResult
|
||||||
public func copy(into: Path, overwrite: Bool = false) throws -> Path {
|
public func copy(into: Path, overwrite: Bool = false) throws -> Path {
|
||||||
if !into.exists {
|
if !into.exists {
|
||||||
try FileManager.default.createDirectory(at: url, withIntermediateDirectories: true)
|
try FileManager.default.createDirectory(at: url, withIntermediateDirectories: true)
|
||||||
} else if overwrite, !into.isDirectory {
|
|
||||||
try into.delete()
|
|
||||||
}
|
}
|
||||||
let rv = into/basename()
|
let rv = into/basename()
|
||||||
|
if overwrite, rv.isFile {
|
||||||
|
try rv.delete()
|
||||||
|
}
|
||||||
|
#if os(Linux)
|
||||||
|
#if swift(>=5)
|
||||||
|
// check if fixed
|
||||||
|
#else
|
||||||
|
if !overwrite, rv.isFile {
|
||||||
|
throw CocoaError.error(.fileWriteFileExists)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
try FileManager.default.copyItem(at: url, to: rv.url)
|
try FileManager.default.copyItem(at: url, to: rv.url)
|
||||||
return rv
|
return rv
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -138,4 +138,15 @@ class PathTests: XCTestCase {
|
|||||||
XCTAssertEqual(Path.root/"a/foo"/"../../bar", Path.root/"bar")
|
XCTAssertEqual(Path.root/"a/foo"/"../../bar", Path.root/"bar")
|
||||||
XCTAssertEqual(Path.root/"a/foo"/"../../../bar", Path.root/"bar")
|
XCTAssertEqual(Path.root/"a/foo"/"../../../bar", Path.root/"bar")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testCopyInto() throws {
|
||||||
|
try Path.mktemp { root in
|
||||||
|
let bar = try root.join("bar").touch()
|
||||||
|
try Path.mktemp { root in
|
||||||
|
try root.join("bar").touch()
|
||||||
|
XCTAssertThrowsError(try bar.copy(into: root))
|
||||||
|
try bar.copy(into: root, overwrite: true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ extension PathTests {
|
|||||||
("testBasename", testBasename),
|
("testBasename", testBasename),
|
||||||
("testCodable", testCodable),
|
("testCodable", testCodable),
|
||||||
("testConcatenation", testConcatenation),
|
("testConcatenation", testConcatenation),
|
||||||
|
("testCopyInto", testCopyInto),
|
||||||
("testEnumeration", testEnumeration),
|
("testEnumeration", testEnumeration),
|
||||||
("testEnumerationSkippingHiddenFiles", testEnumerationSkippingHiddenFiles),
|
("testEnumerationSkippingHiddenFiles", testEnumerationSkippingHiddenFiles),
|
||||||
("testExists", testExists),
|
("testExists", testExists),
|
||||||
|
|||||||
Reference in New Issue
Block a user