From 4e6ebebdba633645968f2fe91c3eb4029ff5bae3 Mon Sep 17 00:00:00 2001 From: zzjin Date: Thu, 26 Aug 2021 17:35:07 +0800 Subject: [PATCH] update prune: 1. comment danger files like `images`, `asserts` for some package use it as script folder 2. add func to remove all empty dirs for production. --- go.mod | 1 + go.sum | 2 ++ internal/prune/prune.go | 44 ++++++++++++++++++++++++++++++++++++++--- 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c326823..4d05533 100644 --- a/go.mod +++ b/go.mod @@ -5,4 +5,5 @@ go 1.13 require ( github.com/apex/log v1.1.1 github.com/dustin/go-humanize v1.0.0 + github.com/karrick/godirwalk v1.16.1 ) diff --git a/go.sum b/go.sum index 04d026e..ccb466e 100644 --- a/go.sum +++ b/go.sum @@ -17,6 +17,8 @@ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= +github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw= +github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= diff --git a/internal/prune/prune.go b/internal/prune/prune.go index ed14775..0149855 100644 --- a/internal/prune/prune.go +++ b/internal/prune/prune.go @@ -9,6 +9,7 @@ import ( "sync/atomic" "github.com/apex/log" + "github.com/karrick/godirwalk" ) // DefaultFiles pruned. @@ -97,14 +98,17 @@ var DefaultDirectories = []string{ ".idea", ".vscode", "website", - "images", - "assets", + // "images", + // "assets", "example", "examples", "coverage", ".nyc_output", ".circleci", ".github", + "man", + // "features", + ".git", } // DefaultExtensions pruned. @@ -209,7 +213,6 @@ func (p *Pruner) Prune() (*Stats, error) { var stats Stats p.startN(runtime.NumCPU()) - defer p.stop() err := filepath.Walk(p.dir, func(path string, info os.FileInfo, err error) error { if err != nil { @@ -261,6 +264,41 @@ func (p *Pruner) Prune() (*Stats, error) { return nil }) + p.stop() + + if err != nil { + return &stats, err + } + + err = godirwalk.Walk(p.dir, &godirwalk.Options{ + Unsorted: true, + Callback: func(_ string, _ *godirwalk.Dirent) error { return nil }, + PostChildrenCallback: func(osPathname string, _ *godirwalk.Dirent) error { + s, err := godirwalk.NewScanner(osPathname) + if err != nil { + return err + } + + hasAtLeastOneChild := s.Scan() + if err := s.Err(); err != nil { + return err + } + + if hasAtLeastOneChild { + return nil // do not remove directory with at least one child + } + if osPathname == p.dir { + return nil // do not remove directory that was provided top-level directory + } + + err = os.Remove(osPathname) + if err == nil { + stats.FilesRemoved++ + } + return err + }, + }) + return &stats, err }