forked from TrueCloudLab/restic
55 lines
979 B
Go
55 lines
979 B
Go
package khepri
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io"
|
|
"os"
|
|
"syscall"
|
|
"time"
|
|
)
|
|
|
|
type Tree struct {
|
|
Nodes []Node `json:"nodes"`
|
|
}
|
|
|
|
type Node struct {
|
|
Name string `json:"name"`
|
|
Mode os.FileMode `json:"mode"`
|
|
ModTime time.Time `json:"mtime"`
|
|
AccessTime time.Time `json:"atime"`
|
|
User uint32 `json:"user"`
|
|
Group uint32 `json:"group"`
|
|
Content ID `json:"content,omitempty"`
|
|
}
|
|
|
|
func NewTree() *Tree {
|
|
return &Tree{
|
|
Nodes: []Node{},
|
|
}
|
|
}
|
|
|
|
func (t *Tree) Restore(r io.Reader) error {
|
|
dec := json.NewDecoder(r)
|
|
return dec.Decode(t)
|
|
}
|
|
|
|
func (t *Tree) Save(w io.Writer) error {
|
|
enc := json.NewEncoder(w)
|
|
return enc.Encode(t)
|
|
}
|
|
|
|
func NodeFromFileInfo(fi os.FileInfo) Node {
|
|
node := Node{
|
|
Name: fi.Name(),
|
|
Mode: fi.Mode(),
|
|
ModTime: fi.ModTime(),
|
|
}
|
|
|
|
if stat, ok := fi.Sys().(*syscall.Stat_t); ok {
|
|
node.User = stat.Uid
|
|
node.Group = stat.Gid
|
|
node.AccessTime = time.Unix(stat.Atim.Unix())
|
|
}
|
|
|
|
return node
|
|
}
|