diff --git a/internal/fs/file.go b/internal/fs/file.go index 3c153e2..eba5752 100644 --- a/internal/fs/file.go +++ b/internal/fs/file.go @@ -121,11 +121,22 @@ func (f *File) syncWithoutLocking() error { return config.FileConfig{}, err } + // Some OSes like i.e. Windows don't support numeric GIDs and UIDs, so use 0 instead + gid := 0 + uid := 0 + sys, ok := f.info.Sys().(*Stat) + if ok { + gid = int(sys.Gid) + uid = int(sys.Uid) + } + f.info = NewFileInfo( f.info.Name(), size, f.info.Mode(), f.info.ModTime(), + gid, + uid, f.info.IsDir(), f.log, ) diff --git a/internal/fs/file_non_unix.go b/internal/fs/file_non_unix.go new file mode 100644 index 0000000..de18407 --- /dev/null +++ b/internal/fs/file_non_unix.go @@ -0,0 +1,8 @@ +//go:build windows + +package fs + +type Stat struct { + Uid uint32 + Gid uint32 +} diff --git a/internal/fs/file_unix.go b/internal/fs/file_unix.go new file mode 100644 index 0000000..9ec31e9 --- /dev/null +++ b/internal/fs/file_unix.go @@ -0,0 +1,7 @@ +//go:build !windows + +package fs + +import "syscall" + +type Stat syscall.Stat_t diff --git a/internal/fs/fileinfo.go b/internal/fs/fileinfo.go index 1db9780..26fbc0c 100644 --- a/internal/fs/fileinfo.go +++ b/internal/fs/fileinfo.go @@ -16,6 +16,8 @@ type FileInfo struct { size int64 mode fs.FileMode modTime time.Time + gid int + uid int isDir bool log logging.StructuredLogger @@ -26,6 +28,8 @@ func NewFileInfo( size int64, mode fs.FileMode, modTime time.Time, + gid int, + uid int, isDir bool, log logging.StructuredLogger, @@ -35,6 +39,8 @@ func NewFileInfo( size: size, mode: mode, modTime: modTime, + gid: gid, + uid: uid, isDir: isDir, log: log, @@ -51,6 +57,8 @@ func NewFileInfoFromTarHeader( size: hdr.FileInfo().Size(), mode: hdr.FileInfo().Mode(), modTime: hdr.FileInfo().ModTime(), + gid: hdr.Gid, + uid: hdr.Uid, isDir: hdr.FileInfo().IsDir(), log: log, @@ -102,5 +110,8 @@ func (f *FileInfo) Sys() interface{} { "name": f.name, }) - return nil + return &Stat{ + Uid: uint32(f.uid), + Gid: uint32(f.gid), + } }