diff --git a/pkg/db/executor.go b/pkg/db/executor.go index 8fa06b5d..da3d24eb 100644 --- a/pkg/db/executor.go +++ b/pkg/db/executor.go @@ -26,6 +26,7 @@ type Upgrade struct { LocalVersion string RemoteVersion string Reason alpm.PkgReason + Extra string // Extra information to be displayed } type SyncUpgrade struct { diff --git a/pkg/topo/dep.go b/pkg/topo/dep.go index cbc01d85..0941d02c 100644 --- a/pkg/topo/dep.go +++ b/pkg/topo/dep.go @@ -12,6 +12,16 @@ type ( DepMap[T comparable] map[T]NodeSet[T] ) +func (n NodeSet[T]) Slice() []T { + var slice []T + + for node := range n { + slice = append(slice, node) + } + + return slice +} + type NodeInfo[V any] struct { Color string Background string @@ -253,10 +263,10 @@ func (g *Graph[T, V]) remove(node T) { } func (g *Graph[T, V]) Dependencies(child T) NodeSet[T] { - return g.buildTransitive(child, g.immediateDependencies) + return g.buildTransitive(child, g.ImmediateDependencies) } -func (g *Graph[T, V]) immediateDependencies(node T) NodeSet[T] { +func (g *Graph[T, V]) ImmediateDependencies(node T) NodeSet[T] { return g.dependencies[node] } diff --git a/pkg/upgrade/service.go b/pkg/upgrade/service.go index de49e758..e2a74d0a 100644 --- a/pkg/upgrade/service.go +++ b/pkg/upgrade/service.go @@ -2,7 +2,10 @@ package upgrade import ( "context" + "fmt" + "math" "sort" + "strings" "github.com/Jguer/aur" "github.com/Jguer/go-alpm/v2" @@ -20,6 +23,8 @@ import ( "github.com/Jguer/yay/v12/pkg/vcs" ) +const cutOffExtra = 2 + type UpgradeService struct { grapher *dep.Grapher aurCache aur.QueryClient @@ -188,9 +193,19 @@ func (u *UpgradeService) graphToUpSlice(graph *topo.Graph[string, *dep.InstallIn repoUp = UpSlice{Up: make([]Upgrade, 0, graph.Len()), Repos: u.dbExecutor.Repos()} _ = graph.ForEach(func(name string, info *dep.InstallInfo) error { - alpmReason := alpm.PkgReasonExplicit - if info.Reason == dep.Dep { - alpmReason = alpm.PkgReasonDepend + alpmReason := alpm.PkgReasonDepend + if info.Reason == dep.Explicit { + alpmReason = alpm.PkgReasonExplicit + } + + parents := graph.ImmediateDependencies(name) + extra := "" + if len(parents) > 0 && !info.Upgrade && info.Reason == dep.MakeDep { + reducedParents := parents.Slice()[:int(math.Min(cutOffExtra, float64(len(parents))))] + if len(parents) > cutOffExtra { + reducedParents = append(reducedParents, "...") + } + extra = fmt.Sprintf(" (%s of %s)", dep.ReasonNames[info.Reason], strings.Join(reducedParents, ", ")) } if info.Source == dep.AUR { @@ -205,6 +220,7 @@ func (u *UpgradeService) graphToUpSlice(graph *topo.Graph[string, *dep.InstallIn Base: *info.AURBase, LocalVersion: info.LocalVersion, Reason: alpmReason, + Extra: extra, }) } else if info.Source == dep.Sync { repoUp.Up = append(repoUp.Up, Upgrade{ @@ -214,6 +230,7 @@ func (u *UpgradeService) graphToUpSlice(graph *topo.Graph[string, *dep.InstallIn Base: "", LocalVersion: info.LocalVersion, Reason: alpmReason, + Extra: extra, }) } return nil diff --git a/pkg/upgrade/upgrade.go b/pkg/upgrade/upgrade.go index fc269d96..5efe7ecb 100644 --- a/pkg/upgrade/upgrade.go +++ b/pkg/upgrade/upgrade.go @@ -2,6 +2,7 @@ package upgrade import ( "fmt" + "strings" "unicode" "github.com/Jguer/yay/v12/pkg/db" @@ -112,18 +113,23 @@ func (u UpSlice) Print(logger *text.Logger) { longestVersion = intrange.Max(packVersionLen, longestVersion) } + lenUp := len(u.Up) + longestNumber := len(fmt.Sprintf("%v", lenUp)) namePadding := fmt.Sprintf("%%-%ds ", longestName) versionPadding := fmt.Sprintf("%%-%ds", longestVersion) - numberPadding := fmt.Sprintf("%%%dd ", len(fmt.Sprintf("%v", len(u.Up)))) + numberPadding := fmt.Sprintf("%%%dd ", longestNumber) for k := range u.Up { upgrade := &u.Up[k] left, right := GetVersionDiff(upgrade.LocalVersion, upgrade.RemoteVersion) - logger.Printf(text.Magenta(fmt.Sprintf(numberPadding, len(u.Up)-k))) + logger.Printf(text.Magenta(fmt.Sprintf(numberPadding, lenUp-k))) logger.Printf(namePadding, StylizedNameWithRepository(upgrade)) logger.Printf("%s -> %s\n", fmt.Sprintf(versionPadding, left), right) + if upgrade.Extra != "" { + logger.Println(strings.Repeat(" ", longestNumber), upgrade.Extra) + } } }