pacman.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  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. 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. // SearchPackages handles repo searches. Creates a RepoSearch struct.
  92. func SearchPackages(pkgName string, conf *alpm.PacmanConfig) (s RepoSearch, 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. for _, db := range dbList.Slice() {
  101. for _, pkg := range db.PkgCache().Slice() {
  102. if strings.Contains(pkg.Name(), pkgName) {
  103. if r, _ := localdb.PkgByName(pkg.Name()); r != nil {
  104. installed = true
  105. } else {
  106. installed = false
  107. }
  108. s.Results = append(s.Results, Result{
  109. Name: pkg.Name(),
  110. Description: pkg.Description(),
  111. Version: pkg.Version(),
  112. Repository: db.Name(),
  113. Installed: installed,
  114. })
  115. }
  116. }
  117. }
  118. return
  119. }
  120. //PrintSearch receives a RepoSearch type and outputs pretty text.
  121. func (s *RepoSearch) PrintSearch(mode int) {
  122. for i, pkg := range s.Results {
  123. switch {
  124. case mode != SearchMode && pkg.Installed == true:
  125. fmt.Printf("%d \033[1m%s/\x1B[33m%s \x1B[36m%s \x1B[32;40mInstalled\033[0m\n%s\n",
  126. i, pkg.Repository, pkg.Name, pkg.Version, pkg.Description)
  127. case mode != SearchMode && pkg.Installed != true:
  128. fmt.Printf("%d \033[1m%s/\x1B[33m%s \x1B[36m%s\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("\033[1m%s/\x1B[33m%s \x1B[36m%s \x1B[32;40mInstalled\033[0m\n%s\n",
  132. 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\033[0m\n%s\n",
  135. pkg.Repository, pkg.Name, pkg.Version, pkg.Description)
  136. }
  137. }
  138. }
  139. func passToPacman(op string, pkgs []string, flags []string) error {
  140. var cmd *exec.Cmd
  141. var args []string
  142. args = append(args, op)
  143. if len(pkgs) != 0 {
  144. args = append(args, pkgs...)
  145. }
  146. if len(flags) != 0 {
  147. args = append(args, flags...)
  148. }
  149. if strings.Contains(op, "-Q") {
  150. cmd = exec.Command("pacman", args...)
  151. } else {
  152. args = append([]string{"pacman"}, args...)
  153. cmd = exec.Command("sudo", args...)
  154. }
  155. cmd.Stdout = os.Stdout
  156. cmd.Stdin = os.Stdin
  157. cmd.Stderr = os.Stderr
  158. err := cmd.Run()
  159. return err
  160. }