This commit is contained in:
lordwelch 2018-06-24 17:18:00 -07:00
commit 9469379b80
2 changed files with 106 additions and 0 deletions

57
cmd/main.go Normal file
View File

@ -0,0 +1,57 @@
package main
import (
"fmt"
"io"
"os"
"path/filepath"
"strings"
"timmy.narnian.us/git/timmy/sanitize"
)
func main() {
var previousDir string = "./"
filepath.Walk("./", func(path string, info os.FileInfo, err error) error {
fmt.Printf("%s >>>>> %s\t%t\n", previousDir, path, strings.HasPrefix(path, previousDir) || previousDir == ".")
defer func() { previousDir = filepath.Dir(path) }()
if err != nil {
println(err)
}
if info.IsDir() && !DirIsEmpty(path) {
return nil
}
newpath := sanitize.SanitizeFilepath(filepath.Dir(path))
filename := sanitize.SanitizeFilename(info.Name())
if path != filepath.Join(newpath, filename) {
fmt.Println(path, "->", filepath.Join(newpath, filename))
os.MkdirAll(newpath, os.ModePerm)
os.Rename(path, filepath.Join(newpath, info.Name()))
}
if !(strings.HasPrefix(path, previousDir) || previousDir == "./") {
rmpath := previousDir
for len(rmpath) > 1 {
fmt.Println("rmdir", rmpath)
fmt.Println(rmpath, os.Remove(rmpath))
rmpath = filepath.Dir(rmpath)
}
}
return nil
})
fmt.Println(previousDir)
}
// also returns false if os.Open fails
func DirIsEmpty(path string) bool {
file, err := os.Open(path)
if err != nil {
return false
}
if _, err = file.Readdirnames(1); err == io.EOF {
return true
}
return false
}

49
san.go Normal file
View File

@ -0,0 +1,49 @@
package sanitize
import (
"path/filepath"
"strings"
)
const BadFilenameChars = "\n\t\r=*?:[]\"<>|(){}&'!;$`\\"
//assumes unicode
func SanitizeFilename(filename string) string {
filename = strings.Map(func(r rune) rune {
if r < 32 || (r > 126 && r < 160) || strings.ContainsRune(BadFilenameChars, r) {
return -1
}
return r
}, filename)
filename = strings.TrimSpace(filename)
filename = strings.TrimLeft(filename, " -~")
filename = strings.TrimSpace(filename)
filename = strings.Replace(filename, " ", "_", -1)
filename = strings.Replace(filename, "_-_", "", -1)
var (
st strings.Builder
prev rune
)
st.Grow(len(filename))
for _, r := range filename {
switch r {
case '_':
if r != prev {
st.WriteRune(r)
}
default:
st.WriteRune(r)
}
prev = r
}
return st.String()
}
func SanitizeFilepath(path string) string {
var newpath string
for _, filename := range strings.Split(filepath.Clean(path), string(filepath.Separator)) {
newpath = filepath.Join(newpath, SanitizeFilename(filename))
}
return newpath
}