exec.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "os/exec"
  6. "path/filepath"
  7. "strings"
  8. "time"
  9. "github.com/leonelquinteros/gotext"
  10. "github.com/Jguer/yay/v10/pkg/settings"
  11. "github.com/Jguer/yay/v10/pkg/text"
  12. )
  13. func sudoLoopBackground() {
  14. updateSudo()
  15. go sudoLoop()
  16. }
  17. func sudoLoop() {
  18. for {
  19. updateSudo()
  20. time.Sleep(298 * time.Second)
  21. }
  22. }
  23. func updateSudo() {
  24. for {
  25. mSudoFlags := strings.Fields(config.SudoFlags)
  26. mSudoFlags = append([]string{"-v"}, mSudoFlags...)
  27. err := config.Runtime.CmdRunner.Show(exec.Command(config.SudoBin, mSudoFlags...))
  28. if err != nil {
  29. fmt.Fprintln(os.Stderr, err)
  30. } else {
  31. break
  32. }
  33. }
  34. }
  35. // waitLock will lock yay checking the status of db.lck until it does not exist
  36. func waitLock(dbPath string) {
  37. lockDBPath := filepath.Join(dbPath, "db.lck")
  38. if _, err := os.Stat(lockDBPath); err != nil {
  39. return
  40. }
  41. text.Warnln(gotext.Get("%s is present.", lockDBPath))
  42. text.Warn(gotext.Get("There may be another Pacman instance running. Waiting..."))
  43. for {
  44. time.Sleep(3 * time.Second)
  45. if _, err := os.Stat(lockDBPath); err != nil {
  46. fmt.Println()
  47. return
  48. }
  49. }
  50. }
  51. func passToPacman(args *settings.Arguments) *exec.Cmd {
  52. argArr := make([]string, 0, 32)
  53. if args.NeedRoot(config.Runtime) {
  54. argArr = append(argArr, config.SudoBin)
  55. argArr = append(argArr, strings.Fields(config.SudoFlags)...)
  56. }
  57. argArr = append(argArr, config.PacmanBin)
  58. argArr = append(argArr, args.FormatGlobals()...)
  59. argArr = append(argArr, args.FormatArgs()...)
  60. if settings.NoConfirm {
  61. argArr = append(argArr, "--noconfirm")
  62. }
  63. argArr = append(argArr, "--config", config.PacmanConf, "--")
  64. argArr = append(argArr, args.Targets...)
  65. if args.NeedRoot(config.Runtime) {
  66. waitLock(config.Runtime.PacmanConf.DBPath)
  67. }
  68. return exec.Command(argArr[0], argArr[1:]...)
  69. }
  70. func passToMakepkg(dir string, args ...string) *exec.Cmd {
  71. args = append(args, strings.Fields(config.MFlags)...)
  72. if config.MakepkgConf != "" {
  73. args = append(args, "--config", config.MakepkgConf)
  74. }
  75. cmd := exec.Command(config.MakepkgBin, args...)
  76. cmd.Dir = dir
  77. return cmd
  78. }
  79. func passToGit(dir string, _args ...string) *exec.Cmd {
  80. args := strings.Fields(config.GitFlags)
  81. if dir != "" {
  82. args = append(args, "-C", dir)
  83. }
  84. args = append(args, _args...)
  85. cmd := exec.Command(config.GitBin, args...)
  86. cmd.Env = append(os.Environ(), "GIT_TERMINAL_PROMPT=0")
  87. return cmd
  88. }