From 6a1b64aceada3e99f8c72b481f91de8001a773c8 Mon Sep 17 00:00:00 2001 From: Ettore Di Giacinto Date: Sun, 8 Nov 2020 12:36:41 +0100 Subject: [PATCH] Order files before uninstall Fixes #149 --- pkg/helpers/file.go | 31 +++++++++++++++++++++++++++++++ pkg/helpers/file_test.go | 33 +++++++++++++++++++++++++++++++++ pkg/installer/installer.go | 27 ++++++++++++++++++++------- 3 files changed, 84 insertions(+), 7 deletions(-) diff --git a/pkg/helpers/file.go b/pkg/helpers/file.go index e5db6b4f..1d4a268f 100644 --- a/pkg/helpers/file.go +++ b/pkg/helpers/file.go @@ -24,6 +24,37 @@ import ( copy "github.com/otiai10/copy" ) +func OrderFiles(target string, files []string) ([]string, []string) { + + var newFiles []string + var notPresent []string + + for _, f := range files { + target := filepath.Join(target, f) + fi, err := os.Lstat(target) + if err != nil { + notPresent = append(notPresent, f) + continue + } + if m := fi.Mode(); !m.IsDir() { + newFiles = append(newFiles, f) + } + } + + for _, f := range files { + target := filepath.Join(target, f) + fi, err := os.Lstat(target) + if err != nil { + continue + } + if m := fi.Mode(); m.IsDir() { + newFiles = append(newFiles, f) + } + } + + return newFiles, notPresent +} + func ListDir(dir string) ([]string, error) { content := []string{} diff --git a/pkg/helpers/file_test.go b/pkg/helpers/file_test.go index 2fc405e2..a691a387 100644 --- a/pkg/helpers/file_test.go +++ b/pkg/helpers/file_test.go @@ -16,6 +16,10 @@ package helpers_test import ( + "io/ioutil" + "os" + "path/filepath" + . "github.com/mudler/luet/pkg/helpers" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" @@ -28,4 +32,33 @@ var _ = Describe("Helpers", func() { Expect(Exists("../../tests/fixtures/buildtree/app-admin/enman/1.4.0/build.yaml.not.exists")).To(BeFalse()) }) }) + + Context("Orders dir and files correctly", func() { + It("puts files first and folders at end", func() { + testDir, err := ioutil.TempDir(os.TempDir(), "test") + Expect(err).ToNot(HaveOccurred()) + defer os.RemoveAll(testDir) + + err = ioutil.WriteFile(filepath.Join(testDir, "foo"), []byte("test\n"), 0644) + Expect(err).ToNot(HaveOccurred()) + + err = ioutil.WriteFile(filepath.Join(testDir, "baz"), []byte("test\n"), 0644) + Expect(err).ToNot(HaveOccurred()) + + err = os.MkdirAll(filepath.Join(testDir, "bar"), 0755) + Expect(err).ToNot(HaveOccurred()) + err = ioutil.WriteFile(filepath.Join(testDir, "bar", "foo"), []byte("test\n"), 0644) + Expect(err).ToNot(HaveOccurred()) + + err = os.MkdirAll(filepath.Join(testDir, "baz2"), 0755) + Expect(err).ToNot(HaveOccurred()) + err = ioutil.WriteFile(filepath.Join(testDir, "baz2", "foo"), []byte("test\n"), 0644) + Expect(err).ToNot(HaveOccurred()) + + ordered, notExisting := OrderFiles(testDir, []string{"bar", "baz", "bar/foo", "baz2", "foo", "baz2/foo", "notexisting"}) + + Expect(ordered).To(Equal([]string{"baz", "bar/foo", "foo", "baz2/foo", "bar", "baz2"})) + Expect(notExisting).To(Equal([]string{"notexisting"})) + }) + }) }) diff --git a/pkg/installer/installer.go b/pkg/installer/installer.go index 2b1d8847..bcc5bc18 100644 --- a/pkg/installer/installer.go +++ b/pkg/installer/installer.go @@ -631,8 +631,10 @@ func (l *LuetInstaller) uninstall(p pkg.Package, s *System) error { cp.Map(files) } + toRemove, notPresent := helpers.OrderFiles(s.Target, files) + // Remove from target - for _, f := range files { + for _, f := range toRemove { target := filepath.Join(s.Target, f) if !config.LuetCfg.ConfigProtectSkip && cp.Protected(f) { @@ -650,10 +652,7 @@ func (l *LuetInstaller) uninstall(p pkg.Package, s *System) error { fi, err := os.Lstat(target) if err != nil { - Warning("File not present in the system target ?", target, err.Error()) - if err = os.Remove(target); err != nil { - Warning("Failed removing file", target, err.Error()) - } + Warning("File not found (it was before?) ", err.Error()) continue } switch mode := fi.Mode(); { @@ -663,15 +662,29 @@ func (l *LuetInstaller) uninstall(p pkg.Package, s *System) error { Warning("Failed reading folder", target, err.Error()) } if len(files) != 0 { - Warning("Preserving not-empty folder", target) + Debug("Preserving not-empty folder", target) continue } } if err = os.Remove(target); err != nil { - Warning("Failed removing file (not present in the system target ?)", target, err.Error()) + Warning("Failed removing file (maybe not present in the system target anymore ?)", target, err.Error()) } } + + for _, f := range notPresent { + target := filepath.Join(s.Target, f) + + if !config.LuetCfg.ConfigProtectSkip && cp.Protected(f) { + Debug("Preserving protected file:", f) + continue + } + + if err = os.Remove(target); err != nil { + Debug("Failed removing file (not present in the system target)", target, err.Error()) + } + } + err = s.Database.RemovePackageFiles(p) if err != nil { return errors.Wrap(err, "Failed removing package files from database")