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  }