upgrade.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package upgrade
  2. import (
  3. "fmt"
  4. "strings"
  5. "github.com/Jguer/yay/v12/pkg/db"
  6. "github.com/Jguer/yay/v12/pkg/query"
  7. "github.com/Jguer/yay/v12/pkg/text"
  8. )
  9. // Filter decides if specific package should be included in theincluded in the results.
  10. type Filter func(*Upgrade) bool
  11. // Upgrade type describes a system upgrade.
  12. type Upgrade = db.Upgrade
  13. func StylizedNameWithRepository(u *Upgrade) string {
  14. return text.Bold(text.ColorHash(u.Repository)) + "/" + text.Bold(u.Name)
  15. }
  16. // upSlice is a slice of Upgrades.
  17. type UpSlice struct {
  18. Up []Upgrade
  19. Repos []string
  20. PulledDeps []Upgrade
  21. }
  22. func (u UpSlice) Len() int { return len(u.Up) }
  23. func (u UpSlice) Swap(i, j int) { u.Up[i], u.Up[j] = u.Up[j], u.Up[i] }
  24. func (u UpSlice) Less(i, j int) bool {
  25. if u.Up[i].Repository == u.Up[j].Repository {
  26. iRunes := []rune(u.Up[i].Name)
  27. jRunes := []rune(u.Up[j].Name)
  28. return text.LessRunes(iRunes, jRunes)
  29. }
  30. for _, db := range u.Repos {
  31. if db == u.Up[i].Repository {
  32. return true
  33. } else if db == u.Up[j].Repository {
  34. return false
  35. }
  36. }
  37. iRunes := []rune(u.Up[i].Repository)
  38. jRunes := []rune(u.Up[j].Repository)
  39. return text.LessRunes(iRunes, jRunes)
  40. }
  41. // Print prints the details of the packages to upgrade.
  42. func (u UpSlice) Print(logger *text.Logger) {
  43. longestName, longestVersion := 0, 0
  44. for k := range u.Up {
  45. upgrade := &u.Up[k]
  46. packNameLen := len(StylizedNameWithRepository(upgrade))
  47. packVersion, _ := query.GetVersionDiff(upgrade.LocalVersion, upgrade.RemoteVersion)
  48. packVersionLen := len(packVersion)
  49. longestName = max(packNameLen, longestName)
  50. longestVersion = max(packVersionLen, longestVersion)
  51. }
  52. lenUp := len(u.Up)
  53. longestNumber := len(fmt.Sprintf("%v", lenUp))
  54. namePadding := fmt.Sprintf("%%-%ds ", longestName)
  55. versionPadding := fmt.Sprintf("%%-%ds", longestVersion)
  56. numberPadding := fmt.Sprintf("%%%dd ", longestNumber)
  57. for k := range u.Up {
  58. upgrade := &u.Up[k]
  59. left, right := query.GetVersionDiff(upgrade.LocalVersion, upgrade.RemoteVersion)
  60. logger.Printf(text.Magenta(fmt.Sprintf(numberPadding, lenUp-k)))
  61. logger.Printf(namePadding, StylizedNameWithRepository(upgrade))
  62. logger.Printf("%s -> %s\n", fmt.Sprintf(versionPadding, left), right)
  63. if upgrade.Extra != "" {
  64. logger.Println(strings.Repeat(" ", longestNumber), upgrade.Extra)
  65. }
  66. }
  67. }
  68. func (u UpSlice) PrintDeps(logger *text.Logger) {
  69. longestName, longestVersion := 0, 0
  70. for k := range u.PulledDeps {
  71. upgrade := &u.PulledDeps[k]
  72. packNameLen := len(StylizedNameWithRepository(upgrade))
  73. packVersion, _ := query.GetVersionDiff(upgrade.LocalVersion, upgrade.RemoteVersion)
  74. packVersionLen := len(packVersion)
  75. longestName = max(packNameLen, longestName)
  76. longestVersion = max(packVersionLen, longestVersion)
  77. }
  78. lenUp := len(u.PulledDeps)
  79. longestNumber := len(fmt.Sprintf("%v", lenUp))
  80. namePadding := fmt.Sprintf(" %s%%-%ds ", strings.Repeat(" ", longestNumber), longestName)
  81. versionPadding := fmt.Sprintf("%%-%ds", longestVersion)
  82. for k := range u.PulledDeps {
  83. upgrade := &u.PulledDeps[k]
  84. left, right := query.GetVersionDiff(upgrade.LocalVersion, upgrade.RemoteVersion)
  85. logger.Printf(namePadding, StylizedNameWithRepository(upgrade))
  86. logger.Printf("%s -> %s\n", fmt.Sprintf(versionPadding, left), right)
  87. if upgrade.Extra != "" {
  88. logger.Println(strings.Repeat(" ", longestNumber), strings.ToLower(upgrade.Extra))
  89. }
  90. }
  91. logger.Println()
  92. }