From a2c32aaaa1ccbe5a26cf4eeb2cb4e7e7359ec131 Mon Sep 17 00:00:00 2001 From: Ettore Di Giacinto Date: Tue, 12 Nov 2019 17:29:32 +0100 Subject: [PATCH] Propagate reverse dep calculation Whenever we update the tree with new informations, all the sibilings needs to be updated as well Also switch to inmemory db for recipe - even if this should be a switch --- pkg/compiler/compiler_test.go | 4 + pkg/tree/recipes.go | 13 ++-- pkg/tree/tree.go | 133 +++++++++++++++++++++++----------- 3 files changed, 103 insertions(+), 47 deletions(-) diff --git a/pkg/compiler/compiler_test.go b/pkg/compiler/compiler_test.go index 90affb4d..d5026aad 100644 --- a/pkg/compiler/compiler_test.go +++ b/pkg/compiler/compiler_test.go @@ -125,6 +125,10 @@ var _ = Describe("Compiler", func() { Expect(err).ToNot(HaveOccurred()) spec3, err := compiler.FromPackage(&pkg.DefaultPackage{Name: "d", Category: "test", Version: "1.0"}) Expect(err).ToNot(HaveOccurred()) + + // err = generalRecipe.Tree().ResolveDeps(3) + // Expect(err).ToNot(HaveOccurred()) + Expect(spec3.GetPackage().GetRequires()[0].GetName()).To(Equal("c")) spec.SetOutputPath(tmpdir) diff --git a/pkg/tree/recipes.go b/pkg/tree/recipes.go index d1411b67..d9b16785 100644 --- a/pkg/tree/recipes.go +++ b/pkg/tree/recipes.go @@ -69,12 +69,13 @@ func (r *Recipe) Load(path string) error { r.PackageTree = NewDefaultTree() } - tmpfile, err := ioutil.TempFile("", "luet") - if err != nil { - return err - } + // tmpfile, err := ioutil.TempFile("", "luet") + // if err != nil { + // return err + // } + r.Tree().SetPackageSet(pkg.NewInMemoryDatabase(false)) - r.Tree().SetPackageSet(pkg.NewBoltDatabase(tmpfile.Name())) + //r.Tree().SetPackageSet(pkg.NewBoltDatabase(tmpfile.Name())) // TODO: Handle cleaning after? Cleanup implemented in GetPackageSet().Clean() // the function that handles each file or dir @@ -103,7 +104,7 @@ func (r *Recipe) Load(path string) error { return nil } - err = filepath.Walk(path, ff) + err := filepath.Walk(path, ff) if err != nil { return err } diff --git a/pkg/tree/tree.go b/pkg/tree/tree.go index 0a18e6a6..2dd3a6ba 100644 --- a/pkg/tree/tree.go +++ b/pkg/tree/tree.go @@ -21,10 +21,10 @@ package tree import ( - "errors" "sync" . "github.com/mudler/luet/pkg/logger" + "github.com/pkg/errors" pkg "github.com/mudler/luet/pkg/package" ) @@ -65,6 +65,22 @@ func (gt *DefaultTree) World() ([]pkg.Package, error) { return packages, nil } +func (gt *DefaultTree) UpdateWorldPackage(p pkg.Package) { + //FIXME: Improve, no copy is needed + var CacheWorld []pkg.Package + + for _, pid := range gt.CacheWorld { + if p.GetFingerPrint() == pid.GetFingerPrint() { + CacheWorld = append(CacheWorld, p) + } else { + CacheWorld = append(CacheWorld, pid) + + } + } + + gt.CacheWorld = CacheWorld +} + // FIXME: Dup in Packageset func (gt *DefaultTree) FindPackage(pack pkg.Package) (pkg.Package, error) { packages, err := gt.World() @@ -79,50 +95,83 @@ func (gt *DefaultTree) FindPackage(pack pkg.Package) (pkg.Package, error) { return nil, errors.New("No package found") } +func (gb *DefaultTree) updatePackage(p pkg.Package) error { + Debug(" "+p.GetName(), "Deps ") + for i, r := range p.GetRequires() { + + foundPackage, err := gb.FindPackage(r) + if err == nil { + + found, ok := foundPackage.(*pkg.DefaultPackage) + if !ok { + panic("Simpleparser should deal only with DefaultPackages") + } + // err = gb.updatePackage(foundPackage) + // if err != nil { + // return errors.Wrap(err, "Failure while updating recursively") + // } + p.GetRequires()[i] = found + } else { + Warning("Unmatched require for", r.GetName()) + } + } + + Debug("Walking conflicts for", p.GetName()) + for i, r := range p.GetConflicts() { + Debug("conflict", r.GetName()) + + foundPackage, err := gb.FindPackage(r) + if err == nil { + + found, ok := foundPackage.(*pkg.DefaultPackage) + if !ok { + panic("Simpleparser should deal only with DefaultPackages") + } + // err = gb.updatePackage(foundPackage) + // if err != nil { + // return errors.Wrap(err, "Failure while updating recursively") + // } + p.GetConflicts()[i] = found + + //r = found + } else { + Warning("Unmatched conflict for", r.GetName()) + + } + } + Debug("Finished processing", p.GetName()) + + if err := gb.GetPackageSet().UpdatePackage(p); err != nil { + return err + } + + gb.UpdateWorldPackage(p) + Debug("Update done", p.GetName()) + Debug("Triggering propagation", p.GetName()) + + Debug(" "+p.GetName(), "Deps ") + for _, r := range p.GetRequires() { + if err := gb.updatePackage(r); err != nil { + return err + } + } + + Debug("Walking conflicts for", p.GetName()) + for _, r := range p.GetConflicts() { + if err := gb.updatePackage(r); err != nil { + return err + } + } + + return nil + +} + func (gb *DefaultTree) depsWorker(i int, wg *sync.WaitGroup, c <-chan pkg.Package) error { defer wg.Done() for p := range c { - SpinnerText(" "+p.GetName(), "Deps ") - for _, r := range p.GetRequires() { - - foundPackage, err := gb.GetPackageSet().FindPackage(r) - if err == nil { - - found, ok := foundPackage.(*pkg.DefaultPackage) - if !ok { - panic("Simpleparser should deal only with DefaultPackages") - } - r = found - } else { - Warning("Unmatched require for", r.GetName()) - } - } - - Debug("Walking conflicts for", p.GetName()) - for _, r := range p.GetConflicts() { - Debug("conflict", r.GetName()) - - foundPackage, err := gb.GetPackageSet().FindPackage(r) - if err == nil { - - found, ok := foundPackage.(*pkg.DefaultPackage) - if !ok { - panic("Simpleparser should deal only with DefaultPackages") - } - r = found - } else { - Warning("Unmatched conflict for", r.GetName()) - - } - } - Debug("Finished processing", p.GetName()) - - if err := gb.GetPackageSet().UpdatePackage(p); err != nil { - return err - } - Debug("Update done", p.GetName()) - + gb.updatePackage(p) } return nil @@ -130,6 +179,8 @@ func (gb *DefaultTree) depsWorker(i int, wg *sync.WaitGroup, c <-chan pkg.Packag // Search for deps/conflicts in db and replaces it with packages in the db func (t *DefaultTree) ResolveDeps(concurrency int) error { + Spinner(32) + defer SpinnerStop() all := make(chan pkg.Package) var wg = new(sync.WaitGroup)