fix: populate ctime from platform-specific syscall data
All checks were successful
check / check (pull_request) Successful in 4m19s

The scanner was setting CTime to info.ModTime() as a placeholder since
afero's FileInfo interface doesn't expose ctime directly. This change
extracts the actual ctime from the underlying syscall.Stat_t via
platform-specific build files:

- macOS (Darwin): uses Birthtimespec (file creation/birth time)
- Linux: uses Ctim (inode change time)
- Other platforms: falls back to mtime

Also adds:
- Documentation of ctime semantics in README.md (new 'file metadata' section)
- Platform differences table (macOS birth time vs Linux inode change time)
- Note that ctime is recorded but not restored (not settable via standard APIs)
- Updated README schema to match actual schema (adds ctime, source_path, link_target)
- Doc comment on CTime field in database model

closes #13
This commit is contained in:
user
2026-03-17 13:47:54 -07:00
parent c24e7e6360
commit a53203d60d
6 changed files with 116 additions and 3 deletions

View File

@@ -17,6 +17,10 @@ type File struct {
Path types.FilePath // Absolute path of the file
SourcePath types.SourcePath // The source directory this file came from (for restore path stripping)
MTime time.Time
// CTime is the file creation/change time. On macOS this is the birth time
// (when the file was created). On Linux this is the inode change time
// (updated on metadata or content changes). See ctime_darwin.go and
// ctime_linux.go in the snapshot package for extraction details.
CTime time.Time
Size int64
Mode uint32