mirror of
https://github.com/mudler/luet.git
synced 2025-09-04 00:34:41 +00:00
Implement uninstall
Also add RemovePackage in database implementation (boltdb is not tested yet) Add test case for uninstall
This commit is contained in:
@@ -21,6 +21,7 @@ import (
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
"sync"
|
||||
|
||||
@@ -311,8 +312,60 @@ func (l *LuetInstaller) installerWorker(i int, wg *sync.WaitGroup, c <-chan Arti
|
||||
|
||||
return nil
|
||||
}
|
||||
func (l *LuetInstaller) Uninstall(p []pkg.Package, s *System) error {
|
||||
|
||||
func (l *LuetInstaller) uninstall(p pkg.Package, s *System) error {
|
||||
files, err := s.Database.GetPackageFiles(p)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "Failed getting installed files")
|
||||
}
|
||||
|
||||
// Remove from target
|
||||
for _, f := range files {
|
||||
target := filepath.Join(s.Target, f)
|
||||
Info("Removing", target)
|
||||
err := os.Remove(target)
|
||||
if err != nil {
|
||||
Warning("Failed removing", target)
|
||||
}
|
||||
}
|
||||
|
||||
err = s.Database.RemovePackage(p)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "Failed removing package from database")
|
||||
}
|
||||
|
||||
err = s.Database.RemovePackageFiles(p)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "Failed removing package files from database")
|
||||
}
|
||||
Info(p.GetFingerPrint(), "Removed")
|
||||
return nil
|
||||
}
|
||||
|
||||
func (l *LuetInstaller) Uninstall(p pkg.Package, s *System) error {
|
||||
// compute uninstall from all world - remove packages in parallel - run uninstall finalizer (in order) - mark the uninstallation in db
|
||||
// Get installed definition
|
||||
installed, err := s.World()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "Failed generating installed world ")
|
||||
}
|
||||
|
||||
var selected pkg.Package
|
||||
for _, i := range installed {
|
||||
if i.Matches(p) {
|
||||
selected = i
|
||||
}
|
||||
}
|
||||
if selected == nil {
|
||||
return errors.Wrap(err, "Package not installed")
|
||||
}
|
||||
|
||||
solv := solver.NewSolver(installed, installed, pkg.NewInMemoryDatabase(false))
|
||||
solution, err := solv.Uninstall(selected)
|
||||
for _, p := range solution {
|
||||
Info("Uninstalling", p.GetFingerPrint())
|
||||
l.uninstall(p, s)
|
||||
}
|
||||
return nil
|
||||
|
||||
}
|
||||
|
@@ -124,6 +124,18 @@ uri: "`+tmpdir+`"
|
||||
files, err := systemDB.GetPackageFiles(&pkg.DefaultPackage{Name: "b", Category: "test", Version: "1.0"})
|
||||
Expect(files).To(Equal([]string{"artifact42", "test5", "test6"}))
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
|
||||
err = inst.Uninstall(&pkg.DefaultPackage{Name: "b", Category: "test", Version: "1.0"}, system)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
|
||||
// Nothing should be there anymore (files, packagedb entry)
|
||||
Expect(helpers.Exists(filepath.Join(fakeroot, "test5"))).ToNot(BeTrue())
|
||||
Expect(helpers.Exists(filepath.Join(fakeroot, "test6"))).ToNot(BeTrue())
|
||||
|
||||
_, err = systemDB.FindPackage(&pkg.DefaultPackage{Name: "b", Category: "test", Version: "1.0"})
|
||||
Expect(err).To(HaveOccurred())
|
||||
_, err = systemDB.GetPackageFiles(&pkg.DefaultPackage{Name: "b", Category: "test", Version: "1.0"})
|
||||
Expect(err).To(HaveOccurred())
|
||||
})
|
||||
|
||||
})
|
||||
|
@@ -24,7 +24,7 @@ import (
|
||||
|
||||
type Installer interface {
|
||||
Install([]pkg.Package, *System) error
|
||||
Uninstall([]pkg.Package, *System) error
|
||||
Uninstall(pkg.Package, *System) error
|
||||
Repositories([]Repository)
|
||||
}
|
||||
|
||||
|
@@ -35,6 +35,7 @@ type PackageSet interface {
|
||||
FindPackage(Package) (Package, error)
|
||||
UpdatePackage(p Package) error
|
||||
GetAllPackages(packages chan Package) error
|
||||
RemovePackage(Package) error
|
||||
|
||||
GetPackageFiles(Package) ([]string, error)
|
||||
SetPackageFiles(PackageFile) error
|
||||
|
@@ -224,3 +224,16 @@ func (db *BoltDatabase) RemovePackageFiles(p Package) error {
|
||||
}
|
||||
return files.DeleteStruct(&pf)
|
||||
}
|
||||
|
||||
func (db *BoltDatabase) RemovePackage(p Package) error {
|
||||
bolt, err := storm.Open(db.Path, storm.BoltOptions(0600, &bbolt.Options{Timeout: 30 * time.Second}))
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "Error opening boltdb "+db.Path)
|
||||
}
|
||||
defer bolt.Close()
|
||||
p, err = db.FindPackage(p)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "No package found")
|
||||
}
|
||||
return bolt.DeleteStruct(p)
|
||||
}
|
||||
|
@@ -230,3 +230,19 @@ func (db *InMemoryDatabase) RemovePackageFiles(p Package) error {
|
||||
delete(db.FileDatabase, p.GetFingerPrint())
|
||||
return nil
|
||||
}
|
||||
|
||||
func (db *InMemoryDatabase) RemovePackage(p Package) error {
|
||||
for _, k := range db.GetPackages() {
|
||||
pack, err := db.GetPackage(k)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if pack.Matches(p) {
|
||||
db.Lock()
|
||||
delete(db.Database, k)
|
||||
db.Unlock()
|
||||
return nil
|
||||
}
|
||||
}
|
||||
return errors.New("Package not found")
|
||||
}
|
||||
|
Reference in New Issue
Block a user