diff --git a/pkg/api/core/types/assertion.go b/pkg/api/core/types/assertion.go index 15c76c91..13d33eff 100644 --- a/pkg/api/core/types/assertion.go +++ b/pkg/api/core/types/assertion.go @@ -30,7 +30,7 @@ func (a *PackageAssert) String() string { return fmt.Sprintf("%s/%s %s %s", a.Package.GetCategory(), a.Package.GetName(), a.Package.GetVersion(), msg) } -func (assertions PackagesAssertions) EnsureOrder() PackagesAssertions { +func (assertions PackagesAssertions) EnsureOrder() (PackagesAssertions, error) { orderedAssertions := PackagesAssertions{} unorderedAssertions := PackagesAssertions{} @@ -62,19 +62,19 @@ func (assertions PackagesAssertions) EnsureOrder() PackagesAssertions { } result, ok := graph.Toposort() if !ok { - panic("Cycle found") + return nil, fmt.Errorf("cycle found") } for _, res := range result { a, ok := tmpMap[res] if !ok { - panic("fail") - // continue + return nil, fmt.Errorf("cycle found") + } orderedAssertions = append(orderedAssertions, a) // orderedAssertions = append(PackagesAssertions{a}, orderedAssertions...) // push upfront } //helpers.ReverseAny(orderedAssertions) - return orderedAssertions + return orderedAssertions, nil } // SearchByName searches a string matching a package in the assetion list diff --git a/pkg/installer/finalizer.go b/pkg/installer/finalizer.go index 3419c8e5..6c7b6d78 100644 --- a/pkg/installer/finalizer.go +++ b/pkg/installer/finalizer.go @@ -22,6 +22,8 @@ import ( "github.com/ghodss/yaml" "github.com/mudler/luet/pkg/api/core/types" box "github.com/mudler/luet/pkg/box" + fileHelper "github.com/mudler/luet/pkg/helpers/file" + "github.com/mudler/luet/pkg/tree" "github.com/pkg/errors" ) @@ -90,3 +92,47 @@ func NewLuetFinalizerFromYaml(data []byte) (*LuetFinalizer, error) { } return &p, err } + +func OrderFinalizers(allRepos types.PackageDatabase, toInstall map[string]ArtifactMatch, solution types.PackagesAssertions) ([]*types.Package, error) { + var toFinalize []*types.Package + if len(toInstall) == 1 { + for _, w := range toInstall { + if fileHelper.Exists(w.Package.Rel(tree.FinalizerFile)) { + // Finalizers needs to run in order and in sequence. + ordered, err := solution.Order(allRepos, w.Package.GetFingerPrint()) + if err != nil { + return toFinalize, errors.Wrap(err, "While order a solution for "+w.Package.HumanReadableString()) + } + ORDER: + for _, ass := range ordered { + if ass.Value { + installed, ok := toInstall[ass.Package.GetFingerPrint()] + if !ok { + // It was a dep already installed in the system, so we can skip it safely + continue ORDER + } + treePackage, err := installed.Repository.GetTree().GetDatabase().FindPackage(ass.Package) + if err != nil { + return toFinalize, errors.Wrap(err, "Error getting package "+ass.Package.HumanReadableString()) + } + + toFinalize = append(toFinalize, treePackage) + } + } + } + } + } else { + assertions, err := solution.EnsureOrder() + if err != nil { + return toFinalize, err + } + + for _, o := range assertions { + if o.Value { + toFinalize = append(toFinalize, o.Package) + } + } + } + + return toFinalize, nil +} diff --git a/pkg/installer/installer.go b/pkg/installer/installer.go index 5dde64de..6b508f61 100644 --- a/pkg/installer/installer.go +++ b/pkg/installer/installer.go @@ -816,33 +816,7 @@ func (l *LuetInstaller) computeInstall(o Option, syncedRepos Repositories, cp ty func (l *LuetInstaller) getFinalizers(allRepos types.PackageDatabase, solution types.PackagesAssertions, toInstall map[string]ArtifactMatch, nodeps bool) ([]*types.Package, error) { var toFinalize []*types.Package if !nodeps { - // TODO: Lower those errors as l.Options.Context.Warning - for _, w := range toInstall { - if !fileHelper.Exists(w.Package.Rel(tree.FinalizerFile)) { - continue - } - // Finalizers needs to run in order and in sequence. - ordered, err := solution.Order(allRepos, w.Package.GetFingerPrint()) - if err != nil { - return toFinalize, errors.Wrap(err, "While order a solution for "+w.Package.HumanReadableString()) - } - ORDER: - for _, ass := range ordered { - if ass.Value { - installed, ok := toInstall[ass.Package.GetFingerPrint()] - if !ok { - // It was a dep already installed in the system, so we can skip it safely - continue ORDER - } - treePackage, err := installed.Repository.GetTree().GetDatabase().FindPackage(ass.Package) - if err != nil { - return toFinalize, errors.Wrap(err, "Error getting package "+ass.Package.HumanReadableString()) - } - - toFinalize = append(toFinalize, treePackage) - } - } - } + return OrderFinalizers(allRepos, toInstall, solution) } else { for _, c := range toInstall { if !fileHelper.Exists(c.Package.Rel(tree.FinalizerFile)) {