experimental/fs_storage.go (86 lines of code) (raw):

package experimental import ( "io/ioutil" "os" "path/filepath" "strings" ) type fsStorage struct { *distributionStorageFilesystem } func (f *fsStorage) fullPath(path string) string { return filepath.Join(f.RootDirectory, "docker", "registry", "v2", path) } func (f *fsStorage) backupPath(path string) string { return filepath.Join(f.RootDirectory, "docker-backup", "registry", "v2", path) } func (f *fsStorage) Walk(rootDir string, baseDir string, fn walkFunc) error { rootDir, err := filepath.Abs(f.fullPath(rootDir)) if err != nil { return nil } rootDir += "/" baseDir, err = filepath.Abs(f.fullPath(baseDir)) if err != nil { return nil } baseDir += "/" return filepath.Walk(rootDir, func(fullPath string, info os.FileInfo, err error) error { if info.IsDir() { return nil } path := fullPath if strings.HasPrefix(path, baseDir) { path = path[len(baseDir):] } if path == "" { return nil } fi := fileInfo{fullPath: fullPath, size: info.Size()} return fn(path, fi, err) }) } func (f *fsStorage) List(rootDir string, fn walkFunc) error { rootDir, err := filepath.Abs(f.fullPath(rootDir)) if err != nil { return nil } rootDir += "/" return filepath.Walk(rootDir, func(fullPath string, info os.FileInfo, err error) error { path := fullPath if strings.HasPrefix(path, rootDir) { path = path[len(rootDir):] } if path == "" { return nil } fi := fileInfo{fullPath: fullPath, size: info.Size(), directory: info.IsDir()} if info.IsDir() { err = fn(path, fi, err) if err != nil { return err } return filepath.SkipDir } else { fi := fileInfo{fullPath: fullPath, size: info.Size()} return fn(path, fi, err) } }) } func (f *fsStorage) Read(path string, etag string) ([]byte, error) { return ioutil.ReadFile(f.fullPath(path)) } func (f *fsStorage) Delete(path string) error { return os.Remove(f.fullPath(path)) } func (f *fsStorage) Move(path, newPath string) error { path = f.fullPath(path) newPath = f.backupPath(newPath) os.MkdirAll(filepath.Dir(newPath), 0700) return os.Rename(path, newPath) } func (f *fsStorage) Info() { } func newFilesystemStorage(config *distributionStorageFilesystem) (storageObject, error) { return &fsStorage{config}, nil }