github.com/Cloud-Foundations/Dominator@v0.3.4/lib/objectcache/walk.go (about) 1 package objectcache 2 3 import ( 4 "os" 5 "path" 6 "sort" 7 ) 8 9 func validatePath(fileName string) bool { 10 for _, char := range fileName { 11 if (char >= '0' && char <= '9') || (char >= 'a' && char <= 'f') { 12 continue 13 } 14 return false 15 } 16 return true 17 } 18 19 func addCacheEntry(fileName string, cache ObjectCache) (ObjectCache, error) { 20 hash, err := filenameToHash(fileName) 21 if err != nil { 22 return nil, err 23 } 24 return append(cache, hash), nil 25 } 26 27 func scanObjectCache(cacheDirectoryName string, subpath string, 28 cache ObjectCache) (ObjectCache, error) { 29 myPathName := path.Join(cacheDirectoryName, subpath) 30 file, err := os.Open(myPathName) 31 if err != nil { 32 return nil, err 33 } 34 names, err := file.Readdirnames(-1) 35 file.Close() 36 if err != nil { 37 return nil, err 38 } 39 sort.Strings(names) 40 for _, name := range names { 41 lastChar := name[len(name)-1] 42 if lastChar == '~' || lastChar == '^' { 43 continue 44 } 45 pathname := path.Join(myPathName, name) 46 if !validatePath(name) { 47 if err := os.RemoveAll(pathname); err != nil { 48 return nil, err 49 } 50 continue 51 } 52 fi, err := os.Lstat(pathname) 53 if err != nil { 54 continue 55 } 56 filename := path.Join(subpath, name) 57 if fi.IsDir() { 58 cache, err = scanObjectCache(cacheDirectoryName, filename, cache) 59 if err != nil { 60 return nil, err 61 } 62 } else { 63 cache, err = addCacheEntry(filename, cache) 64 if err != nil { 65 return nil, err 66 } 67 } 68 } 69 return cache, nil 70 }