diff options
| author | Shulhan <ms@kilabit.info> | 2018-05-26 20:31:05 +0700 |
|---|---|---|
| committer | Shulhan <ms@kilabit.info> | 2018-05-27 02:12:39 +0700 |
| commit | f39c1b5787f5408c8720b2b80f9208d86e2d8e00 (patch) | |
| tree | e0c9e4e2639aa438ccd12e48e3736178039ebcfb | |
| parent | 78690021d83ed5e4ca9dac0eb37da730faf5df22 (diff) | |
| download | beku-f39c1b5787f5408c8720b2b80f9208d86e2d8e00.tar.xz | |
env.Remove: remove empty directory recursively on "src" and "pkg"
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | common.go | 27 | ||||
| -rw-r--r-- | common_test.go | 88 | ||||
| -rw-r--r-- | env.go | 2 | ||||
| -rw-r--r-- | package.go | 2 |
5 files changed, 120 insertions, 0 deletions
@@ -1,4 +1,5 @@ /testdata/beku.db.save +/testdata/a/b/file /beku.test /cover.html /cover.out @@ -10,6 +10,7 @@ import ( "fmt" "io" "os" + "path/filepath" "strings" ) @@ -72,6 +73,32 @@ func IsTagVersion(version string) bool { } // +// RmdirEmptyAll remove directory in path if it's empty until one of the +// parent is not empty. +// +func RmdirEmptyAll(path string) error { + if len(path) == 0 { + return nil + } + fi, err := os.Stat(path) + if err != nil { + return RmdirEmptyAll(filepath.Dir(path)) + } + if !fi.IsDir() { + return nil + } + if !IsDirEmpty(path) { + return nil + } + err = os.Remove(path) + if err != nil { + return err + } + + return RmdirEmptyAll(filepath.Dir(path)) +} + +// // confirm display a question to standard output and read for answer // from "in" for simple "y" or "n" answer. // If "in" is nil, it will set to standard input. diff --git a/common_test.go b/common_test.go index 7cdf9dc..5080a37 100644 --- a/common_test.go +++ b/common_test.go @@ -3,12 +3,19 @@ package beku import ( "io" "io/ioutil" + "os" "testing" "github.com/shuLhan/share/lib/test" ) func TestIsDirEmpty(t *testing.T) { + emptyDir := "testdata/dirempty" + err := os.MkdirAll(emptyDir, 0700) + if err != nil { + t.Fatal(err) + } + cases := []struct { desc string path string @@ -117,6 +124,87 @@ func TestIsTagVersion(t *testing.T) { } } +func TestRmdirEmptyAll(t *testing.T) { + cases := []struct { + desc string + createDir string + createFile string + path string + expExist string + expNotExist string + }{{ + desc: "With path as file", + path: "testdata/beku.db", + expExist: "testdata/beku.db", + }, { + desc: "With empty path", + createDir: "testdata/a/b/c/d", + expExist: "testdata/a/b/c/d", + }, { + desc: "With non empty at middle", + createDir: "testdata/a/b/c/d", + createFile: "testdata/a/b/file", + path: "testdata/a/b/c/d", + expExist: "testdata/a/b/file", + expNotExist: "testdata/a/b/c", + }, { + desc: "With first path not exist", + createDir: "testdata/a/b/c", + path: "testdata/a/b/c/d", + expExist: "testdata/a/b/file", + expNotExist: "testdata/a/b/c", + }, { + desc: "With non empty at parent", + createDir: "testdata/dirempty/a/b/c/d", + path: "testdata/dirempty/a/b/c/d", + expExist: "testdata", + expNotExist: "testdata/dirempty", + }} + + var ( + err error + f *os.File + ) + for _, c := range cases { + t.Log(c.desc) + + if len(c.createDir) > 0 { + err = os.MkdirAll(c.createDir, 0700) + if err != nil { + t.Fatal(err) + } + } + if len(c.createFile) > 0 { + f, err = os.Create(c.createFile) + if err != nil { + t.Fatal(err) + } + err = f.Close() + if err != nil { + t.Fatal(err) + } + } + + err = RmdirEmptyAll(c.path) + if err != nil { + t.Fatal(err) + } + + if len(c.expExist) > 0 { + _, err = os.Stat(c.expExist) + if err != nil { + t.Fatal(err) + } + } + if len(c.expNotExist) > 0 { + _, err = os.Stat(c.expNotExist) + if !os.IsNotExist(err) { + t.Fatal(err) + } + } + } +} + func TestConfirm(t *testing.T) { cases := []struct { defIsYes bool @@ -462,6 +462,8 @@ This package is required by, err = fmt.Errorf("Remove: %s", err) return } + + _ = RmdirEmptyAll(pkgImportPath) } return @@ -174,6 +174,8 @@ func (pkg *Package) Remove() (err error) { return } + _ = RmdirEmptyAll(pkg.FullPath) + return } |
