refactor: move stderr filter to unix build-tagged file

This commit is contained in:
zarazaex69
2026-05-18 10:58:04 +03:00
parent 535c3b75d1
commit 92fbe7edda
4 changed files with 60 additions and 45 deletions

View File

@@ -6,7 +6,6 @@
package main package main
import ( import (
"bufio"
"bytes" "bytes"
"context" "context"
"errors" "errors"
@@ -16,7 +15,6 @@ import (
"os" "os"
"os/signal" "os/signal"
"path/filepath" "path/filepath"
"sync"
"syscall" "syscall"
"time" "time"
@@ -47,8 +45,6 @@ var runSession = session.Run
//nolint:gochecknoglobals // Tests replace gen runner with a stub. //nolint:gochecknoglobals // Tests replace gen runner with a stub.
var runGen = execGen var runGen = execGen
var stderrFilterOnce sync.Once //nolint:gochecknoglobals // process-wide stderr fd filter
// loadedConfig bundles the parsed YAML file and the derived session config. // loadedConfig bundles the parsed YAML file and the derived session config.
type loadedConfig struct { type loadedConfig struct {
scfg session.Config scfg session.Config
@@ -339,46 +335,6 @@ func (f filteredWriter) Write(p []byte) (int, error) {
return n, nil return n, nil
} }
func installStderrFilter() {
stderrFilterOnce.Do(func() {
origFD, err := syscall.Dup(int(os.Stderr.Fd()))
if err != nil {
return
}
reader, writer, err := os.Pipe()
if err != nil {
_ = syscall.Close(origFD)
return
}
if err := syscall.Dup2(int(writer.Fd()), int(os.Stderr.Fd())); err != nil {
_ = reader.Close()
_ = writer.Close()
_ = syscall.Close(origFD)
return
}
_ = writer.Close()
os.Stderr = os.NewFile(uintptr(syscall.Stderr), "/dev/stderr")
orig := os.NewFile(uintptr(origFD), "/dev/stderr-original")
go copyFilteredStderr(reader, orig)
})
}
func copyFilteredStderr(reader *os.File, out io.Writer) {
defer func() { _ = reader.Close() }()
br := bufio.NewReader(reader)
for {
line, err := br.ReadBytes('\n')
if len(line) > 0 && !isNoisyLogLine(line) {
if _, writeErr := out.Write(line); writeErr != nil {
return
}
}
if err != nil {
return
}
}
}
func isNoisyLogLine(line []byte) bool { func isNoisyLogLine(line []byte) bool {
for _, prefix := range noisyPrefixes { for _, prefix := range noisyPrefixes {
if bytes.Contains(line, prefix) { if bytes.Contains(line, prefix) {

View File

@@ -0,0 +1,54 @@
//go:build !windows
package main
import (
"bufio"
"io"
"os"
"sync"
"golang.org/x/sys/unix"
)
var stderrFilterOnce sync.Once //nolint:gochecknoglobals // process-wide stderr fd filter
func installStderrFilter() {
stderrFilterOnce.Do(func() {
origFD, err := unix.Dup(int(os.Stderr.Fd()))
if err != nil {
return
}
reader, writer, err := os.Pipe()
if err != nil {
_ = unix.Close(origFD)
return
}
if err := unix.Dup2(int(writer.Fd()), int(os.Stderr.Fd())); err != nil {
_ = reader.Close()
_ = writer.Close()
_ = unix.Close(origFD)
return
}
_ = writer.Close()
os.Stderr = os.NewFile(uintptr(unix.Stderr), "/dev/stderr")
orig := os.NewFile(uintptr(origFD), "/dev/stderr-original")
go copyFilteredStderr(reader, orig)
})
}
func copyFilteredStderr(reader *os.File, out io.Writer) {
defer func() { _ = reader.Close() }()
br := bufio.NewReader(reader)
for {
line, err := br.ReadBytes('\n')
if len(line) > 0 && !isNoisyLogLine(line) {
if _, writeErr := out.Write(line); writeErr != nil {
return
}
}
if err != nil {
return
}
}
}

View File

@@ -0,0 +1,5 @@
//go:build windows
package main
func installStderrFilter() {}

2
go.mod
View File

@@ -18,6 +18,7 @@ require (
github.com/zarazaex69/j v0.0.0-20260516013155-bffcfe38e7d9 github.com/zarazaex69/j v0.0.0-20260516013155-bffcfe38e7d9
golang.org/x/crypto v0.50.0 golang.org/x/crypto v0.50.0
golang.org/x/mobile v0.0.0-20260410095206-2cfb76559b7b golang.org/x/mobile v0.0.0-20260410095206-2cfb76559b7b
golang.org/x/sys v0.43.0
google.golang.org/genproto v0.0.0-20260209200024-4cfbd4190f57 google.golang.org/genproto v0.0.0-20260209200024-4cfbd4190f57
gopkg.in/yaml.v3 v3.0.1 gopkg.in/yaml.v3 v3.0.1
) )
@@ -82,7 +83,6 @@ require (
golang.org/x/mod v0.35.0 // indirect golang.org/x/mod v0.35.0 // indirect
golang.org/x/net v0.53.0 // indirect golang.org/x/net v0.53.0 // indirect
golang.org/x/sync v0.20.0 // indirect golang.org/x/sync v0.20.0 // indirect
golang.org/x/sys v0.43.0 // indirect
golang.org/x/text v0.36.0 // indirect golang.org/x/text v0.36.0 // indirect
golang.org/x/time v0.15.0 // indirect golang.org/x/time v0.15.0 // indirect
golang.org/x/tools v0.44.0 // indirect golang.org/x/tools v0.44.0 // indirect