DETACHED_PROCESS leaves the gh send-telemetry child with no console at all. When the transitive dependency thlib/go-timezone-local invokes `tzutil /g` to resolve the local IANA timezone, the console-subsystem tzutil binary allocates a fresh conhost — producing a visible window flash on every gh invocation, which accumulates as orphan terminals under terminal configurations that keep windows open on exit. CREATE_NO_WINDOW gives the child a non-visible console that descendants inherit, suppressing the flash. CREATE_NEW_PROCESS_GROUP is preserved so Ctrl+C still does not propagate to the detached telemetry child. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
24 lines
943 B
Go
24 lines
943 B
Go
//go:build windows
|
|
|
|
package telemetry
|
|
|
|
import (
|
|
"syscall"
|
|
|
|
"golang.org/x/sys/windows"
|
|
)
|
|
|
|
// detachAttrs returns SysProcAttr configured to place the child in its own
|
|
// process group so that console signals (Ctrl+C) delivered to the parent's
|
|
// group are not forwarded to the child, and to suppress any console window
|
|
// for the child and its descendants.
|
|
//
|
|
// CREATE_NO_WINDOW is preferred over DETACHED_PROCESS here: DETACHED_PROCESS
|
|
// removes the console entirely, which causes any console-subsystem descendant
|
|
// (e.g. tzutil.exe invoked transitively to resolve the local IANA timezone)
|
|
// to allocate a fresh conhost window, producing a visible flash on every gh
|
|
// invocation. CREATE_NO_WINDOW gives the child a non-visible console that
|
|
// descendants can inherit, avoiding the flash.
|
|
func detachAttrs() *syscall.SysProcAttr {
|
|
return &syscall.SysProcAttr{CreationFlags: windows.CREATE_NEW_PROCESS_GROUP | windows.CREATE_NO_WINDOW}
|
|
}
|