local: when using -l
fix setting modification times of symlinks #1152
Before this change it was setting the modification times of the things that the symlinks pointed to. Note that this is only implemented for unix style OSes. Other OSes will not attempt to set the modification time of a symlink.
This commit is contained in:
parent
23e06cedbd
commit
52763e1918
3 changed files with 54 additions and 1 deletions
20
backend/local/lchtimes.go
Normal file
20
backend/local/lchtimes.go
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
// +build windows plan9
|
||||||
|
|
||||||
|
package local
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
const haveLChtimes = false
|
||||||
|
|
||||||
|
// lChtimes changes the access and modification times of the named
|
||||||
|
// link, similar to the Unix utime() or utimes() functions.
|
||||||
|
//
|
||||||
|
// The underlying filesystem may truncate or round the values to a
|
||||||
|
// less precise time unit.
|
||||||
|
// If there is an error, it will be of type *PathError.
|
||||||
|
func lChtimes(name string, atime time.Time, mtime time.Time) error {
|
||||||
|
// Does nothing
|
||||||
|
return nil
|
||||||
|
}
|
28
backend/local/lchtimes_unix.go
Normal file
28
backend/local/lchtimes_unix.go
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
// +build !windows,!plan9
|
||||||
|
|
||||||
|
package local
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"golang.org/x/sys/unix"
|
||||||
|
)
|
||||||
|
|
||||||
|
const haveLChtimes = true
|
||||||
|
|
||||||
|
// lChtimes changes the access and modification times of the named
|
||||||
|
// link, similar to the Unix utime() or utimes() functions.
|
||||||
|
//
|
||||||
|
// The underlying filesystem may truncate or round the values to a
|
||||||
|
// less precise time unit.
|
||||||
|
// If there is an error, it will be of type *PathError.
|
||||||
|
func lChtimes(name string, atime time.Time, mtime time.Time) error {
|
||||||
|
var utimes [2]unix.Timespec
|
||||||
|
utimes[0] = unix.NsecToTimespec(atime.UnixNano())
|
||||||
|
utimes[1] = unix.NsecToTimespec(mtime.UnixNano())
|
||||||
|
if e := unix.UtimesNanoAt(unix.AT_FDCWD, name, utimes[0:], unix.AT_SYMLINK_NOFOLLOW); e != nil {
|
||||||
|
return &os.PathError{Op: "lchtimes", Path: name, Err: e}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -744,7 +744,12 @@ func (o *Object) ModTime() time.Time {
|
||||||
|
|
||||||
// SetModTime sets the modification time of the local fs object
|
// SetModTime sets the modification time of the local fs object
|
||||||
func (o *Object) SetModTime(modTime time.Time) error {
|
func (o *Object) SetModTime(modTime time.Time) error {
|
||||||
err := os.Chtimes(o.path, modTime, modTime)
|
var err error
|
||||||
|
if o.translatedLink {
|
||||||
|
err = lChtimes(o.path, modTime, modTime)
|
||||||
|
} else {
|
||||||
|
err = os.Chtimes(o.path, modTime, modTime)
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue