exec.go 968 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package exe
  2. import (
  3. "errors"
  4. "os"
  5. "os/exec"
  6. "strings"
  7. "syscall"
  8. "github.com/Jguer/yay/v11/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 (r *OSRunner) Show(cmd *exec.Cmd) error {
  18. cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr
  19. cmd.SysProcAttr = &syscall.SysProcAttr{
  20. Pdeathsig: syscall.SIGTERM,
  21. }
  22. r.Log.Debugln("running", cmd.String())
  23. return cmd.Run()
  24. }
  25. func (r *OSRunner) Capture(cmd *exec.Cmd) (stdout, stderr string, err error) {
  26. r.Log.Debugln("capturing", cmd.String())
  27. cmd.SysProcAttr = &syscall.SysProcAttr{
  28. Pdeathsig: syscall.SIGTERM,
  29. }
  30. outbuf, err := cmd.Output()
  31. stdout = strings.TrimSpace(string(outbuf))
  32. if err != nil {
  33. exitErr := &exec.ExitError{}
  34. if errors.As(err, &exitErr) {
  35. stderr = strings.TrimSpace(string(exitErr.Stderr))
  36. }
  37. }
  38. return stdout, stderr, err
  39. }