os: support .set_environment() on windows too (fix #10628) (#23996)

This commit is contained in:
kbkpbot 2025-03-22 06:29:56 +08:00 committed by GitHub
parent 30c21a0fdc
commit 9fb0f8b5aa
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 47 additions and 5 deletions

View File

@ -1,5 +1,3 @@
// vtest flaky: true
// vtest retry: 3
import os
import time
@ -63,8 +61,22 @@ fn test_set_work_folder() {
assert new_parent_work_folder != child_work_folder
}
fn test_done() {
exit(0)
fn test_set_environment() {
mut p := os.new_process(test_os_process)
p.set_args(['-show_env', '-target', 'stdout'])
p.set_environment({
'V_OS_TEST_PORT': '1234567890'
})
p.set_redirect_stdio()
p.wait()
assert p.code == 0
output := p.stdout_slurp().trim_space()
p.close()
$if trace_process_output ? {
eprintln('p output: "${output}"')
}
dump(output)
assert output.contains('V_OS_TEST_PORT=1234567890')
}
fn test_run() {

View File

@ -124,8 +124,38 @@ fn (mut p Process) win_spawn_process() int {
to_be_freed << work_folder_ptr
}
mut env_block := []u16{}
if p.env.len > 0 {
mut env_ptr := &u16(unsafe { nil })
for e in p.env {
// e should in `ABC=123` format
env_ptr = e.to_wide()
if isnil(env_ptr) {
continue
}
mut i := 0
for {
character := unsafe { env_ptr[i] }
if character == 0 {
break
}
env_block << character
i++
}
env_block << u16(0)
to_be_freed << env_ptr
}
env_block << u16(0)
creation_flags |= C.CREATE_UNICODE_ENVIRONMENT
defer {
unsafe { env_block.free() }
}
}
create_process_ok := C.CreateProcessW(0, voidptr(&wdata.command_line[0]), 0, 0, C.TRUE,
creation_flags, 0, work_folder_ptr, voidptr(&start_info), voidptr(&wdata.proc_info))
creation_flags, if env_block.len > 0 { env_block.data } else { 0 }, work_folder_ptr,
voidptr(&start_info), voidptr(&wdata.proc_info))
failed_cfn_report_error(create_process_ok, 'CreateProcess')
if p.use_stdio_ctl {
close_valid_handle(&wdata.child_stdout_write)