exec.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package main
  2. import (
  3. "bytes"
  4. "fmt"
  5. "os"
  6. "os/exec"
  7. "path/filepath"
  8. "strings"
  9. "time"
  10. "github.com/leonelquinteros/gotext"
  11. "golang.org/x/crypto/ssh/terminal"
  12. "github.com/Jguer/yay/v9/pkg/text"
  13. )
  14. func show(cmd *exec.Cmd) error {
  15. cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr
  16. err := cmd.Run()
  17. if err != nil {
  18. return fmt.Errorf("")
  19. }
  20. return nil
  21. }
  22. func capture(cmd *exec.Cmd) (stdout, stderr string, err error) {
  23. var outbuf, errbuf bytes.Buffer
  24. cmd.Stdout = &outbuf
  25. cmd.Stderr = &errbuf
  26. err = cmd.Run()
  27. stdout = strings.TrimSpace(outbuf.String())
  28. stderr = strings.TrimSpace(errbuf.String())
  29. return stdout, stderr, err
  30. }
  31. func sudoLoopBackground() {
  32. updateSudo()
  33. go sudoLoop()
  34. }
  35. func sudoLoop() {
  36. for {
  37. updateSudo()
  38. time.Sleep(298 * time.Second)
  39. }
  40. }
  41. func updateSudo() {
  42. for {
  43. mSudoFlags := strings.Fields(config.SudoFlags)
  44. mSudoFlags = append([]string{"-v"}, mSudoFlags...)
  45. err := show(exec.Command(config.SudoBin, mSudoFlags...))
  46. if err != nil {
  47. fmt.Fprintln(os.Stderr, err)
  48. } else {
  49. break
  50. }
  51. }
  52. }
  53. // waitLock will lock yay checking the status of db.lck until it does not exist
  54. func waitLock() {
  55. if _, err := os.Stat(filepath.Join(pacmanConf.DBPath, "db.lck")); err != nil {
  56. return
  57. }
  58. text.Warnln(gotext.Get("%s is present.", filepath.Join(pacmanConf.DBPath, "db.lck")))
  59. text.Warn(gotext.Get("There may be another Pacman instance running. Waiting..."))
  60. for {
  61. time.Sleep(3 * time.Second)
  62. if _, err := os.Stat(filepath.Join(pacmanConf.DBPath, "db.lck")); err != nil {
  63. fmt.Println()
  64. return
  65. }
  66. }
  67. }
  68. func passToPacman(args *arguments) *exec.Cmd {
  69. argArr := make([]string, 0)
  70. mSudoFlags := strings.Fields(config.SudoFlags)
  71. if args.needRoot() {
  72. argArr = append(argArr, config.SudoBin)
  73. argArr = append(argArr, mSudoFlags...)
  74. }
  75. argArr = append(argArr, config.PacmanBin)
  76. argArr = append(argArr, cmdArgs.formatGlobals()...)
  77. argArr = append(argArr, args.formatArgs()...)
  78. if config.NoConfirm {
  79. argArr = append(argArr, "--noconfirm")
  80. }
  81. argArr = append(argArr, "--config", config.PacmanConf, "--")
  82. argArr = append(argArr, args.targets...)
  83. if args.needRoot() {
  84. waitLock()
  85. }
  86. return exec.Command(argArr[0], argArr[1:]...)
  87. }
  88. func passToMakepkg(dir string, args ...string) *exec.Cmd {
  89. mflags := strings.Fields(config.MFlags)
  90. args = append(args, mflags...)
  91. if config.MakepkgConf != "" {
  92. args = append(args, "--config", config.MakepkgConf)
  93. }
  94. cmd := exec.Command(config.MakepkgBin, args...)
  95. cmd.Dir = dir
  96. return cmd
  97. }
  98. func passToGit(dir string, _args ...string) *exec.Cmd {
  99. gitflags := strings.Fields(config.GitFlags)
  100. args := []string{"-C", dir}
  101. args = append(args, gitflags...)
  102. args = append(args, _args...)
  103. cmd := exec.Command(config.GitBin, args...)
  104. return cmd
  105. }
  106. func isTty() bool {
  107. return terminal.IsTerminal(int(os.Stdout.Fd()))
  108. }