pacman.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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) (err 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. // SearchPackages handles repo searches. Creates a RepoSearch struct.
  55. func SearchPackages(pkgName string, conf alpm.PacmanConfig) (s RepoSearch, err error) {
  56. h, err := conf.CreateHandle()
  57. defer h.Release()
  58. if err != nil {
  59. }
  60. dbList, err := h.SyncDbs()
  61. localdb, err := h.LocalDb()
  62. var installed bool
  63. for _, db := range dbList.Slice() {
  64. for _, pkg := range db.PkgCache().Slice() {
  65. if strings.Contains(pkg.Name(), pkgName) {
  66. if r, _ := localdb.PkgByName(pkg.Name()); r != nil {
  67. installed = true
  68. } else {
  69. installed = false
  70. }
  71. s.Results = append(s.Results, Result{
  72. Name: pkg.Name(),
  73. Description: pkg.Description(),
  74. Version: pkg.Version(),
  75. Repository: db.Name(),
  76. Installed: installed,
  77. })
  78. }
  79. }
  80. }
  81. return
  82. }
  83. //PrintSearch receives a RepoSearch type and outputs pretty text.
  84. func (s *RepoSearch) PrintSearch(mode int, conf alpm.PacmanConfig) {
  85. for i, pkg := range s.Results {
  86. if mode != SearchMode {
  87. if pkg.Installed == true {
  88. fmt.Printf("%d \033[1m%s/\x1B[33m%s\x1B[36m%s\033[0m\n%s\n",
  89. i, pkg.Repository, pkg.Name, pkg.Version, pkg.Description)
  90. } else {
  91. fmt.Printf("%d \033[1m%s/\x1B[33m%s (Installed)\x1B[36m%s\033[0m\n%s\n",
  92. i, pkg.Repository, pkg.Name, pkg.Version, pkg.Description)
  93. }
  94. } else {
  95. fmt.Printf("\033[1m%s/\x1B[33m%s \x1B[36m%s\033[0m\n%s\n",
  96. pkg.Repository, pkg.Name, pkg.Version, pkg.Description)
  97. }
  98. }
  99. }