actions.go 4.2 KB

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