pacman.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "os/exec"
  6. "strings"
  7. "github.com/jguer/go-alpm"
  8. "github.com/jguer/yay/aur"
  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. args = append(args, flags...)
  65. if repocnt != 0 {
  66. var cmd *exec.Cmd
  67. cmd = exec.Command("sudo", args...)
  68. cmd.Stdout = os.Stdout
  69. cmd.Stdin = os.Stdin
  70. cmd.Stderr = os.Stderr
  71. err = cmd.Run()
  72. }
  73. for _, aurpkg := range foreign {
  74. err = aur.Install(aurpkg, BuildDir, conf, flags)
  75. }
  76. return nil
  77. }
  78. // UpdatePackages handles cache update and upgrade
  79. func UpdatePackages(flags []string) error {
  80. var cmd *exec.Cmd
  81. var args []string
  82. args = append(args, "pacman", "-Syu")
  83. args = append(args, flags...)
  84. cmd = exec.Command("sudo", args...)
  85. cmd.Stdout = os.Stdout
  86. cmd.Stdin = os.Stdin
  87. cmd.Stderr = os.Stderr
  88. err := cmd.Run()
  89. return err
  90. }
  91. // SearchRepos searches and prints packages in repo
  92. func SearchRepos(pkgName string, conf *alpm.PacmanConfig, mode int) (err error) {
  93. h, err := conf.CreateHandle()
  94. defer h.Release()
  95. if err != nil {
  96. }
  97. dbList, err := h.SyncDbs()
  98. localdb, err := h.LocalDb()
  99. var installed bool
  100. var i int
  101. for _, db := range dbList.Slice() {
  102. for _, pkg := range db.PkgCache().Slice() {
  103. if strings.Contains(pkg.Name(), pkgName) {
  104. if r, _ := localdb.PkgByName(pkg.Name()); r != nil {
  105. installed = true
  106. } else {
  107. installed = false
  108. }
  109. switch {
  110. case mode != SearchMode && installed == true:
  111. fmt.Printf("%d \x1b[1m%s/\x1b[33m%s \x1b[36m%s \x1b[32;40mInstalled\x1b[0m\n%s\n",
  112. i, db.Name(), pkg.Name(), pkg.Version(), pkg.Description())
  113. case mode != SearchMode && installed != true:
  114. fmt.Printf("%d \x1b[1m%s/\x1b[33m%s \x1b[36m%s\x1b[0m\n%s\n",
  115. i, db.Name(), pkg.Name(), pkg.Version(), pkg.Description())
  116. case mode == SearchMode && installed == true:
  117. fmt.Printf("\x1b[1m%s/\x1b[33m%s \x1b[36m%s \x1b[32;40mInstalled\x1b[0m\n%s\n",
  118. db.Name(), pkg.Name(), pkg.Version(), pkg.Description())
  119. case mode == SearchMode && installed != true:
  120. fmt.Printf("\x1b[1m%s/\x1b[33m%s \x1b[36m%s\x1b[0m\n%s\n",
  121. db.Name(), pkg.Name(), pkg.Version(), pkg.Description())
  122. }
  123. i++
  124. }
  125. }
  126. }
  127. return
  128. }
  129. // SearchPackages handles repo searches. Creates a RepoSearch struct.
  130. func SearchPackages(pkgName string, conf *alpm.PacmanConfig) (s RepoSearch, err error) {
  131. h, err := conf.CreateHandle()
  132. defer h.Release()
  133. if err != nil {
  134. }
  135. dbList, err := h.SyncDbs()
  136. localdb, err := h.LocalDb()
  137. var installed bool
  138. for _, db := range dbList.Slice() {
  139. for _, pkg := range db.PkgCache().Slice() {
  140. if strings.Contains(pkg.Name(), pkgName) {
  141. if r, _ := localdb.PkgByName(pkg.Name()); r != nil {
  142. installed = true
  143. } else {
  144. installed = false
  145. }
  146. s.Results = append(s.Results, Result{
  147. Name: pkg.Name(),
  148. Description: pkg.Description(),
  149. Version: pkg.Version(),
  150. Repository: db.Name(),
  151. Installed: installed,
  152. })
  153. }
  154. }
  155. }
  156. return
  157. }
  158. //PrintSearch receives a RepoSearch type and outputs pretty text.
  159. func (s *RepoSearch) PrintSearch(mode int) {
  160. for i, pkg := range s.Results {
  161. switch {
  162. case mode != SearchMode && pkg.Installed == true:
  163. fmt.Printf("%d \033[1m%s/\x1B[33m%s \x1B[36m%s \x1B[32;40mInstalled\033[0m\n%s\n",
  164. i, pkg.Repository, pkg.Name, pkg.Version, pkg.Description)
  165. case mode != SearchMode && pkg.Installed != true:
  166. fmt.Printf("%d \033[1m%s/\x1B[33m%s \x1B[36m%s\033[0m\n%s\n",
  167. i, pkg.Repository, pkg.Name, pkg.Version, pkg.Description)
  168. case mode == SearchMode && pkg.Installed == true:
  169. fmt.Printf("\033[1m%s/\x1B[33m%s \x1B[36m%s \x1B[32;40mInstalled\033[0m\n%s\n",
  170. pkg.Repository, pkg.Name, pkg.Version, pkg.Description)
  171. case mode == SearchMode && pkg.Installed != true:
  172. fmt.Printf("\033[1m%s/\x1B[33m%s \x1B[36m%s\033[0m\n%s\n",
  173. pkg.Repository, pkg.Name, pkg.Version, pkg.Description)
  174. }
  175. }
  176. }
  177. func passToPacman(op string, pkgs []string, flags []string) error {
  178. var cmd *exec.Cmd
  179. var args []string
  180. args = append(args, op)
  181. if len(pkgs) != 0 {
  182. args = append(args, pkgs...)
  183. }
  184. if len(flags) != 0 {
  185. args = append(args, flags...)
  186. }
  187. if strings.Contains(op, "-Q") {
  188. cmd = exec.Command("pacman", args...)
  189. } else {
  190. args = append([]string{"pacman"}, args...)
  191. cmd = exec.Command("sudo", args...)
  192. }
  193. cmd.Stdout = os.Stdout
  194. cmd.Stdin = os.Stdin
  195. cmd.Stderr = os.Stderr
  196. err := cmd.Run()
  197. return err
  198. }