@@ -18,6 +18,7 @@ import PackageGraph
1818
1919import func XCTest. XCTFail
2020
21+ import enum TSCBasic. ProcessEnv
2122import struct TSCUtility. Version
2223
2324public enum MockManifestLoaderError : Swift . Error {
@@ -88,7 +89,7 @@ extension ManifestLoader {
8889 dependencyMapper: DependencyMapper ? = . none,
8990 fileSystem: FileSystem ,
9091 observabilityScope: ObservabilityScope
91- ) throws -> Manifest {
92+ ) async throws -> Manifest {
9293 let packageIdentity : PackageIdentity
9394 let packageLocation : String
9495 switch packageKind {
@@ -109,27 +110,23 @@ extension ManifestLoader {
109110 // FIXME: placeholder
110111 packageLocation = identity. description
111112 }
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+ )
129127 }
130128}
131129
132-
133130extension ManifestLoader {
134131 public func load(
135132 packagePath: AbsolutePath ,
@@ -139,7 +136,7 @@ extension ManifestLoader {
139136 dependencyMapper: DependencyMapper ? = . none,
140137 fileSystem: FileSystem ,
141138 observabilityScope: ObservabilityScope
142- ) throws -> Manifest {
139+ ) async throws -> Manifest {
143140 let packageIdentity : PackageIdentity
144141 let packageLocation : String
145142 switch packageKind {
@@ -160,22 +157,44 @@ extension ManifestLoader {
160157 // FIXME: placeholder
161158 packageLocation = identity. description
162159 }
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)
179193 }
194+ try await body ( )
195+ } catch {
196+ try ? restore ( )
197+ throw error
180198 }
199+ try restore ( )
181200}
0 commit comments