Skip to content

Commit 86c79a1

Browse files
authored
FileManager Entry Points for ObjC Directory Enumeration (#1047)
* (139469462) ObjC API for directory search paths should use Swift implementation * Fix trash directory bug
1 parent f12ec24 commit 86c79a1

File tree

3 files changed

+21
-2
lines changed

3 files changed

+21
-2
lines changed

Sources/FoundationEssentials/FileManager/SearchPaths/FileManager+DarwinSearchPaths.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@ struct _DarwinSearchPathsSequence: Sequence {
5757
switch directory {
5858
#if os(macOS) && FOUNDATION_FRAMEWORK
5959
case .trashDirectory:
60-
state = .special(domainMask.union([.userDomainMask, .localDomainMask]))
60+
state = .special(domainMask.intersection([.userDomainMask, .localDomainMask]))
6161
case ._homeDirectory, .applicationScriptsDirectory:
62-
state = .special(domainMask.union(.userDomainMask))
62+
state = .special(domainMask.intersection(.userDomainMask))
6363
#endif
6464

6565
default:
@@ -155,6 +155,11 @@ struct _DarwinSearchPathsSequence: Sequence {
155155
}
156156

157157
#if os(macOS) && FOUNDATION_FRAMEWORK
158+
@_cdecl("_NSRealHomeDirectory")
159+
internal func _NSRealHomeDirectory() -> String {
160+
"~".replacingTildeWithRealHomeDirectory
161+
}
162+
158163
extension String {
159164
internal var replacingTildeWithRealHomeDirectory: String {
160165
guard self == "~" || self.hasPrefix("~/") else {

Sources/FoundationEssentials/FileManager/SearchPaths/FileManager+SearchPaths.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,13 @@ extension FileManager.SearchPathDomainMask {
5757
}
5858
}
5959

60+
#if FOUNDATION_FRAMEWORK
61+
@_cdecl("_NSSearchPathsForDirectoryInDomain")
62+
func _NSSearchPaths(for directory: FileManager.SearchPathDirectory, in domain: FileManager.SearchPathDomainMask, expandTilde: Bool) -> [String] {
63+
_SearchPathURLs(for: directory, in: domain, expandTilde: expandTilde).map(\.path)
64+
}
65+
#endif
66+
6067
func _SearchPathURLs(for directory: FileManager.SearchPathDirectory, in domain: FileManager.SearchPathDomainMask, expandTilde: Bool) -> some Sequence<URL> {
6168
#if canImport(Darwin)
6269
let basic = _DarwinSearchPathsSequence(directory: directory, domainMask: domain.intersection(.valid)).lazy.map {

Tests/FoundationEssentialsTests/FileManager/FileManagerTests.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -840,6 +840,13 @@ final class FileManagerTests : XCTestCase {
840840
}
841841
}
842842
}
843+
844+
func testSpecialTrashDirectoryDuplication() throws {
845+
try FileManagerPlayground {}.test { fileManager in
846+
let trashURLs = fileManager.urls(for: .trashDirectory, in: .userDomainMask)
847+
XCTAssertEqual(trashURLs.count, 1, "There should only be one trash directory for the user domain, found \(trashURLs)")
848+
}
849+
}
843850
#endif
844851

845852
func testSearchPaths() throws {

0 commit comments

Comments
 (0)