actions.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "math"
  6. "os"
  7. "os/exec"
  8. "strconv"
  9. "strings"
  10. "github.com/jguer/go-alpm"
  11. "github.com/jguer/yay/aur"
  12. )
  13. func searchAndInstall(pkgName string, conf *alpm.PacmanConfig, flags []string) (err error) {
  14. var num int
  15. var numberString string
  16. var args []string
  17. a, err := aur.Search(pkgName, true)
  18. r, err := SearchPackages(pkgName, conf)
  19. if err != nil {
  20. return
  21. }
  22. if len(r.Results) == 0 && a.Resultcount == 0 {
  23. return fmt.Errorf("No Packages match search.")
  24. }
  25. r.PrintSearch(0)
  26. a.PrintSearch(len(r.Results))
  27. args = append(args, "pacman", "-S")
  28. fmt.Printf("\x1b[32m%s\x1b[0m\nNumbers:", "Type numbers to install. Separate each number with a space.")
  29. reader := bufio.NewReader(os.Stdin)
  30. numberString, err = reader.ReadString('\n')
  31. if err != nil {
  32. fmt.Println(err)
  33. return
  34. }
  35. var aurInstall []aur.Result
  36. result := strings.Fields(numberString)
  37. for _, numS := range result {
  38. num, err = strconv.Atoi(numS)
  39. if err != nil {
  40. fmt.Println(err)
  41. continue
  42. }
  43. // Install package
  44. if num > len(r.Results)-1 {
  45. aurInstall = append(aurInstall, a.Results[num-len(r.Results)])
  46. } else {
  47. args = append(args, r.Results[num].Name)
  48. }
  49. }
  50. args = append(args, flags...)
  51. if len(args) > 2 {
  52. var cmd *exec.Cmd
  53. cmd = exec.Command("sudo", args...)
  54. cmd.Stdout = os.Stdout
  55. cmd.Stdin = os.Stdin
  56. cmd.Stderr = os.Stderr
  57. err = cmd.Run()
  58. }
  59. for _, aurpkg := range aurInstall {
  60. err = aurpkg.Install(BuildDir, conf, flags)
  61. if err != nil {
  62. // Do not abandon program, we might still be able to install the rest
  63. fmt.Println(err)
  64. }
  65. }
  66. return
  67. }
  68. // updateAndInstall handles updating the cache and installing updates
  69. func updateAndInstall(conf *alpm.PacmanConfig, flags []string) error {
  70. errp := UpdatePackages(flags)
  71. erra := aur.UpdatePackages(BuildDir, conf, flags)
  72. if errp != nil {
  73. return errp
  74. }
  75. return erra
  76. }
  77. func searchMode(pkg string, conf *alpm.PacmanConfig) (err error) {
  78. a, err := aur.Search(pkg, true)
  79. if err != nil {
  80. return err
  81. }
  82. SearchRepos(pkg, conf, SearchMode)
  83. a.PrintSearch(SearchMode)
  84. return nil
  85. }
  86. func stats(conf *alpm.PacmanConfig) error {
  87. var tS int64 // TotalSize
  88. var nPkg int
  89. var ePkg int
  90. var pkgs [10]alpm.Package
  91. h, err := conf.CreateHandle()
  92. defer h.Release()
  93. if err != nil {
  94. return err
  95. }
  96. localDb, err := h.LocalDb()
  97. if err != nil {
  98. return err
  99. }
  100. var k int
  101. for e, pkg := range localDb.PkgCache().Slice() {
  102. tS += pkg.ISize()
  103. k = -1
  104. nPkg++
  105. if pkg.Reason() == 0 {
  106. ePkg++
  107. }
  108. if e < 10 {
  109. pkgs[e] = pkg
  110. continue
  111. }
  112. for i, pkw := range pkgs {
  113. if k == -1 {
  114. if pkw.ISize() < pkg.ISize() {
  115. k = i
  116. }
  117. } else {
  118. if pkw.ISize() < pkgs[k].ISize() && pkw.ISize() < pkg.ISize() {
  119. k = i
  120. }
  121. }
  122. }
  123. if k != -1 {
  124. pkgs[k] = pkg
  125. }
  126. }
  127. fmt.Printf("\n Yay version r%s\n", version)
  128. fmt.Println("\x1B[1;34m===========================================\x1B[0m")
  129. fmt.Printf("\x1B[1;32mTotal installed packages: \x1B[0;33m%d\x1B[0m\n", nPkg)
  130. fmt.Printf("\x1B[1;32mExplicitly installed packages: \x1B[0;33m%d\x1B[0m\n", ePkg)
  131. fmt.Printf("\x1B[1;32mTotal Size occupied by packages: \x1B[0;33m%s\x1B[0m\n", Size(tS))
  132. fmt.Println("\x1B[1;34m===========================================\x1B[0m")
  133. fmt.Println("\x1B[1;32mTen biggest packages\x1B[0m")
  134. for _, pkg := range pkgs {
  135. fmt.Printf("%s: \x1B[0;33m%s\x1B[0m\n", pkg.Name(), Size(pkg.ISize()))
  136. }
  137. fmt.Println("\x1B[1;34m===========================================\x1B[0m")
  138. return nil
  139. }
  140. // Function by pyk https://github.com/pyk/byten
  141. func index(s int64) float64 {
  142. x := math.Log(float64(s)) / math.Log(1024)
  143. return math.Floor(x)
  144. }
  145. // Function by pyk https://github.com/pyk/byten
  146. func countSize(s int64, i float64) float64 {
  147. return float64(s) / math.Pow(1024, math.Floor(i))
  148. }
  149. // Size return a formated string from file size
  150. // Function by pyk https://github.com/pyk/byten
  151. func Size(s int64) string {
  152. symbols := []string{"B", "KB", "MB", "GB", "TB", "PB", "EB"}
  153. i := index(s)
  154. if s < 10 {
  155. return fmt.Sprintf("%dB", s)
  156. }
  157. size := countSize(s, i)
  158. format := "%.0f"
  159. if size < 10 {
  160. format = "%.1f"
  161. }
  162. return fmt.Sprintf(format+"%s", size, symbols[int(i)])
  163. }