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