fix(clean): extract alpmHandle

This commit is contained in:
Jguer 2020-08-07 17:55:19 +01:00 committed by jguer
parent 7bcf2ecb4c
commit 0e2a02b512
No known key found for this signature in database
GPG Key ID: 6D6CC9BEA8556B35
4 changed files with 54 additions and 69 deletions

View File

@ -8,8 +8,6 @@ import (
"github.com/leonelquinteros/gotext" "github.com/leonelquinteros/gotext"
"github.com/Jguer/go-alpm"
"github.com/Jguer/yay/v10/pkg/db" "github.com/Jguer/yay/v10/pkg/db"
"github.com/Jguer/yay/v10/pkg/dep" "github.com/Jguer/yay/v10/pkg/dep"
"github.com/Jguer/yay/v10/pkg/query" "github.com/Jguer/yay/v10/pkg/query"
@ -40,12 +38,8 @@ func removeVCSPackage(pkgs []string) {
} }
// CleanDependencies removes all dangling dependencies in system // CleanDependencies removes all dangling dependencies in system
func cleanDependencies(cmdArgs *settings.Arguments, alpmHandle *alpm.Handle, removeOptional bool) error { func cleanDependencies(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor, removeOptional bool) error {
hanging, err := hangingPackages(removeOptional, alpmHandle) hanging := hangingPackages(removeOptional, dbExecutor)
if err != nil {
return err
}
if len(hanging) != 0 { if len(hanging) != 0 {
return cleanRemove(cmdArgs, hanging) return cleanRemove(cmdArgs, hanging)
} }

8
cmd.go
View File

@ -172,7 +172,7 @@ func handleCmd(cmdArgs *settings.Arguments, alpmHandle *alpm.Handle, dbExecutor
case "P", "show": case "P", "show":
return handlePrint(cmdArgs, alpmHandle, dbExecutor) return handlePrint(cmdArgs, alpmHandle, dbExecutor)
case "Y", "--yay": case "Y", "--yay":
return handleYay(cmdArgs, alpmHandle, dbExecutor) return handleYay(cmdArgs, dbExecutor)
} }
return fmt.Errorf(gotext.Get("unhandled operation")) return fmt.Errorf(gotext.Get("unhandled operation"))
@ -244,15 +244,15 @@ func handlePrint(cmdArgs *settings.Arguments, alpmHandle *alpm.Handle, dbExecuto
return err return err
} }
func handleYay(cmdArgs *settings.Arguments, alpmHandle *alpm.Handle, dbExecutor *db.AlpmExecutor) error { func handleYay(cmdArgs *settings.Arguments, dbExecutor *db.AlpmExecutor) error {
if cmdArgs.ExistsArg("gendb") { if cmdArgs.ExistsArg("gendb") {
return createDevelDB(config.Runtime.VCSPath, dbExecutor) return createDevelDB(config.Runtime.VCSPath, dbExecutor)
} }
if cmdArgs.ExistsDouble("c") { if cmdArgs.ExistsDouble("c") {
return cleanDependencies(cmdArgs, alpmHandle, true) return cleanDependencies(cmdArgs, dbExecutor, true)
} }
if cmdArgs.ExistsArg("c", "clean") { if cmdArgs.ExistsArg("c", "clean") {
return cleanDependencies(cmdArgs, alpmHandle, false) return cleanDependencies(cmdArgs, dbExecutor, false)
} }
if len(cmdArgs.Targets) > 0 { if len(cmdArgs.Targets) > 0 {
return handleYogurt(cmdArgs, dbExecutor) return handleYogurt(cmdArgs, dbExecutor)

View File

@ -4,7 +4,7 @@ import (
"errors" "errors"
alpm "github.com/Jguer/go-alpm" alpm "github.com/Jguer/go-alpm"
"github.com/Morganamilo/go-pacmanconf" pacmanconf "github.com/Morganamilo/go-pacmanconf"
"github.com/leonelquinteros/gotext" "github.com/leonelquinteros/gotext"
"github.com/Jguer/yay/v10/pkg/text" "github.com/Jguer/yay/v10/pkg/text"
@ -260,6 +260,11 @@ func (ae *AlpmExecutor) PackageDepends(pkg RepoPackage) []alpm.Depend {
return alpmPackage.Depends().Slice() return alpmPackage.Depends().Slice()
} }
func (ae *AlpmExecutor) PackageOptionalDepends(pkg RepoPackage) []alpm.Depend {
alpmPackage := pkg.(*alpm.Package)
return alpmPackage.OptionalDepends().Slice()
}
func (ae *AlpmExecutor) PackageProvides(pkg RepoPackage) []alpm.Depend { func (ae *AlpmExecutor) PackageProvides(pkg RepoPackage) []alpm.Depend {
alpmPackage := pkg.(*alpm.Package) alpmPackage := pkg.(*alpm.Package)
return alpmPackage.Provides().Slice() return alpmPackage.Provides().Slice()

View File

@ -295,12 +295,7 @@ func packageSlices(toCheck []string, alpmHandle *alpm.Handle) (aur, repo []strin
// HangingPackages returns a list of packages installed as deps // HangingPackages returns a list of packages installed as deps
// and unneeded by the system // and unneeded by the system
// removeOptional decides whether optional dependencies are counted or not // removeOptional decides whether optional dependencies are counted or not
func hangingPackages(removeOptional bool, alpmHandle *alpm.Handle) (hanging []string, err error) { func hangingPackages(removeOptional bool, dbExecutor *db.AlpmExecutor) (hanging []string) {
localDB, err := alpmHandle.LocalDB()
if err != nil {
return
}
// safePackages represents every package in the system in one of 3 states // safePackages represents every package in the system in one of 3 states
// State = 0 - Remove package from the system // State = 0 - Remove package from the system
// State = 1 - Keep package in the system; need to iterate over dependencies // State = 1 - Keep package in the system; need to iterate over dependencies
@ -308,78 +303,69 @@ func hangingPackages(removeOptional bool, alpmHandle *alpm.Handle) (hanging []st
safePackages := make(map[string]uint8) safePackages := make(map[string]uint8)
// provides stores a mapping from the provides name back to the original package name // provides stores a mapping from the provides name back to the original package name
provides := make(stringset.MapStringSet) provides := make(stringset.MapStringSet)
packages := localDB.PkgCache()
packages := dbExecutor.LocalPackages()
// Mark explicit dependencies and enumerate the provides list // Mark explicit dependencies and enumerate the provides list
setupResources := func(pkg alpm.Package) error { for _, pkg := range packages {
if pkg.Reason() == alpm.PkgReasonExplicit { if pkg.Reason() == alpm.PkgReasonExplicit {
safePackages[pkg.Name()] = 1 safePackages[pkg.Name()] = 1
} else { } else {
safePackages[pkg.Name()] = 0 safePackages[pkg.Name()] = 0
} }
_ = pkg.Provides().ForEach(func(dep alpm.Depend) error { for _, dep := range dbExecutor.PackageProvides(pkg) {
provides.Add(dep.Name, pkg.Name()) provides.Add(dep.Name, pkg.Name())
return nil }
})
return nil
} }
_ = packages.ForEach(setupResources)
iterateAgain := true iterateAgain := true
processDependencies := func(pkg alpm.Package) error {
if state := safePackages[pkg.Name()]; state == 0 || state == 2 {
return nil
}
safePackages[pkg.Name()] = 2
// Update state for dependencies
markDependencies := func(dep alpm.Depend) error {
// Don't assume a dependency is installed
state, ok := safePackages[dep.Name]
if !ok {
// Check if dep is a provides rather than actual package name
if pset, ok2 := provides[dep.Name]; ok2 {
for p := range pset {
if safePackages[p] == 0 {
iterateAgain = true
safePackages[p] = 1
}
}
}
return nil
}
if state == 0 {
iterateAgain = true
safePackages[dep.Name] = 1
}
return nil
}
_ = pkg.Depends().ForEach(markDependencies)
if !removeOptional {
_ = pkg.OptionalDepends().ForEach(markDependencies)
}
return nil
}
for iterateAgain { for iterateAgain {
iterateAgain = false iterateAgain = false
_ = packages.ForEach(processDependencies) for _, pkg := range packages {
if state := safePackages[pkg.Name()]; state == 0 || state == 2 {
continue
}
safePackages[pkg.Name()] = 2
deps := dbExecutor.PackageDepends(pkg)
if !removeOptional {
deps = append(deps, dbExecutor.PackageOptionalDepends(pkg)...)
}
// Update state for dependencies
for _, dep := range deps {
// Don't assume a dependency is installed
state, ok := safePackages[dep.Name]
if !ok {
// Check if dep is a provides rather than actual package name
if pset, ok2 := provides[dep.Name]; ok2 {
for p := range pset {
if safePackages[p] == 0 {
iterateAgain = true
safePackages[p] = 1
}
}
}
continue
}
if state == 0 {
iterateAgain = true
safePackages[dep.Name] = 1
}
}
}
} }
// Build list of packages to be removed // Build list of packages to be removed
_ = packages.ForEach(func(pkg alpm.Package) error { for _, pkg := range packages {
if safePackages[pkg.Name()] == 0 { if safePackages[pkg.Name()] == 0 {
hanging = append(hanging, pkg.Name()) hanging = append(hanging, pkg.Name())
} }
return nil }
})
return hanging, err return hanging
} }
// Statistics returns statistics about packages installed in system // Statistics returns statistics about packages installed in system