123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- package upgrade
- import (
- "fmt"
- "unicode"
- "github.com/Jguer/yay/v11/pkg/db"
- "github.com/Jguer/yay/v11/pkg/intrange"
- "github.com/Jguer/yay/v11/pkg/text"
- )
- // Filter decides if specific package should be included in theincluded in the results.
- type Filter func(Upgrade) bool
- // Upgrade type describes a system upgrade.
- type Upgrade = db.Upgrade
- func StylizedNameWithRepository(u *Upgrade) string {
- return text.Bold(text.ColorHash(u.Repository)) + "/" + text.Bold(u.Name)
- }
- // upSlice is a slice of Upgrades.
- type UpSlice struct {
- Up []Upgrade
- Repos []string
- }
- func (u UpSlice) Len() int { return len(u.Up) }
- func (u UpSlice) Swap(i, j int) { u.Up[i], u.Up[j] = u.Up[j], u.Up[i] }
- func (u UpSlice) Less(i, j int) bool {
- if u.Up[i].Repository == u.Up[j].Repository {
- iRunes := []rune(u.Up[i].Name)
- jRunes := []rune(u.Up[j].Name)
- return text.LessRunes(iRunes, jRunes)
- }
- for _, db := range u.Repos {
- if db == u.Up[i].Repository {
- return true
- } else if db == u.Up[j].Repository {
- return false
- }
- }
- iRunes := []rune(u.Up[i].Repository)
- jRunes := []rune(u.Up[j].Repository)
- return text.LessRunes(iRunes, jRunes)
- }
- func GetVersionDiff(oldVersion, newVersion string) (left, right string) {
- if oldVersion == newVersion {
- return oldVersion + text.Red(""), newVersion + text.Green("")
- }
- diffPosition := 0
- checkWords := func(str string, index int, words ...string) bool {
- for _, word := range words {
- wordLength := len(word)
- nextIndex := index + 1
- if (index < len(str)-wordLength) &&
- (str[nextIndex:(nextIndex+wordLength)] == word) {
- return true
- }
- }
- return false
- }
- for index, char := range oldVersion {
- charIsSpecial := !(unicode.IsLetter(char) || unicode.IsNumber(char))
- if (index >= len(newVersion)) || (char != rune(newVersion[index])) {
- if charIsSpecial {
- diffPosition = index
- }
- break
- }
- if charIsSpecial ||
- (((index == len(oldVersion)-1) || (index == len(newVersion)-1)) &&
- ((len(oldVersion) != len(newVersion)) ||
- (oldVersion[index] == newVersion[index]))) ||
- checkWords(oldVersion, index, "rc", "pre", "alpha", "beta") {
- diffPosition = index + 1
- }
- }
- samePart := oldVersion[0:diffPosition]
- left = samePart + text.Red(oldVersion[diffPosition:])
- right = samePart + text.Green(newVersion[diffPosition:])
- return left, right
- }
- // Print prints the details of the packages to upgrade.
- func (u UpSlice) Print() {
- longestName, longestVersion := 0, 0
- for k := range u.Up {
- upgrade := &u.Up[k]
- packNameLen := len(StylizedNameWithRepository(upgrade))
- packVersion, _ := GetVersionDiff(upgrade.LocalVersion, upgrade.RemoteVersion)
- packVersionLen := len(packVersion)
- longestName = intrange.Max(packNameLen, longestName)
- longestVersion = intrange.Max(packVersionLen, longestVersion)
- }
- namePadding := fmt.Sprintf("%%-%ds ", longestName)
- versionPadding := fmt.Sprintf("%%-%ds", longestVersion)
- numberPadding := fmt.Sprintf("%%%dd ", len(fmt.Sprintf("%v", len(u.Up))))
- for k := range u.Up {
- upgrade := &u.Up[k]
- left, right := GetVersionDiff(upgrade.LocalVersion, upgrade.RemoteVersion)
- fmt.Print(text.Magenta(fmt.Sprintf(numberPadding, len(u.Up)-k)))
- fmt.Printf(namePadding, StylizedNameWithRepository(upgrade))
- fmt.Printf("%s -> %s\n", fmt.Sprintf(versionPadding, left), right)
- }
- }
|