@@ -18,6 +18,7 @@ import PackageGraph
18
18
19
19
import func XCTest. XCTFail
20
20
21
+ import enum TSCBasic. ProcessEnv
21
22
import struct TSCUtility. Version
22
23
23
24
public enum MockManifestLoaderError : Swift . Error {
@@ -88,7 +89,7 @@ extension ManifestLoader {
88
89
dependencyMapper: DependencyMapper ? = . none,
89
90
fileSystem: FileSystem ,
90
91
observabilityScope: ObservabilityScope
91
- ) throws -> Manifest {
92
+ ) async throws -> Manifest {
92
93
let packageIdentity : PackageIdentity
93
94
let packageLocation : String
94
95
switch packageKind {
@@ -109,27 +110,23 @@ extension ManifestLoader {
109
110
// FIXME: placeholder
110
111
packageLocation = identity. description
111
112
}
112
- return try temp_await {
113
- self . load (
114
- manifestPath: manifestPath,
115
- manifestToolsVersion: manifestToolsVersion,
116
- packageIdentity: packageIdentity,
117
- packageKind: packageKind,
118
- packageLocation: packageLocation,
119
- packageVersion: nil ,
120
- identityResolver: identityResolver,
121
- dependencyMapper: dependencyMapper ?? DefaultDependencyMapper ( identityResolver: identityResolver) ,
122
- fileSystem: fileSystem,
123
- observabilityScope: observabilityScope,
124
- delegateQueue: . sharedConcurrent,
125
- callbackQueue: . sharedConcurrent,
126
- completion: $0
127
- )
128
- }
113
+ return try await self . load (
114
+ manifestPath: manifestPath,
115
+ manifestToolsVersion: manifestToolsVersion,
116
+ packageIdentity: packageIdentity,
117
+ packageKind: packageKind,
118
+ packageLocation: packageLocation,
119
+ packageVersion: nil ,
120
+ identityResolver: identityResolver,
121
+ dependencyMapper: dependencyMapper ?? DefaultDependencyMapper ( identityResolver: identityResolver) ,
122
+ fileSystem: fileSystem,
123
+ observabilityScope: observabilityScope,
124
+ delegateQueue: . sharedConcurrent,
125
+ callbackQueue: . sharedConcurrent
126
+ )
129
127
}
130
128
}
131
129
132
-
133
130
extension ManifestLoader {
134
131
public func load(
135
132
packagePath: AbsolutePath ,
@@ -139,7 +136,7 @@ extension ManifestLoader {
139
136
dependencyMapper: DependencyMapper ? = . none,
140
137
fileSystem: FileSystem ,
141
138
observabilityScope: ObservabilityScope
142
- ) throws -> Manifest {
139
+ ) async throws -> Manifest {
143
140
let packageIdentity : PackageIdentity
144
141
let packageLocation : String
145
142
switch packageKind {
@@ -160,22 +157,44 @@ extension ManifestLoader {
160
157
// FIXME: placeholder
161
158
packageLocation = identity. description
162
159
}
163
- return try temp_await {
164
- self . load (
165
- packagePath: packagePath,
166
- packageIdentity: packageIdentity,
167
- packageKind: packageKind,
168
- packageLocation: packageLocation,
169
- packageVersion: nil ,
170
- currentToolsVersion: currentToolsVersion,
171
- identityResolver: identityResolver,
172
- dependencyMapper: dependencyMapper ?? DefaultDependencyMapper ( identityResolver: identityResolver) ,
173
- fileSystem: fileSystem,
174
- observabilityScope: observabilityScope,
175
- delegateQueue: . sharedConcurrent,
176
- callbackQueue: . sharedConcurrent,
177
- completion: $0
178
- )
160
+ return try await self . load (
161
+ packagePath: packagePath,
162
+ packageIdentity: packageIdentity,
163
+ packageKind: packageKind,
164
+ packageLocation: packageLocation,
165
+ packageVersion: nil ,
166
+ currentToolsVersion: currentToolsVersion,
167
+ identityResolver: identityResolver,
168
+ dependencyMapper: dependencyMapper ?? DefaultDependencyMapper ( identityResolver: identityResolver) ,
169
+ fileSystem: fileSystem,
170
+ observabilityScope: observabilityScope,
171
+ delegateQueue: . sharedConcurrent,
172
+ callbackQueue: . sharedConcurrent
173
+ )
174
+ }
175
+ }
176
+
177
+ /// Temporary override environment variables
178
+ ///
179
+ /// WARNING! This method is not thread-safe. POSIX environments are shared
180
+ /// between threads. This means that when this method is called simultaneously
181
+ /// from different threads, the environment will neither be setup nor restored
182
+ /// correctly.
183
+ public func withCustomEnv( _ env: [ String : String ] , body: ( ) async throws -> Void ) async throws {
184
+ let state = env. map { ( $0, $1) }
185
+ let restore = {
186
+ for (key, value) in state {
187
+ try ProcessEnv . setVar ( key, value: value)
188
+ }
189
+ }
190
+ do {
191
+ for (key, value) in env {
192
+ try ProcessEnv . setVar ( key, value: value)
179
193
}
194
+ try await body ( )
195
+ } catch {
196
+ try ? restore ( )
197
+ throw error
180
198
}
199
+ try restore ( )
181
200
}
0 commit comments