Skip to content

Commit db10408

Browse files
authored
(140820778) Darwin SearchPaths without expanding tilde produce non-tilde-based paths (#1069)
1 parent 4f6c892 commit db10408

File tree

2 files changed

+41
-27
lines changed

2 files changed

+41
-27
lines changed

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

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -57,20 +57,39 @@ extension FileManager.SearchPathDomainMask {
5757
}
5858
}
5959

60+
func _SearchPathURLs(for directory: FileManager.SearchPathDirectory, in domain: FileManager.SearchPathDomainMask, expandTilde: Bool) -> some Sequence<URL> {
61+
#if canImport(Darwin)
62+
_DarwinSearchPaths(for: directory, in: domain, expandTilde: expandTilde).map {
63+
URL(filePath: $0, directoryHint: .isDirectory)
64+
}
65+
#else
66+
var result = Set<URL>()
67+
var domain = domain.intersection(.valid)
68+
while let currentDomain = domain.firstMask {
69+
domain.remove(currentDomain)
70+
#if os(Windows)
71+
let url = _WindowsSearchPathURL(for: directory, in: currentDomain)
72+
#else
73+
let url = _XDGSearchPathURL(for: directory, in: currentDomain)
74+
#endif
75+
if let url {
76+
result.insert(url)
77+
}
78+
}
79+
return result
80+
#endif
81+
}
82+
83+
#if canImport(Darwin)
6084
#if FOUNDATION_FRAMEWORK
6185
@_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-
}
6586
#endif
66-
67-
func _SearchPathURLs(for directory: FileManager.SearchPathDirectory, in domain: FileManager.SearchPathDomainMask, expandTilde: Bool) -> some Sequence<URL> {
68-
#if canImport(Darwin)
87+
func _DarwinSearchPaths(for directory: FileManager.SearchPathDirectory, in domain: FileManager.SearchPathDomainMask, expandTilde: Bool) -> [String] {
6988
let basic = _DarwinSearchPathsSequence(directory: directory, domainMask: domain.intersection(.valid)).lazy.map {
7089
if expandTilde {
71-
return URL(filePath: $0.expandingTildeInPath, directoryHint: .isDirectory)
90+
$0.expandingTildeInPath
7291
} else {
73-
return URL(filePath: $0, directoryHint: .isDirectory)
92+
$0
7493
}
7594
}
7695

@@ -80,32 +99,17 @@ func _SearchPathURLs(for directory: FileManager.SearchPathDirectory, in domain:
8099
if domain.contains(._sharedUserDomainMask) || compatibleSharedUserDomainMask {
81100
var result = Array(basic)
82101
for path in _DarwinSearchPathsSequence(directory: directory, domainMask: .userDomainMask) {
83-
let expandedURL = URL(filePath: expandTilde ? path.replacingTildeWithRealHomeDirectory : path, directoryHint: .isDirectory)
102+
let expandedPath = expandTilde ? path.replacingTildeWithRealHomeDirectory : path
84103
// Avoid duplicates, which would occur with (NSUserDomainMask | NSSharedUserDomainMask) in non-sandboxed apps.
85-
if !result.contains(expandedURL) {
104+
if !result.contains(expandedPath) {
86105
// Insert this path after NSUserDomainMask and before any of the more general paths.
87106
let insertionIndex = domain.contains(.userDomainMask) ? 1 : 0
88-
result.insert(expandedURL, at: insertionIndex)
107+
result.insert(expandedPath, at: insertionIndex)
89108
}
90109
}
91110
return result
92111
}
93112
#endif
94113
return Array(basic)
95-
#else
96-
var result = Set<URL>()
97-
var domain = domain.intersection(.valid)
98-
while let currentDomain = domain.firstMask {
99-
domain.remove(currentDomain)
100-
#if os(Windows)
101-
let url = _WindowsSearchPathURL(for: directory, in: currentDomain)
102-
#else
103-
let url = _XDGSearchPathURL(for: directory, in: currentDomain)
104-
#endif
105-
if let url {
106-
result.insert(url)
107-
}
108-
}
109-
return result
110-
#endif
111114
}
115+
#endif

Tests/FoundationEssentialsTests/FileManager/FileManagerTests.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1049,6 +1049,16 @@ final class FileManagerTests : XCTestCase {
10491049
XCTAssertEqual(FileManager.default.homeDirectory(forUser: UUID().uuidString), fallbackPath)
10501050
#endif
10511051
}
1052+
1053+
func testSearchPathsWithoutExpandingTilde() throws {
1054+
#if !canImport(Darwin)
1055+
throw XCTSkip("This test is not applicable for this platform")
1056+
#else
1057+
for path in _DarwinSearchPaths(for: .libraryDirectory, in: .userDomainMask, expandTilde: false) {
1058+
XCTAssertTrue(path.starts(with: "~/"), "Path '\(path)' did not start with ~/ as expected")
1059+
}
1060+
#endif
1061+
}
10521062

10531063
func testWindowsDirectoryCreationCrash() throws {
10541064
try FileManagerPlayground {

0 commit comments

Comments
 (0)