exec.go 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package exe
  2. import (
  3. "errors"
  4. "os"
  5. "os/exec"
  6. "strings"
  7. "syscall"
  8. "github.com/Jguer/yay/v12/pkg/text"
  9. )
  10. type Runner interface {
  11. Capture(cmd *exec.Cmd) (stdout string, stderr string, err error)
  12. Show(cmd *exec.Cmd) error
  13. }
  14. type OSRunner struct {
  15. Log *text.Logger
  16. }
  17. func NewOSRunner(log *text.Logger) *OSRunner {
  18. return &OSRunner{log}
  19. }
  20. func (r *OSRunner) Show(cmd *exec.Cmd) error {
  21. cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr
  22. cmd.SysProcAttr = &syscall.SysProcAttr{
  23. Pdeathsig: syscall.SIGTERM,
  24. }
  25. r.Log.Debugln("running", cmd.String())
  26. return cmd.Run()
  27. }
  28. func (r *OSRunner) Capture(cmd *exec.Cmd) (stdout, stderr string, err error) {
  29. r.Log.Debugln("capturing", cmd.String())
  30. cmd.SysProcAttr = &syscall.SysProcAttr{
  31. Pdeathsig: syscall.SIGTERM,
  32. }
  33. outbuf, err := cmd.Output()
  34. stdout = strings.TrimSpace(string(outbuf))
  35. if err != nil {
  36. exitErr := &exec.ExitError{}
  37. if errors.As(err, &exitErr) {
  38. stderr = strings.TrimSpace(string(exitErr.Stderr))
  39. }
  40. }
  41. return stdout, stderr, err
  42. }