upgrade.go 3.4 KB

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