diff --git a/pkg/tree/builder.go b/pkg/tree/builder.go index 62ed3b34..d98e651b 100644 --- a/pkg/tree/builder.go +++ b/pkg/tree/builder.go @@ -26,5 +26,5 @@ type Builder interface { GetDatabase() pkg.PackageDatabase WithDatabase(d pkg.PackageDatabase) - GetSourcePath() string + GetSourcePath() []string } diff --git a/pkg/tree/compiler_recipe.go b/pkg/tree/compiler_recipe.go index 84e1776d..bea03a3b 100644 --- a/pkg/tree/compiler_recipe.go +++ b/pkg/tree/compiler_recipe.go @@ -45,7 +45,7 @@ type CompilerRecipe struct { func (r *CompilerRecipe) Load(path string) error { - r.SourcePath = path + r.SourcePath = append(r.SourcePath, path) //tmpfile, err := ioutil.TempFile("", "luet") //if err != nil { // return err @@ -111,4 +111,4 @@ func (r *CompilerRecipe) Load(path string) error { func (r *CompilerRecipe) GetDatabase() pkg.PackageDatabase { return r.Database } func (r *CompilerRecipe) WithDatabase(d pkg.PackageDatabase) { r.Database = d } -func (r *CompilerRecipe) GetSourcePath() string { return r.SourcePath } +func (r *CompilerRecipe) GetSourcePath() []string { return r.SourcePath } diff --git a/pkg/tree/installer_recipe.go b/pkg/tree/installer_recipe.go index 7b581b21..5e81dcc7 100644 --- a/pkg/tree/installer_recipe.go +++ b/pkg/tree/installer_recipe.go @@ -40,7 +40,7 @@ func NewInstallerRecipe(db pkg.PackageDatabase) Builder { // InstallerRecipe is the "general" reciper for Trees type InstallerRecipe struct { - SourcePath string + SourcePath []string Database pkg.PackageDatabase } @@ -74,7 +74,7 @@ func (r *InstallerRecipe) Load(path string) error { // if err != nil { // return err // } - r.SourcePath = path + r.SourcePath = append(r.SourcePath, path) //r.Tree().SetPackageSet(pkg.NewBoltDatabase(tmpfile.Name())) // TODO: Handle cleaning after? Cleanup implemented in GetPackageSet().Clean() @@ -114,4 +114,4 @@ func (r *InstallerRecipe) Load(path string) error { func (r *InstallerRecipe) GetDatabase() pkg.PackageDatabase { return r.Database } func (r *InstallerRecipe) WithDatabase(d pkg.PackageDatabase) { r.Database = d } -func (r *InstallerRecipe) GetSourcePath() string { return r.SourcePath } +func (r *InstallerRecipe) GetSourcePath() []string { return r.SourcePath } diff --git a/pkg/tree/recipes.go b/pkg/tree/recipes.go index e99825bf..052cfcd6 100644 --- a/pkg/tree/recipes.go +++ b/pkg/tree/recipes.go @@ -37,7 +37,7 @@ func NewGeneralRecipe(db pkg.PackageDatabase) Builder { return &Recipe{Database: // Recipe is the "general" reciper for Trees type Recipe struct { - SourcePath string + SourcePath []string Database pkg.PackageDatabase } @@ -65,7 +65,7 @@ func (r *Recipe) Load(path string) error { // if err != nil { // return err // } - r.SourcePath = path + r.SourcePath = append(r.SourcePath, path) if r.Database == nil { r.Database = pkg.NewInMemoryDatabase(false) @@ -109,4 +109,4 @@ func (r *Recipe) Load(path string) error { func (r *Recipe) GetDatabase() pkg.PackageDatabase { return r.Database } func (r *Recipe) WithDatabase(d pkg.PackageDatabase) { r.Database = d } -func (r *Recipe) GetSourcePath() string { return r.SourcePath } +func (r *Recipe) GetSourcePath() []string { return r.SourcePath } diff --git a/pkg/tree/tree_test.go b/pkg/tree/tree_test.go index 0d6cc725..c54c232e 100644 --- a/pkg/tree/tree_test.go +++ b/pkg/tree/tree_test.go @@ -96,4 +96,60 @@ var _ = Describe("Tree", func() { }) }) + Context("Multiple trees", func() { + It("Merges", func() { + for index := 0; index < 300; index++ { // Just to make sure we don't have false positives + db := pkg.NewInMemoryDatabase(false) + generalRecipe := NewCompilerRecipe(db) + tmpdir, err := ioutil.TempDir("", "package") + Expect(err).ToNot(HaveOccurred()) + defer os.RemoveAll(tmpdir) // clean up + + err = generalRecipe.Load("../../tests/fixtures/buildableseed") + Expect(err).ToNot(HaveOccurred()) + + Expect(len(generalRecipe.GetDatabase().World())).To(Equal(4)) + + err = generalRecipe.Load("../../tests/fixtures/layers") + Expect(err).ToNot(HaveOccurred()) + + Expect(len(generalRecipe.GetDatabase().World())).To(Equal(6)) + + extra, err := generalRecipe.GetDatabase().FindPackage(&pkg.DefaultPackage{Name: "extra", Category: "layer", Version: "1.0"}) + Expect(err).ToNot(HaveOccurred()) + Expect(extra).ToNot(BeNil()) + + D, err := generalRecipe.GetDatabase().FindPackage(&pkg.DefaultPackage{Name: "d", Category: "test", Version: "1.0"}) + Expect(err).ToNot(HaveOccurred()) + + Expect(D.GetRequires()[0].GetName()).To(Equal("c")) + CfromD, err := generalRecipe.GetDatabase().FindPackage(D.GetRequires()[0]) + Expect(err).ToNot(HaveOccurred()) + + Expect(len(CfromD.GetRequires()) != 0).To(BeTrue()) + Expect(CfromD.GetRequires()[0].GetName()).To(Equal("b")) + + s := solver.NewSolver(pkg.NewInMemoryDatabase(false), generalRecipe.GetDatabase(), db) + + Dd, err := generalRecipe.GetDatabase().FindPackage(&pkg.DefaultPackage{Name: "d", Category: "test", Version: "1.0"}) + Expect(err).ToNot(HaveOccurred()) + + solution, err := s.Install([]pkg.Package{Dd}) + Expect(err).ToNot(HaveOccurred()) + + solution = solution.Order(generalRecipe.GetDatabase(), Dd.GetFingerPrint()) + pack, err := generalRecipe.GetDatabase().FindPackage(&pkg.DefaultPackage{Name: "a", Category: "test", Version: "1.0"}) + Expect(err).ToNot(HaveOccurred()) + + base, err := generalRecipe.GetDatabase().FindPackage(&pkg.DefaultPackage{Name: "base", Category: "layer", Version: "0.2"}) + Expect(err).ToNot(HaveOccurred()) + Expect(solution).To(ContainElement(solver.PackageAssert{Package: pack.(*pkg.DefaultPackage), Value: false})) + Expect(solution).To(ContainElement(solver.PackageAssert{Package: D.(*pkg.DefaultPackage), Value: true})) + Expect(solution).To(ContainElement(solver.PackageAssert{Package: extra.(*pkg.DefaultPackage), Value: false})) + Expect(solution).To(ContainElement(solver.PackageAssert{Package: base.(*pkg.DefaultPackage), Value: false})) + Expect(len(solution)).To(Equal(6)) + } + }) + }) + })