aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2018-05-26 20:31:05 +0700
committerShulhan <ms@kilabit.info>2018-05-27 02:12:39 +0700
commitf39c1b5787f5408c8720b2b80f9208d86e2d8e00 (patch)
treee0c9e4e2639aa438ccd12e48e3736178039ebcfb
parent78690021d83ed5e4ca9dac0eb37da730faf5df22 (diff)
downloadbeku-f39c1b5787f5408c8720b2b80f9208d86e2d8e00.tar.xz
env.Remove: remove empty directory recursively on "src" and "pkg"
-rw-r--r--.gitignore1
-rw-r--r--common.go27
-rw-r--r--common_test.go88
-rw-r--r--env.go2
-rw-r--r--package.go2
5 files changed, 120 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index cf1636e..2b19e93 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
/testdata/beku.db.save
+/testdata/a/b/file
/beku.test
/cover.html
/cover.out
diff --git a/common.go b/common.go
index c4015c4..3630699 100644
--- a/common.go
+++ b/common.go
@@ -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
diff --git a/env.go b/env.go
index 927b513..5147a28 100644
--- a/env.go
+++ b/env.go
@@ -462,6 +462,8 @@ This package is required by,
err = fmt.Errorf("Remove: %s", err)
return
}
+
+ _ = RmdirEmptyAll(pkgImportPath)
}
return
diff --git a/package.go b/package.go
index a17c145..f8a9d65 100644
--- a/package.go
+++ b/package.go
@@ -174,6 +174,8 @@ func (pkg *Package) Remove() (err error) {
return
}
+ _ = RmdirEmptyAll(pkg.FullPath)
+
return
}