blob: a88cdf3fe495e7331f58bd527e3023847f307873 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package pkgfs
import (
"path/filepath"
"strings"
"thinfs/fs"
"time"
)
// versionsDirectory lists packages by merkleroot and enables opening packages
// by merkleroot.
type versionsDirectory struct {
unsupportedDirectory
fs *Filesystem
}
func (d *versionsDirectory) Dup() (fs.Directory, error) {
return d, nil
}
func (d *versionsDirectory) Close() error { return nil }
func (d *versionsDirectory) Open(name string, flags fs.OpenFlags) (fs.File, fs.Directory, *fs.Remote, error) {
name = clean(name)
debugLog("pkgfs:versionsDirectory:open %q", name)
if name == "" {
return nil, d, nil, nil
}
parts := strings.Split(name, "/")
if !merklePat.MatchString(parts[0]) {
return nil, nil, nil, fs.ErrNotFound
}
found := false
roots := d.fs.index.PackageBlobs()
for _, root := range roots {
if root == parts[0] {
found = true
break
}
}
if !found {
return nil, nil, nil, fs.ErrNotFound
}
pd, err := newPackageDirFromBlob(parts[0], d.fs)
if err != nil {
return nil, nil, nil, err
}
if len(parts) > 1 {
return pd.Open(filepath.Join(parts[1:]...), flags)
}
if flags.Create() || flags.Truncate() || flags.Write() || flags.Append() || flags.File() {
return nil, nil, nil, fs.ErrNotSupported
}
return nil, pd, nil, nil
}
func (d *versionsDirectory) Read() ([]fs.Dirent, error) {
roots := d.fs.index.PackageBlobs()
dents := make([]fs.Dirent, 0, len(roots))
for _, m := range roots {
dents = append(dents, fileDirEnt(m))
}
return dents, nil
}
func (d *versionsDirectory) Stat() (int64, time.Time, time.Time, error) {
return 0, d.fs.mountTime, d.fs.mountTime, nil
}