2
2
mirror of https://github.com/octoleo/restic.git synced 2024-12-23 11:28:54 +00:00

Merge pull request #3030 from greatroar/concrete-statt

Replace restic.statT interface by concrete types
This commit is contained in:
MichaelEischer 2020-11-14 23:32:17 +01:00 committed by GitHub
commit 6feaf6bd1f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 43 additions and 64 deletions

View File

@ -506,7 +506,7 @@ func (node Node) sameExtendedAttributes(other Node) bool {
return true return true
} }
func (node *Node) fillUser(stat statT) { func (node *Node) fillUser(stat *statT) {
uid, gid := stat.uid(), stat.gid() uid, gid := stat.uid(), stat.gid()
node.UID, node.GID = uid, gid node.UID, node.GID = uid, gid
node.User = lookupUsername(uid) node.User = lookupUsername(uid)
@ -644,24 +644,11 @@ func (node *Node) fillExtendedAttributes(path string) error {
return nil return nil
} }
type statT interface {
dev() uint64
ino() uint64
nlink() uint64
uid() uint32
gid() uint32
rdev() uint64
size() int64
atim() syscall.Timespec
mtim() syscall.Timespec
ctim() syscall.Timespec
}
func mkfifo(path string, mode uint32) (err error) { func mkfifo(path string, mode uint32) (err error) {
return mknod(path, mode|syscall.S_IFIFO, 0) return mknod(path, mode|syscall.S_IFIFO, 0)
} }
func (node *Node) fillTimes(stat statT) { func (node *Node) fillTimes(stat *statT) {
ctim := stat.ctim() ctim := stat.ctim()
atim := stat.atim() atim := stat.atim()
node.ChangeTime = time.Unix(ctim.Unix()) node.ChangeTime = time.Unix(ctim.Unix())

View File

@ -10,6 +10,6 @@ func (node Node) device() int {
return int(node.Device) return int(node.Device)
} }
func (s statUnix) atim() syscall.Timespec { return s.Atimespec } func (s statT) atim() syscall.Timespec { return s.Atimespec }
func (s statUnix) mtim() syscall.Timespec { return s.Mtimespec } func (s statT) mtim() syscall.Timespec { return s.Mtimespec }
func (s statUnix) ctim() syscall.Timespec { return s.Ctimespec } func (s statT) ctim() syscall.Timespec { return s.Ctimespec }

View File

@ -12,6 +12,6 @@ func (node Node) device() uint64 {
return node.Device return node.Device
} }
func (s statUnix) atim() syscall.Timespec { return s.Atimespec } func (s statT) atim() syscall.Timespec { return s.Atimespec }
func (s statUnix) mtim() syscall.Timespec { return s.Mtimespec } func (s statT) mtim() syscall.Timespec { return s.Mtimespec }
func (s statUnix) ctim() syscall.Timespec { return s.Ctimespec } func (s statT) ctim() syscall.Timespec { return s.Ctimespec }

View File

@ -7,7 +7,6 @@ import (
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
"github.com/restic/restic/internal/errors" "github.com/restic/restic/internal/errors"
"github.com/restic/restic/internal/fs" "github.com/restic/restic/internal/fs"
) )
@ -36,6 +35,6 @@ func (node Node) device() int {
return int(node.Device) return int(node.Device)
} }
func (s statUnix) atim() syscall.Timespec { return s.Atim } func (s statT) atim() syscall.Timespec { return s.Atim }
func (s statUnix) mtim() syscall.Timespec { return s.Mtim } func (s statT) mtim() syscall.Timespec { return s.Mtim }
func (s statUnix) ctim() syscall.Timespec { return s.Ctim } func (s statT) ctim() syscall.Timespec { return s.Ctim }

View File

@ -10,9 +10,9 @@ func (node Node) device() int {
return int(node.Device) return int(node.Device)
} }
func (s statUnix) atim() syscall.Timespec { return s.Atimespec } func (s statT) atim() syscall.Timespec { return s.Atimespec }
func (s statUnix) mtim() syscall.Timespec { return s.Mtimespec } func (s statT) mtim() syscall.Timespec { return s.Mtimespec }
func (s statUnix) ctim() syscall.Timespec { return s.Ctimespec } func (s statT) ctim() syscall.Timespec { return s.Ctimespec }
// Getxattr retrieves extended attribute data associated with path. // Getxattr retrieves extended attribute data associated with path.
func Getxattr(path, name string) ([]byte, error) { func Getxattr(path, name string) ([]byte, error) {

View File

@ -10,9 +10,9 @@ func (node Node) device() int {
return int(node.Device) return int(node.Device)
} }
func (s statUnix) atim() syscall.Timespec { return s.Atim } func (s statT) atim() syscall.Timespec { return s.Atim }
func (s statUnix) mtim() syscall.Timespec { return s.Mtim } func (s statT) mtim() syscall.Timespec { return s.Mtim }
func (s statUnix) ctim() syscall.Timespec { return s.Ctim } func (s statT) ctim() syscall.Timespec { return s.Ctim }
// Getxattr retrieves extended attribute data associated with path. // Getxattr retrieves extended attribute data associated with path.
func Getxattr(path, name string) ([]byte, error) { func Getxattr(path, name string) ([]byte, error) {

View File

@ -10,9 +10,9 @@ func (node Node) device() int {
return int(node.Device) return int(node.Device)
} }
func (s statUnix) atim() syscall.Timespec { return s.Atim } func (s statT) atim() syscall.Timespec { return s.Atim }
func (s statUnix) mtim() syscall.Timespec { return s.Mtim } func (s statT) mtim() syscall.Timespec { return s.Mtim }
func (s statUnix) ctim() syscall.Timespec { return s.Ctim } func (s statT) ctim() syscall.Timespec { return s.Ctim }
// Getxattr retrieves extended attribute data associated with path. // Getxattr retrieves extended attribute data associated with path.
func Getxattr(path, name string) ([]byte, error) { func Getxattr(path, name string) ([]byte, error) {

View File

@ -10,23 +10,20 @@ import (
var mknod = syscall.Mknod var mknod = syscall.Mknod
var lchown = os.Lchown var lchown = os.Lchown
type statUnix syscall.Stat_t type statT syscall.Stat_t
func toStatT(i interface{}) (statT, bool) { func toStatT(i interface{}) (*statT, bool) {
if i == nil {
return nil, false
}
s, ok := i.(*syscall.Stat_t) s, ok := i.(*syscall.Stat_t)
if ok && s != nil { if ok && s != nil {
return statUnix(*s), true return (*statT)(s), true
} }
return nil, false return nil, false
} }
func (s statUnix) dev() uint64 { return uint64(s.Dev) } func (s statT) dev() uint64 { return uint64(s.Dev) }
func (s statUnix) ino() uint64 { return uint64(s.Ino) } func (s statT) ino() uint64 { return uint64(s.Ino) }
func (s statUnix) nlink() uint64 { return uint64(s.Nlink) } func (s statT) nlink() uint64 { return uint64(s.Nlink) }
func (s statUnix) uid() uint32 { return uint32(s.Uid) } func (s statT) uid() uint32 { return uint32(s.Uid) }
func (s statUnix) gid() uint32 { return uint32(s.Gid) } func (s statT) gid() uint32 { return uint32(s.Gid) }
func (s statUnix) rdev() uint64 { return uint64(s.Rdev) } func (s statT) rdev() uint64 { return uint64(s.Rdev) }
func (s statUnix) size() int64 { return int64(s.Size) } func (s statT) size() int64 { return int64(s.Size) }

View File

@ -42,40 +42,36 @@ func Setxattr(path, name string, data []byte) error {
return nil return nil
} }
type statWin syscall.Win32FileAttributeData type statT syscall.Win32FileAttributeData
//ToStatT call the Windows system call Win32FileAttributeData. func toStatT(i interface{}) (*statT, bool) {
func toStatT(i interface{}) (statT, bool) {
if i == nil {
return nil, false
}
s, ok := i.(*syscall.Win32FileAttributeData) s, ok := i.(*syscall.Win32FileAttributeData)
if ok && s != nil { if ok && s != nil {
return statWin(*s), true return (*statT)(s), true
} }
return nil, false return nil, false
} }
func (s statWin) dev() uint64 { return 0 } func (s statT) dev() uint64 { return 0 }
func (s statWin) ino() uint64 { return 0 } func (s statT) ino() uint64 { return 0 }
func (s statWin) nlink() uint64 { return 0 } func (s statT) nlink() uint64 { return 0 }
func (s statWin) uid() uint32 { return 0 } func (s statT) uid() uint32 { return 0 }
func (s statWin) gid() uint32 { return 0 } func (s statT) gid() uint32 { return 0 }
func (s statWin) rdev() uint64 { return 0 } func (s statT) rdev() uint64 { return 0 }
func (s statWin) size() int64 { func (s statT) size() int64 {
return int64(s.FileSizeLow) | (int64(s.FileSizeHigh) << 32) return int64(s.FileSizeLow) | (int64(s.FileSizeHigh) << 32)
} }
func (s statWin) atim() syscall.Timespec { func (s statT) atim() syscall.Timespec {
return syscall.NsecToTimespec(s.LastAccessTime.Nanoseconds()) return syscall.NsecToTimespec(s.LastAccessTime.Nanoseconds())
} }
func (s statWin) mtim() syscall.Timespec { func (s statT) mtim() syscall.Timespec {
return syscall.NsecToTimespec(s.LastWriteTime.Nanoseconds()) return syscall.NsecToTimespec(s.LastWriteTime.Nanoseconds())
} }
func (s statWin) ctim() syscall.Timespec { func (s statT) ctim() syscall.Timespec {
// Windows does not have the concept of a "change time" in the sense Unix uses it, so we're using the LastWriteTime here. // Windows does not have the concept of a "change time" in the sense Unix uses it, so we're using the LastWriteTime here.
return syscall.NsecToTimespec(s.LastWriteTime.Nanoseconds()) return syscall.NsecToTimespec(s.LastWriteTime.Nanoseconds())
} }