@@ -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,113 @@ 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 " )
90
85
}
91
86
}
92
87
93
88
extension 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
+ }
96
132
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)
103
163
}
104
164
105
165
// 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 )
108
168
}
109
169
// Create ~/.swiftpm if necessary
110
170
if !self . exists ( self . dotSwiftPM) {
111
171
try self . createDirectory ( self . dotSwiftPM, recursive: true )
112
172
}
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 )
116
176
}
117
- return idiomaticConfigDirectory
177
+ return idiomaticSecurityDirectory
118
178
}
119
179
}
120
180
0 commit comments