99 */
1010
1111import TSCBasic
12+ import class Foundation. FileManager
13+
14+ // MARK: - user level
1215
1316extension FileSystem {
1417 /// SwiftPM directory under user's home directory (~/.swiftpm)
@@ -17,13 +20,93 @@ extension FileSystem {
1720 }
1821}
1922
23+
24+ // MARK: - cache
25+
2026extension FileSystem {
27+ private var idiomaticUserCacheDirectory : AbsolutePath ? {
28+ // in TSC: FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)
29+ self . cachesDirectory
30+ }
31+
2132 /// SwiftPM cache directory under user's caches directory (if exists)
2233 public var swiftPMCacheDirectory : AbsolutePath {
23- if let cachesDirectory = self . cachesDirectory {
24- return cachesDirectory . appending ( component: " org.swift.swiftpm " )
34+ if let path = self . idiomaticUserCacheDirectory {
35+ return path . appending ( component: " org.swift.swiftpm " )
2536 } else {
26- return self . dotSwiftPM. appending ( component: " cache " )
37+ return self . dotSwiftPMCachesDirectory
38+ }
39+ }
40+
41+ fileprivate var dotSwiftPMCachesDirectory : AbsolutePath {
42+ return self . dotSwiftPM. appending ( component: " cache " )
43+ }
44+ }
45+
46+ extension FileSystem {
47+ public func getOrCreateSwiftPMCacheDirectory( ) throws -> AbsolutePath {
48+ let idiomaticCacheDirectory = self . swiftPMCacheDirectory
49+ // Create idiomatic if necessary
50+ if !self . exists ( idiomaticCacheDirectory) {
51+ try self . createDirectory ( idiomaticCacheDirectory, recursive: true )
52+ }
53+ // Create ~/.swiftpm if necessary
54+ if !self . exists ( self . dotSwiftPM) {
55+ try self . createDirectory ( self . dotSwiftPM, recursive: true )
56+ }
57+ // Create ~/.swiftpm/cache symlink if necessary
58+ if !self . exists ( self . dotSwiftPMCachesDirectory, followSymlink: false ) {
59+ try self . createSymbolicLink ( dotSwiftPMCachesDirectory, pointingAt: idiomaticCacheDirectory, relative: false )
60+ }
61+ return idiomaticCacheDirectory
62+ }
63+ }
64+
65+ // MARK: - config
66+
67+ extension FileSystem {
68+ private var idiomaticUserConfigDirectory : AbsolutePath ? {
69+ return FileManager . default. urls ( for: . libraryDirectory, in: . userDomainMask) . first. flatMap { AbsolutePath ( $0. path) }
70+ }
71+
72+ /// SwiftPM config directory under user's config directory (if exists)
73+ public var swiftPMConfigDirectory : AbsolutePath {
74+ if let path = self . idiomaticUserConfigDirectory {
75+ return path. appending ( component: " org.swift.swiftpm " )
76+ } else {
77+ return self . dotSwiftPMConfigDirectory
78+ }
79+ }
80+
81+ fileprivate var dotSwiftPMConfigDirectory : AbsolutePath {
82+ return self . dotSwiftPM. appending ( component: " config " )
83+ }
84+ }
85+
86+ extension FileSystem {
87+ public func getOrCreateSwiftPMConfigDirectory( ) throws -> AbsolutePath {
88+ let idiomaticConfigDirectory = self . swiftPMConfigDirectory
89+
90+ // temporary 5.5, remove on next version: transition from ~/.swiftpm/config to idiomatic location + symbolic link
91+ if idiomaticConfigDirectory != self . dotSwiftPMConfigDirectory &&
92+ self . exists ( self . dotSwiftPMConfigDirectory) && self . isDirectory ( self . dotSwiftPMConfigDirectory) &&
93+ !self . exists ( idiomaticConfigDirectory) {
94+ print ( " transitioning \( self . dotSwiftPMConfigDirectory) to \( idiomaticConfigDirectory) " )
95+ try self . move ( from: self . dotSwiftPMConfigDirectory, to: idiomaticConfigDirectory)
96+ }
97+
98+ // Create idiomatic if necessary
99+ if !self . exists ( idiomaticConfigDirectory) {
100+ try self . createDirectory ( idiomaticConfigDirectory, recursive: true )
101+ }
102+ // Create ~/.swiftpm if necessary
103+ if !self . exists ( self . dotSwiftPM) {
104+ try self . createDirectory ( self . dotSwiftPM, recursive: true )
105+ }
106+ // Create ~/.swiftpm/config symlink if necessary
107+ if !self . exists ( self . dotSwiftPMConfigDirectory, followSymlink: false ) {
108+ try self . createSymbolicLink ( dotSwiftPMConfigDirectory, pointingAt: idiomaticConfigDirectory, relative: false )
27109 }
110+ return idiomaticConfigDirectory
28111 }
29112}
0 commit comments