pacman.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/Jguer/go-alpm"
  5. "github.com/Jguer/yay/aur"
  6. "os"
  7. "os/exec"
  8. "strings"
  9. )
  10. // RepoSearch describes a Repository search.
  11. type RepoSearch struct {
  12. Results []Result
  13. }
  14. // Result describes a pkg.
  15. type Result struct {
  16. Name string
  17. Repository string
  18. Version string
  19. Description string
  20. Installed bool
  21. }
  22. func readConfig(pacmanconf string) (conf alpm.PacmanConfig, err error) {
  23. file, err := os.Open(pacmanconf)
  24. if err != nil {
  25. return
  26. }
  27. conf, err = alpm.ParseConfig(file)
  28. if err != nil {
  29. return
  30. }
  31. return
  32. }
  33. // InstallPackage handles package install
  34. func InstallPackage(pkgs []string, conf *alpm.PacmanConfig, flags string) error {
  35. h, err := conf.CreateHandle()
  36. defer h.Release()
  37. if err != nil {
  38. return err
  39. }
  40. dbList, err := h.SyncDbs()
  41. if err != nil {
  42. return err
  43. }
  44. var foreign []string
  45. var args []string
  46. repocnt := 0
  47. args = append(args, "pacman")
  48. args = append(args, "-S")
  49. for _, pkg := range pkgs {
  50. found := false
  51. for _, db := range dbList.Slice() {
  52. _, err = db.PkgByName(pkg)
  53. if err == nil {
  54. found = true
  55. args = append(args, pkg)
  56. repocnt++
  57. break
  58. }
  59. }
  60. if !found {
  61. foreign = append(foreign, pkg)
  62. }
  63. }
  64. if flags != "" {
  65. args = append(args, flags)
  66. }
  67. if repocnt != 0 {
  68. var cmd *exec.Cmd
  69. cmd = exec.Command("sudo", args...)
  70. cmd.Stdout = os.Stdout
  71. cmd.Stdin = os.Stdin
  72. cmd.Stderr = os.Stderr
  73. err = cmd.Run()
  74. }
  75. for _, aurpkg := range foreign {
  76. err = aur.Install(aurpkg, BuildDir, conf, flags)
  77. }
  78. return nil
  79. }
  80. // UpdatePackages handles cache update and upgrade
  81. func UpdatePackages(flags string) error {
  82. var cmd *exec.Cmd
  83. if flags == "" {
  84. cmd = exec.Command("sudo", "pacman", "-Syu")
  85. } else {
  86. cmd = exec.Command("sudo", "pacman", "-Syu", flags)
  87. }
  88. cmd.Stdout = os.Stdout
  89. cmd.Stdin = os.Stdin
  90. cmd.Stderr = os.Stderr
  91. err := cmd.Run()
  92. return err
  93. }
  94. // SearchPackages handles repo searches. Creates a RepoSearch struct.
  95. func SearchPackages(pkgName string, conf *alpm.PacmanConfig) (s RepoSearch, err error) {
  96. h, err := conf.CreateHandle()
  97. defer h.Release()
  98. if err != nil {
  99. }
  100. dbList, err := h.SyncDbs()
  101. localdb, err := h.LocalDb()
  102. var installed bool
  103. for _, db := range dbList.Slice() {
  104. for _, pkg := range db.PkgCache().Slice() {
  105. if strings.Contains(pkg.Name(), pkgName) {
  106. if r, _ := localdb.PkgByName(pkg.Name()); r != nil {
  107. installed = true
  108. } else {
  109. installed = false
  110. }
  111. s.Results = append(s.Results, Result{
  112. Name: pkg.Name(),
  113. Description: pkg.Description(),
  114. Version: pkg.Version(),
  115. Repository: db.Name(),
  116. Installed: installed,
  117. })
  118. }
  119. }
  120. }
  121. return
  122. }
  123. //PrintSearch receives a RepoSearch type and outputs pretty text.
  124. func (s *RepoSearch) PrintSearch(mode int) {
  125. for i, pkg := range s.Results {
  126. switch {
  127. case mode != SearchMode && pkg.Installed == true:
  128. fmt.Printf("%d \033[1m%s/\x1B[33m%s \x1B[36m%s \x1B[32;40mInstalled\033[0m\n%s\n",
  129. i, pkg.Repository, pkg.Name, pkg.Version, pkg.Description)
  130. case mode != SearchMode && pkg.Installed != true:
  131. fmt.Printf("%d \033[1m%s/\x1B[33m%s \x1B[36m%s\033[0m\n%s\n",
  132. i, pkg.Repository, pkg.Name, pkg.Version, pkg.Description)
  133. case mode == SearchMode && pkg.Installed == true:
  134. fmt.Printf("\033[1m%s/\x1B[33m%s \x1B[36m%s \x1B[32;40mInstalled\033[0m\n%s\n",
  135. pkg.Repository, pkg.Name, pkg.Version, pkg.Description)
  136. case mode == SearchMode && pkg.Installed != true:
  137. fmt.Printf("\033[1m%s/\x1B[33m%s \x1B[36m%s\033[0m\n%s\n",
  138. pkg.Repository, pkg.Name, pkg.Version, pkg.Description)
  139. }
  140. }
  141. }
  142. func passToPacman(op string, pkg string, flags string) error {
  143. var cmd *exec.Cmd
  144. var args []string
  145. args = append(args, op)
  146. if pkg != "" {
  147. args = append(args, pkg)
  148. }
  149. if flags != "" {
  150. args = append(args, flags)
  151. }
  152. if strings.Contains(op, "Q") {
  153. cmd = exec.Command("pacman", args...)
  154. } else {
  155. args = append([]string{"pacman"}, args...)
  156. cmd = exec.Command("sudo", args...)
  157. }
  158. cmd.Stdout = os.Stdout
  159. cmd.Stdin = os.Stdin
  160. cmd.Stderr = os.Stderr
  161. err := cmd.Run()
  162. return err
  163. }