Move selection logic to package BuildFormula()

This commit is contained in:
Ettore Di Giacinto 2019-12-13 23:37:44 +01:00
parent 926f636dff
commit b8c62c3e85
No known key found for this signature in database
GPG Key ID: 1ADA699B145A2D1C
2 changed files with 75 additions and 2 deletions

View File

@ -401,9 +401,49 @@ func (pack *DefaultPackage) BuildFormula(definitiondb PackageDatabase, db Packag
var formulas []bf.Formula var formulas []bf.Formula
for _, requiredDef := range p.GetRequires() { for _, requiredDef := range p.GetRequires() {
required, err := definitiondb.FindPackageCandidate(requiredDef) required, err := definitiondb.FindPackage(requiredDef)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "Couldn't find required package in db definition") packages, err := requiredDef.Expand(definitiondb)
if err != nil || len(packages) == 0 {
required = requiredDef
} else {
if len(packages) == 1 {
required = packages[0]
} else {
var bb []bf.Formula
for _, o := range packages {
encodedB, err := o.Encode(db)
if err != nil {
return nil, err
}
B := bf.Var(encodedB)
bb = append(bb, B)
for _, i := range packages {
encodedI, err := i.Encode(db)
if err != nil {
return nil, err
}
I := bf.Var(encodedI)
if !o.Matches(i) {
// formulas = append(formulas, bf.Or(I, B))
formulas = append(formulas, bf.Or(bf.Not(I), bf.Not(B)))
f, err := i.BuildFormula(definitiondb, db)
if err != nil {
return nil, err
}
formulas = append(formulas, f...)
}
}
}
// formulas = append(formulas, bf.Or(bb...))
continue
}
}
} }
encodedB, err := required.Encode(db) encodedB, err := required.Encode(db)

View File

@ -326,6 +326,39 @@ var _ = Describe("Solver", func() {
Expect(len(solution)).To(Equal(3)) Expect(len(solution)).To(Equal(3))
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
}) })
It("Selects one version", func() {
E := pkg.NewPackage("E", "", []*pkg.DefaultPackage{}, []*pkg.DefaultPackage{})
C := pkg.NewPackage("C", "", []*pkg.DefaultPackage{}, []*pkg.DefaultPackage{})
D2 := pkg.NewPackage("D", "1.9", []*pkg.DefaultPackage{}, []*pkg.DefaultPackage{})
D := pkg.NewPackage("D", "1.8", []*pkg.DefaultPackage{}, []*pkg.DefaultPackage{})
D1 := pkg.NewPackage("D", "1.4", []*pkg.DefaultPackage{}, []*pkg.DefaultPackage{})
B := pkg.NewPackage("B", "1.1", []*pkg.DefaultPackage{&pkg.DefaultPackage{Name: "D", Version: "1.4"}}, []*pkg.DefaultPackage{})
A := pkg.NewPackage("A", "", []*pkg.DefaultPackage{&pkg.DefaultPackage{Name: "D", Version: ">=1.0"}}, []*pkg.DefaultPackage{})
for _, p := range []pkg.Package{A, B, C, D, D1, D2, E} {
_, err := dbDefinitions.CreatePackage(p)
Expect(err).ToNot(HaveOccurred())
}
for _, p := range []pkg.Package{} {
_, err := dbInstalled.CreatePackage(p)
Expect(err).ToNot(HaveOccurred())
}
s = NewSolver(dbInstalled, dbDefinitions, db)
solution, err := s.Install([]pkg.Package{A, B})
Expect(solution).To(ContainElement(PackageAssert{Package: A, Value: true}))
Expect(solution).To(ContainElement(PackageAssert{Package: B, Value: true}))
Expect(solution).To(ContainElement(PackageAssert{Package: D1, Value: true}))
Expect(solution).ToNot(ContainElement(PackageAssert{Package: D, Value: true}))
Expect(solution).ToNot(ContainElement(PackageAssert{Package: D2, Value: true}))
Expect(solution).To(ContainElement(PackageAssert{Package: D, Value: false}))
Expect(solution).To(ContainElement(PackageAssert{Package: D2, Value: false}))
Expect(len(solution)).To(Equal(5))
Expect(err).ToNot(HaveOccurred())
})
It("Uninstalls simple package correctly", func() { It("Uninstalls simple package correctly", func() {
C := pkg.NewPackage("C", "", []*pkg.DefaultPackage{}, []*pkg.DefaultPackage{}) C := pkg.NewPackage("C", "", []*pkg.DefaultPackage{}, []*pkg.DefaultPackage{})