print.go 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. package main
  2. import (
  3. "fmt"
  4. "strings"
  5. rpc "github.com/mikkeloscar/aur"
  6. )
  7. // Human returns results in Human readable format.
  8. func human(size int64) string {
  9. floatsize := float32(size)
  10. units := [...]string{"", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi", "Yi"}
  11. for _, unit := range units {
  12. if floatsize < 1024 {
  13. return fmt.Sprintf("%.1f %sB", floatsize, unit)
  14. }
  15. floatsize /= 1024
  16. }
  17. return fmt.Sprintf("%d%s", size, "B")
  18. }
  19. // PrintSearch handles printing search results in a given format
  20. func (q aurQuery) printSearch(start int) {
  21. localDb, _ := alpmHandle.LocalDb()
  22. for i, res := range q {
  23. var toprint string
  24. if config.SearchMode == NumberMenu {
  25. if config.SortMode == BottomUp {
  26. toprint += fmt.Sprintf("\x1b[33m%d\x1b[0m ", len(q)+start-i-1)
  27. } else {
  28. toprint += fmt.Sprintf("\x1b[33m%d\x1b[0m ", start+i)
  29. }
  30. } else if config.SearchMode == Minimal {
  31. fmt.Println(res.Name)
  32. continue
  33. }
  34. toprint += fmt.Sprintf("\x1b[1m%s/\x1b[33m%s \x1b[36m%s \x1b[0m(%d) ", "aur", res.Name, res.Version, res.NumVotes)
  35. if res.Maintainer == "" {
  36. toprint += fmt.Sprintf("\x1b[31;40m(Orphaned)\x1b[0m ")
  37. }
  38. if res.OutOfDate != 0 {
  39. toprint += fmt.Sprintf("\x1b[31;40m(Out-of-date)\x1b[0m ")
  40. }
  41. if _, err := localDb.PkgByName(res.Name); err == nil {
  42. toprint += fmt.Sprintf("\x1b[32;40mInstalled\x1b[0m")
  43. }
  44. toprint += "\n " + res.Description
  45. fmt.Println(toprint)
  46. }
  47. }
  48. //PrintSearch receives a RepoSearch type and outputs pretty text.
  49. func (s repoQuery) printSearch() {
  50. for i, res := range s {
  51. var toprint string
  52. if config.SearchMode == NumberMenu {
  53. if config.SortMode == BottomUp {
  54. toprint += fmt.Sprintf("\x1b[33m%d\x1b[0m ", len(s)-i)
  55. } else {
  56. toprint += fmt.Sprintf("\x1b[33m%d\x1b[0m ", i+1)
  57. }
  58. } else if config.SearchMode == Minimal {
  59. fmt.Println(res.Name())
  60. continue
  61. }
  62. toprint += fmt.Sprintf("\x1b[1m%s/\x1b[33m%s \x1b[36m%s \x1b[0m",
  63. res.DB().Name(), res.Name(), res.Version())
  64. if len(res.Groups().Slice()) != 0 {
  65. toprint += fmt.Sprint(res.Groups().Slice(), " ")
  66. }
  67. localDb, err := alpmHandle.LocalDb()
  68. if err == nil {
  69. if _, err = localDb.PkgByName(res.Name()); err == nil {
  70. toprint += fmt.Sprintf("\x1b[32;40mInstalled\x1b[0m")
  71. }
  72. }
  73. toprint += "\n " + res.Description()
  74. fmt.Println(toprint)
  75. }
  76. }
  77. func printDeps(repoDeps []string, aurDeps []string) {
  78. if len(repoDeps) != 0 {
  79. fmt.Print("\x1b[1;32m==> Repository dependencies: \x1b[0m")
  80. for _, repoD := range repoDeps {
  81. fmt.Print("\x1b[33m", repoD, " \x1b[0m")
  82. }
  83. fmt.Print("\n")
  84. }
  85. if len(aurDeps) != 0 {
  86. fmt.Print("\x1b[1;32m==> AUR dependencies: \x1b[0m")
  87. for _, aurD := range aurDeps {
  88. fmt.Print("\x1b[33m", aurD, " \x1b[0m")
  89. }
  90. fmt.Print("\n")
  91. }
  92. }
  93. // PrintInfo prints package info like pacman -Si.
  94. func PrintInfo(a *rpc.Pkg) {
  95. fmt.Println("\x1b[1;37mRepository :\x1b[0m", "aur")
  96. fmt.Println("\x1b[1;37mName :\x1b[0m", a.Name)
  97. fmt.Println("\x1b[1;37mVersion :\x1b[0m", a.Version)
  98. fmt.Println("\x1b[1;37mDescription :\x1b[0m", a.Description)
  99. if a.URL != "" {
  100. fmt.Println("\x1b[1;37mURL :\x1b[0m", a.URL)
  101. } else {
  102. fmt.Println("\x1b[1;37mURL :\x1b[0m", "None")
  103. }
  104. fmt.Println("\x1b[1;37mLicenses :\x1b[0m", strings.Join(a.License, " "))
  105. // if len(a.Provides) != 0 {
  106. // fmt.Println("\x1b[1;37mProvides :\x1b[0m",
  107. // Strings.join(a.Provides, " "))
  108. // } else {
  109. // fmt.Println("\x1b[1;37mProvides :\x1b[0m", "None")
  110. // }
  111. if len(a.Depends) != 0 {
  112. fmt.Println("\x1b[1;37mDepends On :\x1b[0m", strings.Join(a.Depends, " "))
  113. } else {
  114. fmt.Println("\x1b[1;37mDepends On :\x1b[0m", "None")
  115. }
  116. if len(a.MakeDepends) != 0 {
  117. fmt.Println("\x1b[1;37mMake depends On :\x1b[0m", strings.Join(a.MakeDepends, " "))
  118. } else {
  119. fmt.Println("\x1b[1;37mMake depends On :\x1b[0m", "None")
  120. }
  121. if len(a.OptDepends) != 0 {
  122. fmt.Println("\x1b[1;37mOptional Deps :\x1b[0m", strings.Join(a.OptDepends, " "))
  123. } else {
  124. fmt.Println("\x1b[1;37mOptional Deps :\x1b[0m", "None")
  125. }
  126. if len(a.Conflicts) != 0 {
  127. fmt.Println("\x1b[1;37mConflicts With :\x1b[0m",strings.Join(a.Conflicts, " "))
  128. } else {
  129. fmt.Println("\x1b[1;37mConflicts With :\x1b[0m", "None")
  130. }
  131. if a.Maintainer != "" {
  132. fmt.Println("\x1b[1;37mMaintainer :\x1b[0m", a.Maintainer)
  133. } else {
  134. fmt.Println("\x1b[1;37mMaintainer :\x1b[0m", "None")
  135. }
  136. fmt.Println("\x1b[1;37mVotes :\x1b[0m", a.NumVotes)
  137. fmt.Println("\x1b[1;37mPopularity :\x1b[0m", a.Popularity)
  138. if a.OutOfDate != 0 {
  139. fmt.Println("\x1b[1;37mOut-of-date :\x1b[0m", "Yes")
  140. }
  141. fmt.Println()
  142. }
  143. // BiggestPackages prints the name of the ten biggest packages in the system.
  144. func biggestPackages() {
  145. localDb, err := alpmHandle.LocalDb()
  146. if err != nil {
  147. return
  148. }
  149. pkgCache := localDb.PkgCache()
  150. pkgS := pkgCache.SortBySize().Slice()
  151. if len(pkgS) < 10 {
  152. return
  153. }
  154. for i := 0; i < 10; i++ {
  155. fmt.Printf("%s: \x1B[0;33m%s\x1B[0m\n", pkgS[i].Name(), human(pkgS[i].ISize()))
  156. }
  157. // Could implement size here as well, but we just want the general idea
  158. }
  159. // localStatistics prints installed packages statistics.
  160. func localStatistics() error {
  161. info, err := statistics()
  162. if err != nil {
  163. return err
  164. }
  165. _, _, _, remoteNames, err := filterPackages()
  166. if err != nil {
  167. return err
  168. }
  169. fmt.Printf("\n Yay version r%s\n", version)
  170. fmt.Println("\x1B[1;34m===========================================\x1B[0m")
  171. fmt.Printf("\x1B[1;32mTotal installed packages: \x1B[0;33m%d\x1B[0m\n", info.Totaln)
  172. fmt.Printf("\x1B[1;32mTotal foreign installed packages: \x1B[0;33m%d\x1B[0m\n", len(remoteNames))
  173. fmt.Printf("\x1B[1;32mExplicitly installed packages: \x1B[0;33m%d\x1B[0m\n", info.Expln)
  174. fmt.Printf("\x1B[1;32mTotal Size occupied by packages: \x1B[0;33m%s\x1B[0m\n", human(info.TotalSize))
  175. fmt.Println("\x1B[1;34m===========================================\x1B[0m")
  176. fmt.Println("\x1B[1;32mTen biggest packages\x1B[0m")
  177. biggestPackages()
  178. fmt.Println("\x1B[1;34m===========================================\x1B[0m")
  179. var q aurQuery
  180. var j int
  181. for i := len(remoteNames); i != 0; i = j {
  182. j = i - config.RequestSplitN
  183. if j < 0 {
  184. j = 0
  185. }
  186. qtemp, err := rpc.Info(remoteNames[j:i])
  187. q = append(q, qtemp...)
  188. if err != nil {
  189. return err
  190. }
  191. }
  192. var outcast []string
  193. for _, s := range remoteNames {
  194. found := false
  195. for _, i := range q {
  196. if s == i.Name {
  197. found = true
  198. break
  199. }
  200. }
  201. if !found {
  202. outcast = append(outcast, s)
  203. }
  204. }
  205. if err != nil {
  206. return err
  207. }
  208. for _, res := range q {
  209. if res.Maintainer == "" {
  210. fmt.Printf("\x1b[1;31;40mWarning: \x1B[1;33;40m%s\x1b[0;37;40m is orphaned.\x1b[0m\n", res.Name)
  211. }
  212. if res.OutOfDate != 0 {
  213. fmt.Printf("\x1b[1;31;40mWarning: \x1B[1;33;40m%s\x1b[0;37;40m is out-of-date in AUR.\x1b[0m\n", res.Name)
  214. }
  215. }
  216. for _, res := range outcast {
  217. fmt.Printf("\x1b[1;31;40mWarning: \x1B[1;33;40m%s\x1b[0;37;40m is not available in AUR.\x1b[0m\n", res)
  218. }
  219. return nil
  220. }