// +build !windows package git import ( "context" "os/exec" "syscall" "time" ) func runProcessGroup(ctx context.Context, cmd *exec.Cmd) error { cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} if err := cmd.Start(); err != nil { return err } waitDone := make(chan struct{}) go func() { select { case <-ctx.Done(): syscall.Kill(-cmd.Process.Pid, syscall.SIGTERM) go func() { select { case <-waitDone: case <-time.After(10 * time.Second): syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL) } }() case <-waitDone: } }() err := cmd.Wait() close(waitDone) return err }