pacman.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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(pkg string, conf *alpm.PacmanConfig, flags string) error {
  35. if found, err := aur.IspkgInRepo(pkg, conf); found {
  36. if err != nil {
  37. return err
  38. }
  39. var cmd *exec.Cmd
  40. if flags == "" {
  41. cmd = exec.Command("sudo", "pacman", "-S", pkg)
  42. } else {
  43. cmd = exec.Command("sudo", "pacman", "-S", pkg, flags)
  44. }
  45. cmd.Stdout = os.Stdout
  46. cmd.Stdin = os.Stdin
  47. cmd.Stderr = os.Stderr
  48. err = cmd.Run()
  49. } else {
  50. err = aur.Install(pkg, BuildDir, conf, flags)
  51. }
  52. return nil
  53. }
  54. // UpdatePackages handles cache update and upgrade
  55. func UpdatePackages(flags string) error {
  56. var cmd *exec.Cmd
  57. if flags == "" {
  58. cmd = exec.Command("sudo", "pacman", "-Syu")
  59. } else {
  60. cmd = exec.Command("sudo", "pacman", "-Syu", flags)
  61. }
  62. cmd.Stdout = os.Stdout
  63. cmd.Stdin = os.Stdin
  64. cmd.Stderr = os.Stderr
  65. err := cmd.Run()
  66. return err
  67. }
  68. // SearchPackages handles repo searches. Creates a RepoSearch struct.
  69. func SearchPackages(pkgName string, conf *alpm.PacmanConfig) (s RepoSearch, err error) {
  70. h, err := conf.CreateHandle()
  71. defer h.Release()
  72. if err != nil {
  73. }
  74. dbList, err := h.SyncDbs()
  75. localdb, err := h.LocalDb()
  76. var installed bool
  77. for _, db := range dbList.Slice() {
  78. for _, pkg := range db.PkgCache().Slice() {
  79. if strings.Contains(pkg.Name(), pkgName) {
  80. if r, _ := localdb.PkgByName(pkg.Name()); r != nil {
  81. installed = true
  82. } else {
  83. installed = false
  84. }
  85. s.Results = append(s.Results, Result{
  86. Name: pkg.Name(),
  87. Description: pkg.Description(),
  88. Version: pkg.Version(),
  89. Repository: db.Name(),
  90. Installed: installed,
  91. })
  92. }
  93. }
  94. }
  95. return
  96. }
  97. //PrintSearch receives a RepoSearch type and outputs pretty text.
  98. func (s *RepoSearch) PrintSearch(mode int) {
  99. for i, pkg := range s.Results {
  100. switch {
  101. case mode != SearchMode && pkg.Installed == true:
  102. fmt.Printf("%d \033[1m%s/\x1B[33m%s \x1B[36m%s \x1B[32;40mInstalled\033[0m\n%s\n",
  103. i, pkg.Repository, pkg.Name, pkg.Version, pkg.Description)
  104. case mode != SearchMode && pkg.Installed != true:
  105. fmt.Printf("%d \033[1m%s/\x1B[33m%s \x1B[36m%s\033[0m\n%s\n",
  106. i, pkg.Repository, pkg.Name, pkg.Version, pkg.Description)
  107. case mode == SearchMode && pkg.Installed == true:
  108. fmt.Printf("\033[1m%s/\x1B[33m%s \x1B[36m%s \x1B[32;40mInstalled\033[0m\n%s\n",
  109. pkg.Repository, pkg.Name, pkg.Version, pkg.Description)
  110. case mode == SearchMode && pkg.Installed != true:
  111. fmt.Printf("\033[1m%s/\x1B[33m%s \x1B[36m%s\033[0m\n%s\n",
  112. pkg.Repository, pkg.Name, pkg.Version, pkg.Description)
  113. }
  114. }
  115. }
  116. func passToPacman(op string, flags string) error {
  117. var cmd *exec.Cmd
  118. if flags == "" {
  119. cmd = exec.Command("sudo", "pacman", op)
  120. } else {
  121. cmd = exec.Command("sudo", "pacman", op, flags)
  122. }
  123. cmd.Stdout = os.Stdout
  124. cmd.Stdin = os.Stdin
  125. cmd.Stderr = os.Stderr
  126. err := cmd.Run()
  127. return err
  128. }