goldsmith/saver.go
2021-04-25 09:29:53 -07:00

54 lines
1014 B
Go

package goldsmith
import (
"os"
"path/filepath"
"sync"
)
type saver struct {
clean bool
tokens map[string]bool
wg *sync.WaitGroup
}
func (*saver) Name() string {
return "saver"
}
func (saver *saver) Initialize(context *Context) error {
saver.tokens = make(map[string]bool)
context.Threads(1)
return nil
}
func (saver *saver) Process(context *Context, file *File) error {
for token := cleanPath(file.sourcePath); token != "."; token = filepath.Dir(token) {
saver.tokens[token] = true
}
return file.export(context.goldsmith.targetDir)
}
func (saver *saver) Finalize(context *Context) error {
defer saver.wg.Done()
if !saver.clean {
return nil
}
infos := make(chan fileInfo)
go scanDir(context.goldsmith.targetDir, infos)
for info := range infos {
if info.path != context.goldsmith.targetDir {
relPath, _ := filepath.Rel(context.goldsmith.targetDir, info.path)
if contained, _ := saver.tokens[relPath]; !contained {
os.RemoveAll(info.path)
}
}
}
return nil
}