@@ -21,10 +21,9 @@ extension FileSystem {
2121 public var dotSwiftPM : AbsolutePath {
2222 self . homeDirectory. appending ( component: " .swiftpm " )
2323 }
24-
25- /// SwiftPM security directory
26- public var swiftPMSecurityDirectory : AbsolutePath {
27- self . dotSwiftPM. appending ( component: " security " )
24+
25+ fileprivate var idiomaticSwiftPMDirectory : AbsolutePath ? {
26+ return FileManager . default. urls ( for: . libraryDirectory, in: . userDomainMask) . first. flatMap { AbsolutePath ( $0. path) } ? . appending ( component: " org.swift.swiftpm " )
2827 }
2928}
3029
@@ -69,52 +68,113 @@ extension FileSystem {
6968 }
7069}
7170
72- // MARK: - config
71+ // MARK: - configuration
7372
7473extension FileSystem {
75- private var idiomaticUserConfigDirectory : AbsolutePath ? {
76- return FileManager . default. urls ( for: . libraryDirectory, in: . userDomainMask) . first. flatMap { AbsolutePath ( $0. path) }
77- }
78-
7974 /// SwiftPM config directory under user's config directory (if exists)
80- public var swiftPMConfigDirectory : AbsolutePath {
81- if let path = self . idiomaticUserConfigDirectory {
82- return path. appending ( component: " org.swift.swiftpm " )
75+ public var swiftPMConfigurationDirectory : AbsolutePath {
76+ if let path = self . idiomaticSwiftPMDirectory {
77+ return path. appending ( component: " configuration " )
8378 } else {
84- return self . dotSwiftPMConfigDirectory
79+ return self . dotSwiftPMConfigurationDirectory
8580 }
8681 }
8782
88- fileprivate var dotSwiftPMConfigDirectory : AbsolutePath {
89- return self . dotSwiftPM. appending ( component: " config " )
83+ fileprivate var dotSwiftPMConfigurationDirectory : AbsolutePath {
84+ return self . dotSwiftPM. appending ( component: " configuration " )
9085 }
9186}
9287
9388extension FileSystem {
94- public func getOrCreateSwiftPMConfigDirectory( ) throws -> AbsolutePath {
95- let idiomaticConfigDirectory = self . swiftPMConfigDirectory
89+ public func getOrCreateSwiftPMConfigurationDirectory( ) throws -> AbsolutePath {
90+ let idiomaticConfigurationDirectory = self . swiftPMConfigurationDirectory
91+
92+ // temporary 5.6, remove on next version: transition from previous configuration location
93+ if idiomaticConfigurationDirectory != self . dotSwiftPMConfigurationDirectory {
94+ // move content from old directory to new one but create symlink for the files for backwards compatibility (eg older xcode)
95+ if !self . exists ( idiomaticConfigurationDirectory) {
96+ try self . createDirectory ( idiomaticConfigurationDirectory, recursive: true )
97+ }
98+ let oldConfigDirectory = idiomaticConfigurationDirectory. parentDirectory
99+ let content = try self . getDirectoryContents ( oldConfigDirectory)
100+ for item in content {
101+ if self . isFile ( oldConfigDirectory. appending ( component: item) ) && !self . isSymlink ( oldConfigDirectory. appending ( component: item) ) {
102+ try self . move ( from: oldConfigDirectory. appending ( component: item) , to: idiomaticConfigurationDirectory. appending ( component: item) )
103+ try self . createSymbolicLink ( oldConfigDirectory. appending ( component: item) , pointingAt: idiomaticConfigurationDirectory. appending ( component: item) , relative: false )
104+ }
105+ }
106+ // remove old symlink
107+ let oldConfigSymlink = self . dotSwiftPM. appending ( component: " config " )
108+ if self . exists ( oldConfigSymlink, followSymlink: false ) && self . isSymlink ( oldConfigSymlink) {
109+ try self . removeFileTree ( oldConfigSymlink)
110+ }
111+ } else {
112+ // rename the old directory to the new one but create symlink for backwards compatibility (just in case someone relies on it)
113+ let oldConfigDirectory = self . dotSwiftPM. appending ( component: " config " )
114+ if self . exists ( oldConfigDirectory, followSymlink: false ) && self . isDirectory ( oldConfigDirectory) {
115+ try self . move ( from: oldConfigDirectory, to: idiomaticConfigurationDirectory)
116+ try self . createSymbolicLink ( oldConfigDirectory, pointingAt: idiomaticConfigurationDirectory, relative: false )
117+ }
118+ }
119+
120+ // Create idiomatic if necessary
121+ if !self . exists ( idiomaticConfigurationDirectory) {
122+ try self . createDirectory ( idiomaticConfigurationDirectory, recursive: true )
123+ }
124+ // Create ~/.swiftpm if necessary
125+ if !self . exists ( self . dotSwiftPM) {
126+ try self . createDirectory ( self . dotSwiftPM, recursive: true )
127+ }
128+ // Create ~/.swiftpm/configuration symlink if necessary
129+ if !self . exists ( self . dotSwiftPMConfigurationDirectory, followSymlink: false ) {
130+ try self . createSymbolicLink ( dotSwiftPMConfigurationDirectory, pointingAt: idiomaticConfigurationDirectory, relative: false )
131+ }
96132
97- // temporary 5.5, remove on next version: transition from ~/.swiftpm/config to idiomatic location + symbolic link
98- if idiomaticConfigDirectory != self . dotSwiftPMConfigDirectory &&
99- self . exists ( self . dotSwiftPMConfigDirectory) && self . isDirectory ( self . dotSwiftPMConfigDirectory) &&
100- !self . exists ( idiomaticConfigDirectory) {
101- print ( " transitioning \( self . dotSwiftPMConfigDirectory) to \( idiomaticConfigDirectory) " )
102- try self . move ( from: self . dotSwiftPMConfigDirectory, to: idiomaticConfigDirectory)
133+ return idiomaticConfigurationDirectory
134+ }
135+ }
136+
137+ // MARK: - security
138+
139+ extension FileSystem {
140+ /// SwiftPM security directory under user's security directory (if exists)
141+ public var swiftPMSecurityDirectory : AbsolutePath {
142+ if let path = self . idiomaticSwiftPMDirectory {
143+ return path. appending ( component: " security " )
144+ } else {
145+ return self . dotSwiftPMSecurityDirectory
146+ }
147+ }
148+
149+ fileprivate var dotSwiftPMSecurityDirectory : AbsolutePath {
150+ return self . dotSwiftPM. appending ( component: " security " )
151+ }
152+ }
153+
154+ extension FileSystem {
155+ public func getOrCreateSwiftPMSecurityDirectory( ) throws -> AbsolutePath {
156+ let idiomaticSecurityDirectory = self . swiftPMSecurityDirectory
157+
158+ // temporary 5.6, remove on next version: transition from ~/.swiftpm/security to idiomatic location + symbolic link
159+ if idiomaticSecurityDirectory != self . dotSwiftPMSecurityDirectory &&
160+ self . exists ( self . dotSwiftPMSecurityDirectory) &&
161+ self . isDirectory ( self . dotSwiftPMSecurityDirectory) {
162+ try self . removeFileTree ( self . dotSwiftPMSecurityDirectory)
103163 }
104164
105165 // Create idiomatic if necessary
106- if !self . exists ( idiomaticConfigDirectory ) {
107- try self . createDirectory ( idiomaticConfigDirectory , recursive: true )
166+ if !self . exists ( idiomaticSecurityDirectory ) {
167+ try self . createDirectory ( idiomaticSecurityDirectory , recursive: true )
108168 }
109169 // Create ~/.swiftpm if necessary
110170 if !self . exists ( self . dotSwiftPM) {
111171 try self . createDirectory ( self . dotSwiftPM, recursive: true )
112172 }
113- // Create ~/.swiftpm/config symlink if necessary
114- if !self . exists ( self . dotSwiftPMConfigDirectory , followSymlink: false ) {
115- try self . createSymbolicLink ( dotSwiftPMConfigDirectory , pointingAt: idiomaticConfigDirectory , relative: false )
173+ // Create ~/.swiftpm/security symlink if necessary
174+ if !self . exists ( self . dotSwiftPMSecurityDirectory , followSymlink: false ) {
175+ try self . createSymbolicLink ( dotSwiftPMSecurityDirectory , pointingAt: idiomaticSecurityDirectory , relative: false )
116176 }
117- return idiomaticConfigDirectory
177+ return idiomaticSecurityDirectory
118178 }
119179}
120180
0 commit comments