diff --git a/pkg/installer/installer.go b/pkg/installer/installer.go index 02eb1043..4bb7c397 100644 --- a/pkg/installer/installer.go +++ b/pkg/installer/installer.go @@ -758,6 +758,8 @@ func (l *LuetInstaller) getFinalizers(allRepos pkg.PackageDatabase, solution sol func (l *LuetInstaller) checkFileconflicts(toInstall map[string]ArtifactMatch, s *System) error { Info("Checking for file conflicts..") + defer s.Clean() // Release memory + filesToInstall := []string{} for _, m := range toInstall { a, err := l.downloadPackage(m) diff --git a/pkg/installer/system.go b/pkg/installer/system.go index a61f21ee..2dbc65ea 100644 --- a/pkg/installer/system.go +++ b/pkg/installer/system.go @@ -1,6 +1,8 @@ package installer import ( + "sync" + "github.com/hashicorp/go-multierror" "github.com/mudler/luet/pkg/helpers" fileHelper "github.com/mudler/luet/pkg/helpers/file" @@ -10,8 +12,10 @@ import ( ) type System struct { - Database pkg.PackageDatabase - Target string + Database pkg.PackageDatabase + Target string + fileIndex map[string]pkg.Package + sync.Mutex } func (s *System) World() (pkg.Packages, error) { @@ -53,17 +57,37 @@ func (s *System) ExecuteFinalizers(packs []pkg.Package) error { return errs } -func (s *System) ExistsPackageFile(file string) (bool, pkg.Package, error) { - for _, p := range s.Database.World() { - files, err := s.Database.GetPackageFiles(p) - if err != nil { - return false, nil, err - } - for _, f := range files { - if f == file { - return true, p, nil +func (s *System) buildFileIndex() { + s.Lock() + defer s.Unlock() + // Check if cache is empty or if it got modified + if s.fileIndex == nil { //|| len(s.Database.GetPackages()) != len(s.fileIndex) { + s.fileIndex = make(map[string]pkg.Package) + for _, p := range s.Database.World() { + files, _ := s.Database.GetPackageFiles(p) + for _, f := range files { + s.fileIndex[f] = p } } } +} + +func (s *System) Clean() { + s.Lock() + defer s.Unlock() + s.fileIndex = nil +} + +func (s *System) ExistsPackageFile(file string) (bool, pkg.Package, error) { + Debug("Checking if file ", file, "belongs to any package") + s.buildFileIndex() + s.Lock() + defer s.Unlock() + if p, exists := s.fileIndex[file]; exists { + Debug(file, "belongs already to", p.HumanReadableString()) + + return exists, p, nil + } + Debug(file, "doesn't belong to any package") return false, nil, nil } diff --git a/pkg/installer/system_test.go b/pkg/installer/system_test.go index a0a6aa23..72ed8526 100644 --- a/pkg/installer/system_test.go +++ b/pkg/installer/system_test.go @@ -60,7 +60,7 @@ var _ = Describe("System", func() { r, p, err = s.ExistsPackageFile("f") Expect(r).To(BeTrue()) Expect(err).ToNot(HaveOccurred()) - Expect(p).To(Equal(a)) + Expect(p).To(Equal(b)) r, p, err = s.ExistsPackageFile("barz") Expect(r).To(BeTrue()) Expect(err).ToNot(HaveOccurred())