You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
1.5 KiB
63 lines
1.5 KiB
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 |
|
}
|
|
|