dive-zfs/filetree/data.go
2018-06-16 19:32:38 -04:00

135 lines
2.1 KiB
Go

package filetree
import (
"archive/tar"
"bytes"
"crypto/md5"
"fmt"
"io"
)
// enum to show whether a file has changed
const (
Unchanged DiffType = iota
Changed
Added
Removed
)
type NodeData struct {
ViewInfo ViewInfo
FileInfo *FileInfo
DiffType DiffType
}
type ViewInfo struct {
Collapsed bool
Hidden bool
}
type FileInfo struct {
Path string
Typeflag byte
MD5sum [16]byte
}
type DiffType int
func NewNodeData() (*NodeData) {
return &NodeData{
ViewInfo: *NewViewInfo(),
FileInfo: nil,
DiffType: Unchanged,
}
}
func (data *NodeData) Copy() (*NodeData) {
return &NodeData{
ViewInfo: *data.ViewInfo.Copy(),
FileInfo: data.FileInfo.Copy(),
DiffType: data.DiffType,
}
}
func NewViewInfo() (view *ViewInfo) {
return &ViewInfo{
Collapsed: false,
Hidden: false,
}
}
func (view *ViewInfo) Copy() (newView *ViewInfo) {
newView = NewViewInfo()
*newView = *view
return newView
}
func NewFileInfo(reader *tar.Reader, header *tar.Header, path string) FileInfo {
if header.Typeflag == tar.TypeDir {
return FileInfo{
Path: path,
Typeflag: header.Typeflag,
MD5sum: [16]byte{},
}
}
fileBytes := make([]byte, header.Size)
_, err := reader.Read(fileBytes)
if err != nil && err != io.EOF {
panic(err)
}
return FileInfo{
Path: path,
Typeflag: header.Typeflag,
MD5sum: md5.Sum(fileBytes),
}
}
func (d DiffType) String() string {
switch d {
case Unchanged:
return "Unchanged"
case Changed:
return "Changed"
case Added:
return "Added"
case Removed:
return "Removed"
default:
return fmt.Sprintf("%d", int(d))
}
}
func (a DiffType) merge(b DiffType) DiffType {
if a == b {
return a
}
return Changed
}
func (data *FileInfo) Copy() *FileInfo {
if data == nil {
return nil
}
return &FileInfo{
Path: data.Path,
Typeflag: data.Typeflag,
MD5sum: data.MD5sum,
}
}
func (data *FileInfo) getDiffType(other *FileInfo) DiffType {
if data == nil && other == nil {
return Unchanged
}
if data == nil || other == nil {
return Changed
}
if data.Typeflag == other.Typeflag {
if bytes.Compare(data.MD5sum[:], other.MD5sum[:]) == 0 {
return Unchanged
}
}
return Changed
}