@@ -21,10 +21,9 @@ extension FileSystem {
21
21
public var dotSwiftPM : AbsolutePath {
22
22
self . homeDirectory. appending ( component: " .swiftpm " )
23
23
}
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 " )
28
27
}
29
28
}
30
29
@@ -69,52 +68,117 @@ extension FileSystem {
69
68
}
70
69
}
71
70
72
- // MARK: - config
71
+ // MARK: - configuration
73
72
74
73
extension FileSystem {
75
- private var idiomaticUserConfigDirectory : AbsolutePath ? {
74
+ /* private var idiomaticUserConfigDirectory: AbsolutePath? {
76
75
return FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).first.flatMap { AbsolutePath($0.path) }
77
- }
76
+ }*/
78
77
79
78
/// 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 " )
79
+ public var swiftPMConfigurationDirectory : AbsolutePath {
80
+ if let path = self . idiomaticSwiftPMDirectory {
81
+ return path. appending ( component: " configuration " )
83
82
} else {
84
- return self . dotSwiftPMConfigDirectory
83
+ return self . dotSwiftPMConfigurationDirectory
85
84
}
86
85
}
87
86
88
- fileprivate var dotSwiftPMConfigDirectory : AbsolutePath {
89
- return self . dotSwiftPM. appending ( component: " config " )
87
+ fileprivate var dotSwiftPMConfigurationDirectory : AbsolutePath {
88
+ return self . dotSwiftPM. appending ( component: " configuration " )
89
+ }
90
+ }
91
+
92
+ extension FileSystem {
93
+ public func getOrCreateSwiftPMConfigurationDirectory( ) throws -> AbsolutePath {
94
+ let idiomaticConfigurationDirectory = self . swiftPMConfigurationDirectory
95
+
96
+ // temporary 5.6, remove on next version: transition from previous configuration location
97
+ if idiomaticConfigurationDirectory != self . dotSwiftPMConfigurationDirectory {
98
+ // move content from old directory to new one but create symlink for the files for backwards compatibility (eg older xcode)
99
+ if !self . exists ( idiomaticConfigurationDirectory) {
100
+ try self . createDirectory ( idiomaticConfigurationDirectory, recursive: true )
101
+ }
102
+ let oldConfigDirectory = idiomaticConfigurationDirectory. parentDirectory
103
+ let content = try self . getDirectoryContents ( oldConfigDirectory)
104
+ for item in content {
105
+ if self . isFile ( oldConfigDirectory. appending ( component: item) ) && !self . isSymlink ( oldConfigDirectory. appending ( component: item) ) {
106
+ try self . move ( from: oldConfigDirectory. appending ( component: item) , to: idiomaticConfigurationDirectory. appending ( component: item) )
107
+ try self . createSymbolicLink ( oldConfigDirectory. appending ( component: item) , pointingAt: idiomaticConfigurationDirectory. appending ( component: item) , relative: false )
108
+ }
109
+ }
110
+ // remove old symlink
111
+ let oldConfigSymlink = self . dotSwiftPM. appending ( component: " config " )
112
+ if self . exists ( oldConfigSymlink, followSymlink: false ) && self . isSymlink ( oldConfigSymlink) {
113
+ try self . removeFileTree ( oldConfigSymlink)
114
+ }
115
+ } else {
116
+ // rename the old directory to the new one but create symlink for backwards compatibility (just in case someone relies on it)
117
+ let oldConfigDirectory = self . dotSwiftPM. appending ( component: " config " )
118
+ if self . exists ( oldConfigDirectory, followSymlink: false ) && self . isDirectory ( oldConfigDirectory) {
119
+ try self . move ( from: oldConfigDirectory, to: idiomaticConfigurationDirectory)
120
+ try self . createSymbolicLink ( oldConfigDirectory, pointingAt: idiomaticConfigurationDirectory, relative: false )
121
+ }
122
+ }
123
+
124
+ // Create idiomatic if necessary
125
+ if !self . exists ( idiomaticConfigurationDirectory) {
126
+ try self . createDirectory ( idiomaticConfigurationDirectory, recursive: true )
127
+ }
128
+ // Create ~/.swiftpm if necessary
129
+ if !self . exists ( self . dotSwiftPM) {
130
+ try self . createDirectory ( self . dotSwiftPM, recursive: true )
131
+ }
132
+ // Create ~/.swiftpm/configuration symlink if necessary
133
+ if !self . exists ( self . dotSwiftPMConfigurationDirectory, followSymlink: false ) {
134
+ try self . createSymbolicLink ( dotSwiftPMConfigurationDirectory, pointingAt: idiomaticConfigurationDirectory, relative: false )
135
+ }
136
+
137
+ return idiomaticConfigurationDirectory
90
138
}
91
139
}
92
140
141
+ // MARK: - security
142
+
93
143
extension FileSystem {
94
- public func getOrCreateSwiftPMConfigDirectory( ) throws -> AbsolutePath {
95
- let idiomaticConfigDirectory = self . swiftPMConfigDirectory
144
+ /// SwiftPM security directory under user's security directory (if exists)
145
+ public var swiftPMSecurityDirectory : AbsolutePath {
146
+ if let path = self . idiomaticSwiftPMDirectory {
147
+ return path. appending ( component: " security " )
148
+ } else {
149
+ return self . dotSwiftPMSecurityDirectory
150
+ }
151
+ }
96
152
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)
153
+ fileprivate var dotSwiftPMSecurityDirectory : AbsolutePath {
154
+ return self . dotSwiftPM. appending ( component: " security " )
155
+ }
156
+ }
157
+
158
+ extension FileSystem {
159
+ public func getOrCreateSwiftPMSecurityDirectory( ) throws -> AbsolutePath {
160
+ let idiomaticSecurityDirectory = self . swiftPMSecurityDirectory
161
+
162
+ // temporary 5.6, remove on next version: transition from ~/.swiftpm/security to idiomatic location + symbolic link
163
+ if idiomaticSecurityDirectory != self . dotSwiftPMSecurityDirectory &&
164
+ self . exists ( self . dotSwiftPMSecurityDirectory) &&
165
+ self . isDirectory ( self . dotSwiftPMSecurityDirectory) {
166
+ try self . removeFileTree ( self . dotSwiftPMSecurityDirectory)
103
167
}
104
168
105
169
// Create idiomatic if necessary
106
- if !self . exists ( idiomaticConfigDirectory ) {
107
- try self . createDirectory ( idiomaticConfigDirectory , recursive: true )
170
+ if !self . exists ( idiomaticSecurityDirectory ) {
171
+ try self . createDirectory ( idiomaticSecurityDirectory , recursive: true )
108
172
}
109
173
// Create ~/.swiftpm if necessary
110
174
if !self . exists ( self . dotSwiftPM) {
111
175
try self . createDirectory ( self . dotSwiftPM, recursive: true )
112
176
}
113
- // Create ~/.swiftpm/config symlink if necessary
114
- if !self . exists ( self . dotSwiftPMConfigDirectory , followSymlink: false ) {
115
- try self . createSymbolicLink ( dotSwiftPMConfigDirectory , pointingAt: idiomaticConfigDirectory , relative: false )
177
+ // Create ~/.swiftpm/security symlink if necessary
178
+ if !self . exists ( self . dotSwiftPMSecurityDirectory , followSymlink: false ) {
179
+ try self . createSymbolicLink ( dotSwiftPMSecurityDirectory , pointingAt: idiomaticSecurityDirectory , relative: false )
116
180
}
117
- return idiomaticConfigDirectory
181
+ return idiomaticSecurityDirectory
118
182
}
119
183
}
120
184
0 commit comments