solver.Order now return error

This commit is contained in:
Daniele Rondina
2020-04-09 17:07:57 +02:00
parent 726a749b4b
commit c2e9176ab2
6 changed files with 37 additions and 15 deletions

View File

@@ -185,7 +185,9 @@ func NewTreeValidateCommand() *cobra.Command {
if withSolver { if withSolver {
Spinner(32) Spinner(32)
solution, err := depSolver.Install(pkg.Packages{r}) solution, err := depSolver.Install(pkg.Packages{r})
solution.Order(reciper.GetDatabase(), r.GetFingerPrint()) if err == nil {
_, err = solution.Order(reciper.GetDatabase(), r.GetFingerPrint())
}
SpinnerStop() SpinnerStop()
if err != nil { if err != nil {

View File

@@ -438,7 +438,10 @@ func (cs *LuetCompiler) ComputeDepTree(p CompilationSpec) (solver.PackagesAssert
return nil, errors.Wrap(err, "While computing a solution for "+p.GetPackage().HumanReadableString()) return nil, errors.Wrap(err, "While computing a solution for "+p.GetPackage().HumanReadableString())
} }
dependencies := solution.Order(cs.Database, p.GetPackage().GetFingerPrint()) dependencies, err := solution.Order(cs.Database, p.GetPackage().GetFingerPrint())
if err != nil {
return nil, errors.Wrap(err, "While order a solution for "+p.GetPackage().HumanReadableString())
}
assertions := solver.PackagesAssertions{} assertions := solver.PackagesAssertions{}
for _, assertion := range dependencies { //highly dependent on the order for _, assertion := range dependencies { //highly dependent on the order

View File

@@ -326,7 +326,10 @@ func (l *LuetInstaller) install(syncedRepos Repositories, cp pkg.Packages, s *Sy
// TODO: Lower those errors as warning // TODO: Lower those errors as warning
for _, w := range p { for _, w := range p {
// Finalizers needs to run in order and in sequence. // Finalizers needs to run in order and in sequence.
ordered := solution.Order(allRepos, w.GetFingerPrint()) ordered, err := solution.Order(allRepos, w.GetFingerPrint())
if err != nil {
return errors.Wrap(err, "While order a solution for "+w.HumanReadableString())
}
ORDER: ORDER:
for _, ass := range ordered { for _, ass := range ordered {
if ass.Value { if ass.Value {

View File

@@ -23,6 +23,7 @@ import (
pkg "github.com/mudler/luet/pkg/package" pkg "github.com/mudler/luet/pkg/package"
toposort "github.com/philopon/go-toposort" toposort "github.com/philopon/go-toposort"
"github.com/pkg/errors"
"github.com/stevenle/topsort" "github.com/stevenle/topsort"
) )
@@ -145,7 +146,7 @@ func (assertions PackagesAssertions) Search(f string) *PackageAssert {
return nil return nil
} }
func (assertions PackagesAssertions) Order(definitiondb pkg.PackageDatabase, fingerprint string) PackagesAssertions { func (assertions PackagesAssertions) Order(definitiondb pkg.PackageDatabase, fingerprint string) (PackagesAssertions, error) {
orderedAssertions := PackagesAssertions{} orderedAssertions := PackagesAssertions{}
unorderedAssertions := PackagesAssertions{} unorderedAssertions := PackagesAssertions{}
@@ -191,19 +192,19 @@ func (assertions PackagesAssertions) Order(definitiondb pkg.PackageDatabase, fin
} }
result, err := graph.TopSort(fingerprint) result, err := graph.TopSort(fingerprint)
if err != nil { if err != nil {
panic(err) return nil, errors.Wrap(err, "fail on sorting "+fingerprint)
} }
for _, res := range result { for _, res := range result {
a, ok := tmpMap[res] a, ok := tmpMap[res]
if !ok { if !ok {
panic("fail looking for " + res) return nil, errors.New("fail looking for " + res)
// continue // continue
} }
orderedAssertions = append(orderedAssertions, a) orderedAssertions = append(orderedAssertions, a)
// orderedAssertions = append(PackagesAssertions{a}, orderedAssertions...) // push upfront // orderedAssertions = append(PackagesAssertions{a}, orderedAssertions...) // push upfront
} }
//helpers.ReverseAny(orderedAssertions) //helpers.ReverseAny(orderedAssertions)
return orderedAssertions return orderedAssertions, nil
} }
func (assertions PackagesAssertions) Explain() string { func (assertions PackagesAssertions) Explain() string {

View File

@@ -72,7 +72,8 @@ var _ = Describe("Decoder", func() {
Expect(len(solution)).To(Equal(6)) Expect(len(solution)).To(Equal(6))
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
solution = solution.Order(dbDefinitions, A.GetFingerPrint()) solution, err = solution.Order(dbDefinitions, A.GetFingerPrint())
Expect(err).ToNot(HaveOccurred())
// Expect(len(solution)).To(Equal(6)) // Expect(len(solution)).To(Equal(6))
Expect(solution[0].Package.GetName()).To(Equal("G")) Expect(solution[0].Package.GetName()).To(Equal("G"))
Expect(solution[1].Package.GetName()).To(Equal("H")) Expect(solution[1].Package.GetName()).To(Equal("H"))
@@ -188,7 +189,8 @@ var _ = Describe("Decoder", func() {
Expect(len(solution)).To(Equal(6)) Expect(len(solution)).To(Equal(6))
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
solution = solution.Order(dbDefinitions, A.GetFingerPrint()) solution, err = solution.Order(dbDefinitions, A.GetFingerPrint())
Expect(err).ToNot(HaveOccurred())
// Expect(len(solution)).To(Equal(6)) // Expect(len(solution)).To(Equal(6))
Expect(solution[0].Package.GetName()).To(Equal("G")) Expect(solution[0].Package.GetName()).To(Equal("G"))
Expect(solution[1].Package.GetName()).To(Equal("H")) Expect(solution[1].Package.GetName()).To(Equal("H"))
@@ -206,7 +208,8 @@ var _ = Describe("Decoder", func() {
Expect(len(solution)).To(Equal(6)) Expect(len(solution)).To(Equal(6))
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
solution = solution.Order(dbDefinitions, B.GetFingerPrint()) solution, err = solution.Order(dbDefinitions, B.GetFingerPrint())
Expect(err).ToNot(HaveOccurred())
hash2 := solution.AssertionHash() hash2 := solution.AssertionHash()
// Expect(len(solution)).To(Equal(6)) // Expect(len(solution)).To(Equal(6))
@@ -243,7 +246,11 @@ var _ = Describe("Decoder", func() {
solution2, err := s.Install([]pkg.Package{Z}) solution2, err := s.Install([]pkg.Package{Z})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(solution.Order(dbDefinitions, Y.GetFingerPrint()).Drop(Y).AssertionHash() == solution2.Order(dbDefinitions, Z.GetFingerPrint()).Drop(Z).AssertionHash()).To(BeTrue()) orderY, err := solution.Order(dbDefinitions, Y.GetFingerPrint())
Expect(err).ToNot(HaveOccurred())
orderZ, err := solution2.Order(dbDefinitions, Z.GetFingerPrint())
Expect(err).ToNot(HaveOccurred())
Expect(orderY.Drop(Y).AssertionHash() == orderZ.Drop(Z).AssertionHash()).To(BeTrue())
}) })
It("Hashes them, Cuts them and could be used for comparison", func() { It("Hashes them, Cuts them and could be used for comparison", func() {
@@ -267,9 +274,13 @@ var _ = Describe("Decoder", func() {
solution2, err := s.Install([]pkg.Package{Z}) solution2, err := s.Install([]pkg.Package{Z})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(solution.Order(dbDefinitions, Y.GetFingerPrint()).Cut(Y).Drop(Y)).To(Equal(solution2.Order(dbDefinitions, Z.GetFingerPrint()).Cut(Z).Drop(Z))) orderY, err := solution.Order(dbDefinitions, Y.GetFingerPrint())
Expect(err).ToNot(HaveOccurred())
orderZ, err := solution2.Order(dbDefinitions, Z.GetFingerPrint())
Expect(err).ToNot(HaveOccurred())
Expect(orderY.Cut(Y).Drop(Y)).To(Equal(orderZ.Cut(Z).Drop(Z)))
Expect(solution.Order(dbDefinitions, Y.GetFingerPrint()).Cut(Y).Drop(Y).AssertionHash()).To(Equal(solution2.Order(dbDefinitions, Z.GetFingerPrint()).Cut(Z).Drop(Z).AssertionHash())) Expect(orderY.Cut(Y).Drop(Y).AssertionHash()).To(Equal(orderZ.Cut(Z).Drop(Z).AssertionHash()))
}) })
}) })

View File

@@ -65,7 +65,8 @@ var _ = Describe("Tree", func() {
solution, err := s.Install([]pkg.Package{pack}) solution, err := s.Install([]pkg.Package{pack})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
solution = solution.Order(generalRecipe.GetDatabase(), pack.GetFingerPrint()) solution, err = solution.Order(generalRecipe.GetDatabase(), pack.GetFingerPrint())
Expect(err).ToNot(HaveOccurred())
Expect(solution[0].Package.GetName()).To(Equal("a")) Expect(solution[0].Package.GetName()).To(Equal("a"))
Expect(solution[0].Value).To(BeFalse()) Expect(solution[0].Value).To(BeFalse())
@@ -137,7 +138,8 @@ var _ = Describe("Tree", func() {
solution, err := s.Install([]pkg.Package{Dd}) solution, err := s.Install([]pkg.Package{Dd})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
solution = solution.Order(generalRecipe.GetDatabase(), Dd.GetFingerPrint()) solution, err = solution.Order(generalRecipe.GetDatabase(), Dd.GetFingerPrint())
Expect(err).ToNot(HaveOccurred())
pack, err := generalRecipe.GetDatabase().FindPackage(&pkg.DefaultPackage{Name: "a", Category: "test", Version: "1.0"}) pack, err := generalRecipe.GetDatabase().FindPackage(&pkg.DefaultPackage{Name: "a", Category: "test", Version: "1.0"})
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())