@@ -23,6 +23,13 @@ import Dispatch
23
23
24
24
import _Concurrency
25
25
26
+ #if os(Windows)
27
+ public typealias ProcessEnvironmentBlock = Dictionary < CaseInsensitiveString , String >
28
+ #else
29
+ public typealias ProcessEnvironmentBlock = Dictionary < String , String >
30
+ #endif
31
+
32
+
26
33
/// Process result data which is available after process termination.
27
34
public struct ProcessResult : CustomStringConvertible , Sendable {
28
35
@@ -53,7 +60,7 @@ public struct ProcessResult: CustomStringConvertible, Sendable {
53
60
public let arguments : [ String ]
54
61
55
62
/// The environment with which the process was launched.
56
- public let environment : [ String : String ]
63
+ public let environment : ProcessEnvironmentBlock
57
64
58
65
/// The exit status of the process.
59
66
public let exitStatus : ExitStatus
@@ -71,7 +78,7 @@ public struct ProcessResult: CustomStringConvertible, Sendable {
71
78
/// See `waitpid(2)` for information on the exit status code.
72
79
public init (
73
80
arguments: [ String ] ,
74
- environment: [ String : String ] ,
81
+ environment: ProcessEnvironmentBlock ,
75
82
exitStatusCode: Int32 ,
76
83
normal: Bool ,
77
84
output: Result < [ UInt8 ] , Swift . Error > ,
@@ -99,7 +106,7 @@ public struct ProcessResult: CustomStringConvertible, Sendable {
99
106
/// Create an instance using an exit status and output result.
100
107
public init (
101
108
arguments: [ String ] ,
102
- environment: [ String : String ] ,
109
+ environment: ProcessEnvironmentBlock ,
103
110
exitStatus: ExitStatus ,
104
111
output: Result < [ UInt8 ] , Swift . Error > ,
105
112
stderrOutput: Result < [ UInt8 ] , Swift . Error >
@@ -285,7 +292,7 @@ public final class Process {
285
292
public let arguments : [ String ]
286
293
287
294
/// The environment with which the process was executed.
288
- public let environment : [ String : String ]
295
+ public let environment : ProcessEnvironmentBlock
289
296
290
297
/// The path to the directory under which to run the process.
291
298
public let workingDirectory : AbsolutePath ?
@@ -359,7 +366,7 @@ public final class Process {
359
366
@available ( macOS 10 . 15 , * )
360
367
public init (
361
368
arguments: [ String ] ,
362
- environment: [ String : String ] = ProcessEnv . vars,
369
+ environment: ProcessEnvironmentBlock = ProcessEnv . vars,
363
370
workingDirectory: AbsolutePath ,
364
371
outputRedirection: OutputRedirection = . collect,
365
372
startNewProcessGroup: Bool = true ,
@@ -379,7 +386,7 @@ public final class Process {
379
386
@available ( macOS 10 . 15 , * )
380
387
public convenience init (
381
388
arguments: [ String ] ,
382
- environment: [ String : String ] = ProcessEnv . vars,
389
+ environment: ProcessEnvironmentBlock = ProcessEnv . vars,
383
390
workingDirectory: AbsolutePath ,
384
391
outputRedirection: OutputRedirection = . collect,
385
392
verbose: Bool ,
@@ -411,7 +418,7 @@ public final class Process {
411
418
/// - loggingHandler: Handler for logging messages
412
419
public init (
413
420
arguments: [ String ] ,
414
- environment: [ String : String ] = ProcessEnv . vars,
421
+ environment: ProcessEnvironmentBlock = ProcessEnv . vars,
415
422
outputRedirection: OutputRedirection = . collect,
416
423
startNewProcessGroup: Bool = true ,
417
424
loggingHandler: LoggingHandler ? = . none
@@ -428,7 +435,7 @@ public final class Process {
428
435
@available ( * , deprecated, message: " use version without verbosity flag " )
429
436
public convenience init (
430
437
arguments: [ String ] ,
431
- environment: [ String : String ] = ProcessEnv . vars,
438
+ environment: ProcessEnvironmentBlock = ProcessEnv . vars,
432
439
outputRedirection: OutputRedirection = . collect,
433
440
verbose: Bool = Process . verbose,
434
441
startNewProcessGroup: Bool = true
@@ -444,7 +451,7 @@ public final class Process {
444
451
445
452
public convenience init (
446
453
args: String ... ,
447
- environment: [ String : String ] = ProcessEnv . vars,
454
+ environment: ProcessEnvironmentBlock = ProcessEnv . vars,
448
455
outputRedirection: OutputRedirection = . collect,
449
456
loggingHandler: LoggingHandler ? = . none
450
457
) {
@@ -536,7 +543,13 @@ public final class Process {
536
543
process. currentDirectoryURL = workingDirectory. asURL
537
544
}
538
545
process. executableURL = executablePath. asURL
546
+ #if os(Windows)
547
+ process. environment = . init( uniqueKeysWithValues: environment. map {
548
+ ( $0. value, $1)
549
+ } )
550
+ #else
539
551
process. environment = environment
552
+ #endif
540
553
541
554
let stdinPipe = Pipe ( )
542
555
process. standardInput = stdinPipe
@@ -989,7 +1002,7 @@ extension Process {
989
1002
@available ( macOS 10 . 15 , iOS 13 . 0 , tvOS 13 . 0 , watchOS 6 . 0 , * )
990
1003
static public func popen(
991
1004
arguments: [ String ] ,
992
- environment: [ String : String ] = ProcessEnv . vars,
1005
+ environment: ProcessEnvironmentBlock = ProcessEnv . vars,
993
1006
loggingHandler: LoggingHandler ? = . none
994
1007
) async throws -> ProcessResult {
995
1008
let process = Process (
@@ -1012,7 +1025,7 @@ extension Process {
1012
1025
@available ( macOS 10 . 15 , iOS 13 . 0 , tvOS 13 . 0 , watchOS 6 . 0 , * )
1013
1026
static public func popen(
1014
1027
args: String ... ,
1015
- environment: [ String : String ] = ProcessEnv . vars,
1028
+ environment: ProcessEnvironmentBlock = ProcessEnv . vars,
1016
1029
loggingHandler: LoggingHandler ? = . none
1017
1030
) async throws -> ProcessResult {
1018
1031
try await popen ( arguments: args, environment: environment, loggingHandler: loggingHandler)
@@ -1030,7 +1043,7 @@ extension Process {
1030
1043
@discardableResult
1031
1044
static public func checkNonZeroExit(
1032
1045
arguments: [ String ] ,
1033
- environment: [ String : String ] = ProcessEnv . vars,
1046
+ environment: ProcessEnvironmentBlock = ProcessEnv . vars,
1034
1047
loggingHandler: LoggingHandler ? = . none
1035
1048
) async throws -> String {
1036
1049
let result = try await popen ( arguments: arguments, environment: environment, loggingHandler: loggingHandler)
@@ -1053,7 +1066,7 @@ extension Process {
1053
1066
@discardableResult
1054
1067
static public func checkNonZeroExit(
1055
1068
args: String ... ,
1056
- environment: [ String : String ] = ProcessEnv . vars,
1069
+ environment: ProcessEnvironmentBlock = ProcessEnv . vars,
1057
1070
loggingHandler: LoggingHandler ? = . none
1058
1071
) async throws -> String {
1059
1072
try await checkNonZeroExit ( arguments: args, environment: environment, loggingHandler: loggingHandler)
@@ -1075,7 +1088,7 @@ extension Process {
1075
1088
// #endif
1076
1089
static public func popen(
1077
1090
arguments: [ String ] ,
1078
- environment: [ String : String ] = ProcessEnv . vars,
1091
+ environment: ProcessEnvironmentBlock = ProcessEnv . vars,
1079
1092
loggingHandler: LoggingHandler ? = . none,
1080
1093
queue: DispatchQueue ? = nil ,
1081
1094
completion: @escaping ( Result < ProcessResult , Swift . Error > ) -> Void
@@ -1113,7 +1126,7 @@ extension Process {
1113
1126
@discardableResult
1114
1127
static public func popen(
1115
1128
arguments: [ String ] ,
1116
- environment: [ String : String ] = ProcessEnv . vars,
1129
+ environment: ProcessEnvironmentBlock = ProcessEnv . vars,
1117
1130
loggingHandler: LoggingHandler ? = . none
1118
1131
) throws -> ProcessResult {
1119
1132
let process = Process (
@@ -1140,7 +1153,7 @@ extension Process {
1140
1153
@discardableResult
1141
1154
static public func popen(
1142
1155
args: String ... ,
1143
- environment: [ String : String ] = ProcessEnv . vars,
1156
+ environment: ProcessEnvironmentBlock = ProcessEnv . vars,
1144
1157
loggingHandler: LoggingHandler ? = . none
1145
1158
) throws -> ProcessResult {
1146
1159
return try Process . popen ( arguments: args, environment: environment, loggingHandler: loggingHandler)
@@ -1160,7 +1173,7 @@ extension Process {
1160
1173
@discardableResult
1161
1174
static public func checkNonZeroExit(
1162
1175
arguments: [ String ] ,
1163
- environment: [ String : String ] = ProcessEnv . vars,
1176
+ environment: ProcessEnvironmentBlock = ProcessEnv . vars,
1164
1177
loggingHandler: LoggingHandler ? = . none
1165
1178
) throws -> String {
1166
1179
let process = Process (
@@ -1192,7 +1205,7 @@ extension Process {
1192
1205
@discardableResult
1193
1206
static public func checkNonZeroExit(
1194
1207
args: String ... ,
1195
- environment: [ String : String ] = ProcessEnv . vars,
1208
+ environment: ProcessEnvironmentBlock = ProcessEnv . vars,
1196
1209
loggingHandler: LoggingHandler ? = . none
1197
1210
) throws -> String {
1198
1211
return try checkNonZeroExit ( arguments: args, environment: environment, loggingHandler: loggingHandler)
0 commit comments