48dbefc37e
The actual implementation still relies on file paths, but with the abstraction layer in place, an FS implementation can ensure atomic file accesses in the future.
55 lines
1.8 KiB
Go
55 lines
1.8 KiB
Go
package fs
|
|
|
|
import (
|
|
"io"
|
|
"os"
|
|
|
|
"github.com/restic/restic/internal/restic"
|
|
)
|
|
|
|
// FS bundles all methods needed for a file system.
|
|
type FS interface {
|
|
// OpenFile opens a file or directory for reading.
|
|
//
|
|
// If metadataOnly is set, an implementation MUST return a File object for
|
|
// arbitrary file types including symlinks. The implementation may internally use
|
|
// the given file path or a file handle. In particular, an implementation may
|
|
// delay actually accessing the underlying filesystem.
|
|
//
|
|
// Only the O_NOFOLLOW and O_DIRECTORY flags are supported.
|
|
OpenFile(name string, flag int, metadataOnly bool) (File, error)
|
|
Lstat(name string) (os.FileInfo, error)
|
|
DeviceID(fi os.FileInfo) (deviceID uint64, err error)
|
|
ExtendedStat(fi os.FileInfo) ExtendedFileInfo
|
|
|
|
Join(elem ...string) string
|
|
Separator() string
|
|
Abs(path string) (string, error)
|
|
Clean(path string) string
|
|
VolumeName(path string) string
|
|
IsAbs(path string) bool
|
|
|
|
Dir(path string) string
|
|
Base(path string) string
|
|
}
|
|
|
|
// File is an open file on a file system. When opened as metadataOnly, an
|
|
// implementation may opt to perform filesystem operations using the filepath
|
|
// instead of actually opening the file.
|
|
type File interface {
|
|
// MakeReadable reopens a File that was opened metadataOnly for reading.
|
|
// The method must not be called for files that are opened for reading.
|
|
// If possible, the underlying file should be reopened atomically.
|
|
// MakeReadable must work for files and directories.
|
|
MakeReadable() error
|
|
|
|
io.Reader
|
|
io.Closer
|
|
|
|
Readdirnames(n int) ([]string, error)
|
|
Stat() (os.FileInfo, error)
|
|
// ToNode returns a restic.Node for the File. The internally used os.FileInfo
|
|
// must be consistent with that returned by Stat(). In particular, the metadata
|
|
// returned by consecutive calls to Stat() and ToNode() must match.
|
|
ToNode(ignoreXattrListError bool) (*restic.Node, error)
|
|
}
|