64 lines
1.5 KiB
Go
64 lines
1.5 KiB
Go
package file
|
|
|
|
import (
|
|
"time"
|
|
"os"
|
|
"fmt"
|
|
"path/filepath"
|
|
"syscall"
|
|
)
|
|
|
|
type State struct {
|
|
Source string `json:"source"`
|
|
Offset int64 `json:"offset"`
|
|
Inode uint64 `json:"inode"`
|
|
Fileinfo os.FileInfo `json:"-"` // the file info
|
|
Timestamp time.Time `json:"timestamp"`
|
|
Finished bool `json:"finished"`
|
|
Meta map[string]string `json:"meta"`
|
|
TTL time.Duration `json:"ttl"`
|
|
}
|
|
|
|
// NewState creates a new file state
|
|
func NewState(fileInfo os.FileInfo, path string) State {
|
|
stat := fileInfo.Sys().(*syscall.Stat_t)
|
|
return State{
|
|
Fileinfo: fileInfo,
|
|
Inode: stat.Ino,
|
|
Source: path,
|
|
Finished: false,
|
|
Timestamp: time.Now(),
|
|
TTL: -1, // By default, state does have an infinite ttl
|
|
Meta: nil,
|
|
}
|
|
}
|
|
|
|
func (s *State) ID() uint64 {
|
|
return s.Inode
|
|
}
|
|
|
|
// IsEqual compares the state to an other state supporting stringer based on the unique string
|
|
func (s *State) IsEqual(c *State) bool {
|
|
return s.ID() == c.ID()
|
|
}
|
|
|
|
// IsEmpty returns true if the state is empty
|
|
func (s *State) IsEmpty() bool {
|
|
return s.Inode == 0 &&
|
|
s.Source == "" &&
|
|
len(s.Meta) == 0 &&
|
|
s.Timestamp.IsZero()
|
|
}
|
|
|
|
func getFileState(path string, info os.FileInfo) (State, error) {
|
|
var err error
|
|
var absolutePath string
|
|
absolutePath, err = filepath.Abs(path)
|
|
if err != nil {
|
|
return State{}, fmt.Errorf("could not fetch abs path for file %s: %s", absolutePath, err)
|
|
}
|
|
// Create new state for comparison
|
|
newState := NewState(info, absolutePath)
|
|
return newState, nil
|
|
}
|